paint-brush
Πώς να μετατρέψετε βίντεο σε HLS για ροή ιστού και κινητών με το AWS Elemental MediaConvertμε@andrei9735
195 αναγνώσεις

Πώς να μετατρέψετε βίντεο σε HLS για ροή ιστού και κινητών με το AWS Elemental MediaConvert

με Andrey O.12m2024/10/06
Read on Terminal Reader

Πολύ μακρύ; Να διαβασω

Είτε αναπτύσσετε μια πλατφόρμα ροής, μια διαδικτυακή πύλη εκμάθησης ή οποιαδήποτε εφαρμογή που απαιτεί αναπαραγωγή βίντεο, η απρόσκοπτη ροή βίντεο είναι απαραίτητη.
featured image - Πώς να μετατρέψετε βίντεο σε HLS για ροή ιστού και κινητών με το AWS Elemental MediaConvert
Andrey O. HackerNoon profile picture

Στο σημερινό ψηφιακό τοπίο, η παροχή περιεχομένου βίντεο υψηλής ποιότητας σε διάφορες συσκευές και συνθήκες δικτύου είναι πιο σημαντική από ποτέ. Είτε αναπτύσσετε μια πλατφόρμα ροής, μια διαδικτυακή πύλη εκμάθησης, μια εφαρμογή κοινωνικών μέσων ή οποιαδήποτε εφαρμογή που απαιτεί αναπαραγωγή βίντεο, η απρόσκοπτη ροή βίντεο είναι απαραίτητη για μια βέλτιστη εμπειρία χρήστη.


Η αυτοματοποίηση της μετατροπής βίντεο χρησιμοποιώντας μια υπηρεσία κωδικοποίησης που βασίζεται σε σύννεφο σάς επιτρέπει να δημιουργείτε εύκολα προσαρμοστικές ροές, διασφαλίζοντας την καλύτερη ποιότητα βίντεο για τους χρήστες σας, μειώνοντας ταυτόχρονα την πολυπλοκότητα της υποδομής. Ας διερευνήσουμε πώς μπορείτε να εφαρμόσετε αυτήν τη λύση για να ανταποκριθείτε στις απαιτήσεις της εφαρμογής σας. Στόχος μας είναι να δημιουργήσουμε μια λύση που είναι εύκολη στην ανάπτυξη, δεν απαιτεί συντήρηση και υποστηρίζει μια αυξανόμενη βάση χρηστών.

Λίγα Λόγια για το HLS

Θα εστιάσουμε στο HLS (HTTP Live Streaming), ένα από τα πιο δημοφιλή πρωτόκολλα ροής βίντεο. Το HLS χρησιμοποιεί κωδικοποίηση και τμηματοποίηση: το αρχικό βίντεο κωδικοποιείται σε πολλαπλές εκδόσεις με διαφορετικούς ρυθμούς bit και αναλύσεις. Αυτές οι κωδικοποιημένες εκδόσεις χωρίζονται στη συνέχεια σε μικρά κομμάτια, συνήθως 2 έως 10 δευτερολέπτων, με κάθε κομμάτι να αποθηκεύεται ως μεμονωμένο αρχείο. Στη συνέχεια δημιουργούνται λίστες αναπαραγωγής: πρώτα, δημιουργείται μια λίστα αναπαραγωγής για κάθε κωδικοποιημένη έκδοση του βίντεο, η οποία περιέχει τις διευθύνσεις URL των μεμονωμένων τμημάτων.


Στη συνέχεια, δημιουργείται μια ενιαία κύρια λίστα αναπαραγωγής, η οποία αναφέρεται στις διαφορετικές εκδόσεις της ροής (και στις αντίστοιχες λίστες αναπαραγωγής τους) μαζί με τις αναλύσεις και τους ρυθμούς bit. Αυτή η ρύθμιση επιτρέπει στις εφαρμογές-πελάτες να επιλέγουν τη βέλτιστη ροή με βάση παράγοντες όπως η ανάλυση της συσκευής του πελάτη, το μέγεθος της θύρας προβολής και οι συνθήκες δικτύου, διασφαλίζοντας ότι γίνεται λήψη μόνο των απαραίτητων τμημάτων.

Λύση με το AWS Elemental Mediaconvert

Υπάρχουν πολλά διαθέσιμα εργαλεία για τη δημιουργία ροών HLS από βίντεο. Αυτά περιλαμβάνουν την απευθείας εκτέλεση του FFmpeg ή τη χρήση υπηρεσιών που βασίζονται σε cloud για τη διαχείριση της μετατροπής και την αποφυγή διαχείρισης υποδομής. Παραδείγματα τέτοιων υπηρεσιών περιλαμβάνουν το AWS Elemental MediaConvert, το Google Cloud Transcoder, το Bitmovin και άλλα. Σε αυτήν την ανάρτηση, θα επικεντρωθούμε στο MediaConvert. Ακολουθεί μια πιθανή ροή εργασιών για την αυτόματη μετατροπή των μεταφορτωμένων βίντεο σε HLS και τη διάθεση των ροών στους χρήστες. Καθώς προχωράτε στη ροή εργασίας, ανατρέξτε στο συνημμένο διάγραμμα, όπου κάθε βήμα επισημαίνεται.


  1. Ένας χρήστης ανεβάζει ένα βίντεο σε έναν κάδο S3 χρησιμοποιώντας την εφαρμογή πελάτη για κινητά ή web.


  2. Μια συνάρτηση Lambda ενεργοποιείται από το συμβάν ObjectCreate στον κάδο Μεταφορτώσεις βίντεο S3. Αυτή η λειτουργία δημιουργεί μια εργασία MediaConvert χρησιμοποιώντας την παρεχόμενη διαμόρφωση και, στη συνέχεια, εξέρχεται (δεν περιμένει να ολοκληρωθεί η μετατροπή βίντεο). Το MediaConvert API προσφέρει διάφορες ρυθμίσεις, όπως επιλογή κωδικοποιητή, ρυθμό μετάδοσης bit, ποιότητα, επεξεργασία ήχου και άλλα. Μπορεί επίσης να δημιουργήσει πολλές εκδόσεις της ροής με διαφορετικές ρυθμίσεις συμπίεσης, όπως 360p, 720p, 1080p κ.λπ.


    Ενώ η επιλογή της διαμόρφωσης κωδικοποίησης είναι εκτός πεδίου εφαρμογής για αυτήν την ανάρτηση, το δείγμα κώδικα περιλαμβάνει μια βασική εργασία συσκευασίας HLS με μία απόδοση σε ρυθμό bit 1 Mbps. Η διαμόρφωση μπορεί εύκολα να επεκταθεί για να καλύψει τις απαιτήσεις κάθε εφαρμογής. Όσον αφορά τα δικαιώματα IAM, αυτή η λειτουργία χρειάζεται πρόσβαση ανάγνωσης στον κάδο προέλευσης S3, πρόσβαση εγγραφής στον κάδο προορισμού S3 και πρόσβαση στο MediaConvert API.


 import boto3 import re output_bucket_name = 'converted-videos-bucket' mediaconvert_role_arn = 'arn:aws:iam::123456789012:role/MediaConvertRole' # output bucket access s3_client = boto3.client('s3') mediaconvert_client = boto3.client('mediaconvert') hls_main_playlist_suffix = '-hls.m3u8' # regex used to normalize the object key for the client request token client_request_token_symbols_to_skip = r'[^a-zA-Z0-9-_]' def lambda_handler(event, context): # get S3 bucket name and object key from the event bucket_name = event['Records'][0]['s3']['bucket']['name'] object_key = event['Records'][0]['s3']['object']['key'] # also used as media id # normalize the object key for the client request token client_request_token_obj_key = re.sub(client_request_token_symbols_to_skip, '_', object_key) # call MediaConvert to transcode the video create_job_response = mediaconvert_client.create_job( Role=mediaconvert_role_arn, ClientRequestToken=client_request_token_obj_key, Settings={ 'Inputs': [ { 'FileInput': f's3://{bucket_name}/{object_key}', 'AudioSelectors': { 'Audio Selector 1': { 'DefaultSelection': 'DEFAULT', }, }, } ], 'OutputGroups': [ { 'Name': 'DefaultOutputGroup', 'OutputGroupSettings': { 'Type': 'HLS_GROUP_SETTINGS', 'HlsGroupSettings': { 'Destination': f's3://{output_bucket_name}/{object_key}-hls', 'DirectoryStructure': 'SUBDIRECTORY_PER_STREAM', 'SegmentLength': 5, 'MinSegmentLength': 2, 'SegmentsPerSubdirectory': 500, 'ProgressiveWriteHlsManifest': 'DISABLED', }, }, 'Outputs': [ { 'NameModifier': '-h264', 'ContainerSettings': { 'Container': 'M3U8', }, 'VideoDescription': { 'CodecSettings': { 'Codec': 'H_264', 'H264Settings': { 'RateControlMode': 'VBR', 'Bitrate': 1000000, }, }, }, 'AudioDescriptions': [ { 'AudioSourceName': 'Audio Selector 1', 'CodecSettings': { 'Codec': 'AAC', 'AacSettings': { 'Bitrate': 96000, 'CodingMode': 'CODING_MODE_2_0', 'SampleRate': 48000, }, }, }, ], }, ], } ], }, ) print('Created a MediaConvert job:', create_job_response) return { 'statusCode': 200, 'body': 'OK', }


  1. Το MediaConvert επεξεργάζεται το βίντεο και δημιουργεί λίστες αναπαραγωγής HLS και τμήματα βίντεο στον κάδο εξόδου S3. Ο κάδος εξόδου είναι συνδεδεμένος σε ένα CDN που αποθηκεύει προσωρινά λίστες αναπαραγωγής και τμήματα βίντεο. Σε αυτό το παράδειγμα, χρησιμοποιούμε το Cloudfront, αλλά μπορεί να χρησιμοποιηθεί οποιοδήποτε CDN που είναι συμβατό με το S3.


  2. Μια άλλη συνάρτηση Lambda ενεργοποιείται από το συμβάν ObjectCreate στον κάδο εξόδου. Ένα φίλτρο ονόματος αντικειμένου είναι συνδεδεμένο σε αυτήν την ενεργοποίηση για να διασφαλιστεί ότι η λειτουργία εκτελείται μόνο όταν δημιουργείται ένα αρχείο λίστας αναπαραγωγής (τα αρχεία τμημάτων αγνοούνται).

Φίλτρο ονόματος αντικειμένου στην ενεργοποίηση Lambda: εκτελείτε τη λειτουργία μόνο όταν δημιουργηθεί το αρχείο κύριας λίστας αναπαραγωγής.

Αυτή η λειτουργία προσθέτει τη διεύθυνση URL της λίστας αναπαραγωγής στην εγγραφή πολυμέσων στη βάση δεδομένων. Το επίπεδο αποθήκευσης είναι πέρα από το πεδίο εφαρμογής αυτής της ανάρτησης, επομένως στο δείγμα κώδικα, η διεύθυνση URL απλώς εκτυπώνεται.


 import boto3 s3_client = boto3.client('s3') def lambda_handler(event, context): # this function is triggered only when a playlist file # with object key that looks like this '<video_id>-hls.m3u8' # is created in the S3 bucket # get object key from the event object_key = event['Records'][0]['s3']['object']['key'] # extract video id from the object key video_id = object_key.replace('-hls.m3u8', '') print(f'HLS playlist {object_key} created for video {video_id}') # TODO: update the video record in the database return { 'statusCode': 200, 'body': 'OK', }



  1. Όταν οι χρήστες ανοίγουν το βίντεο στη διεπαφή χρήστη της εφαρμογής πελάτη, η εφαρμογή πελάτη ανακτά την εγγραφή πολυμέσων από τη βάση δεδομένων χρησιμοποιώντας το API. Αυτή η εγγραφή πολυμέσων περιέχει τη διεύθυνση URL της κύριας λίστας αναπαραγωγής.


  2. Το πρόγραμμα αναπαραγωγής βίντεο ανακτά την κύρια λίστα αναπαραγωγής από το CDN και αποφασίζει ποια ροή θα παίξει βάσει παραγόντων όπως το μέγεθος της θύρας προβολής, η ανάλυση οθόνης, οι συνθήκες δικτύου κ.λπ. Στη συνέχεια ανακτά τη λίστα αναπαραγωγής ροής και τα τμήματα βίντεο από το CDN και ξεκινά την αναπαραγωγή του βίντεο .


Αυτή η λύση είναι πολύ εύκολη στην ανάπτυξη και δεν απαιτεί συντήρηση. Όσον αφορά την επεκτασιμότητα για πολλούς χρήστες, είναι σημαντικό να σημειωθεί ότι, από προεπιλογή, οι εργασίες MediaConvert προστίθενται σε μία ουρά που μπορεί να επεξεργαστεί 100–200 βίντεο ταυτόχρονα (ανάλογα με την περιοχή). Μπορούν να δημιουργηθούν πρόσθετες ουρές (έως 10 ανά περιοχή) και μπορούν να εκχωρηθούν προτεραιότητες σε εργασίες όταν προστίθενται σε ουρές. Υπάρχει επίσης μια επιλογή να ζητήσετε αυξήσεις ποσοστώσεων από το AWS.


Συμπερασματικά, η αυτοματοποίηση της μετατροπής βίντεο χρησιμοποιώντας υπηρεσίες που βασίζονται σε σύννεφο, όπως το AWS Elemental MediaConvert, είναι ένας αποτελεσματικός τρόπος για την παροχή περιεχομένου ροής υψηλής ποιότητας σε όλες τις συσκευές χωρίς το βάρος της διαχείρισης πολύπλοκων υποδομών. Αυτή η προσέγγιση όχι μόνο απλοποιεί τη διαδικασία κωδικοποίησης βίντεο, αλλά επίσης ενισχύει την επεκτασιμότητα, διασφαλίζοντας ότι η πλατφόρμα σας μπορεί να χειριστεί την αυξανόμενη ζήτηση.


Αξιοποιώντας εργαλεία όπως το S3, οι λειτουργίες Lambda και το CloudFront σε συνδυασμό με το MediaConvert, μπορείτε να δημιουργήσετε και να παραδώσετε αποτελεσματικά προσαρμοστικές ροές HLS, παρέχοντας στους χρήστες μια βελτιστοποιημένη εμπειρία προβολής.