paint-brush
Paano Mag-convert ng Mga Video sa HLS para sa Web at Mobile Streaming Gamit ang AWS Elemental MediaConvertsa pamamagitan ng@andrei9735
Bagong kasaysayan

Paano Mag-convert ng Mga Video sa HLS para sa Web at Mobile Streaming Gamit ang AWS Elemental MediaConvert

sa pamamagitan ng Andrey O.12m2024/10/06
Read on Terminal Reader

Masyadong mahaba; Upang basahin

Gumagawa ka man ng streaming platform, online learning portal, o anumang application na nangangailangan ng pag-playback ng video, mahalaga ang tuluy-tuloy na video streaming.
featured image - Paano Mag-convert ng Mga Video sa HLS para sa Web at Mobile Streaming Gamit ang AWS Elemental MediaConvert
Andrey O. HackerNoon profile picture

Sa digital landscape ngayon, ang paghahatid ng mataas na kalidad na nilalaman ng video sa iba't ibang device at kundisyon ng network ay mas mahalaga kaysa dati. Gumagawa ka man ng streaming platform, online learning portal, social media app, o anumang application na nangangailangan ng pag-playback ng video, ang tuluy-tuloy na video streaming ay mahalaga para sa pinakamainam na karanasan ng user.


Ang pag-automate ng conversion ng video gamit ang cloud-based na serbisyo sa pag-encode ay nagbibigay-daan sa iyong walang kahirap-hirap na bumuo ng mga adaptive stream, na tinitiyak ang pinakamahusay na kalidad ng video para sa iyong mga user habang binabawasan ang mga kumplikadong imprastraktura. Tuklasin natin kung paano mo maipapatupad ang solusyong ito upang matugunan ang mga hinihingi ng iyong aplikasyon. Ang aming layunin ay lumikha ng solusyon na madaling i-deploy, hindi nangangailangan ng maintenance, at sumusuporta sa lumalaking user base.

Ilang Salita Tungkol sa HLS

Magtutuon kami sa HLS (HTTP Live Streaming), isa sa pinakasikat na video streaming protocol. Gumagamit ang HLS ng encoding at segmentation: ang orihinal na video ay naka-encode sa maraming bersyon na may iba't ibang bitrate at resolution. Ang mga naka-encode na bersyon na ito ay hinati sa maliliit na chunks, karaniwang 2 hanggang 10 segundo ang haba, na ang bawat chunk ay naka-imbak bilang isang indibidwal na file. Pagkatapos ay gagawin ang mga playlist: una, ang isang playlist para sa bawat naka-encode na bersyon ng video ay nabuo, na naglalaman ng mga URL ng mga indibidwal na chunks.


Susunod, ang isang master playlist ay ginawa, na tumutukoy sa iba't ibang bersyon ng stream (at ang kanilang mga kaukulang playlist) kasama ang kanilang mga resolution at bitrate. Binibigyang-daan ng setup na ito ang mga client app na piliin ang pinakamainam na stream batay sa mga salik tulad ng resolution ng device ng kliyente, laki ng viewport, at mga kundisyon ng network, na tinitiyak na ang mga kinakailangang segment lang ang mada-download.

Solusyon Sa AWS Elemental Mediaconvert

Mayroong maraming mga tool na magagamit para sa paglikha ng mga stream ng HLS mula sa mga video. Kabilang dito ang direktang pagpapatakbo ng FFmpeg o paggamit ng mga serbisyong nakabatay sa cloud upang mahawakan ang conversion at maiwasan ang pamamahala sa imprastraktura. Kasama sa mga halimbawa ng naturang mga serbisyo ang AWS Elemental MediaConvert, Google Cloud Transcoder, Bitmovin, at iba pa. Sa post na ito, tututok tayo sa MediaConvert. Nasa ibaba ang isang posibleng daloy ng trabaho para sa awtomatikong pag-convert ng mga na-upload na video sa HLS at gawing available ang mga stream sa mga user. Habang dumadaan ka sa daloy ng trabaho, mangyaring sumangguni sa nakalakip na diagram, kung saan may label ang bawat hakbang.


  1. Ang isang user ay nag-a-upload ng video sa isang S3 bucket gamit ang mobile o web client app.


  2. Ang Lambda function ay na-trigger ng ObjectCreate na kaganapan sa Video Uploads S3 bucket. Lumilikha ang function na ito ng trabaho sa MediaConvert gamit ang ibinigay na configuration at pagkatapos ay lalabas (hindi nito hinihintay na makumpleto ang conversion ng video). Nag-aalok ang MediaConvert API ng iba't ibang setting, kabilang ang pagpili ng codec, bitrate, kalidad, pagproseso ng audio, at higit pa. Maaari rin itong bumuo ng maraming bersyon ng stream na may iba't ibang setting ng compression, gaya ng 360p, 720p, 1080p, atbp.


    Habang ang pagpili sa configuration ng pag-encode ay wala sa saklaw para sa post na ito, kasama sa sample ng code ang isang pangunahing HLS packaging job na may isang rendition sa 1 Mbps bitrate. Ang pagsasaayos ay madaling mapalawak upang matugunan ang mga kinakailangan ng bawat aplikasyon. Para sa mga pahintulot ng IAM, ang function na ito ay nangangailangan ng read access sa source S3 bucket, write access sa destination S3 bucket, at access sa 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. Pinoproseso ng MediaConvert ang video at bumubuo ng mga playlist ng HLS at mga segment ng video sa output S3 bucket. Ang output bucket ay konektado sa isang CDN na nag-cache ng mga playlist at mga segment ng video. Sa halimbawang ito, gumagamit kami ng Cloudfront ngunit maaaring gamitin ang anumang CDN na katugma sa S3.


  2. Ang isa pang function ng Lambda ay na-trigger ng kaganapang ObjectCreate sa output bucket. Ang isang object name filter ay naka-attach sa trigger na iyon upang matiyak na ang function ay gagana lamang kapag ang isang playlist file ay ginawa (ang mga segment na file ay hindi papansinin).

Filter ng pangalan ng object sa Lambda trigger: patakbuhin lang ang function kapag ginawa ang master playlist file.

Ang function na ito ay nagdaragdag ng playlist URL sa media record sa database. Ang layer ng imbakan ay lampas sa saklaw ng post na ito, kaya sa sample ng code, naka-print lang ang 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. Kapag binuksan ng mga user ang video sa UI ng client app, kinukuha ng client app ang media record mula sa database gamit ang API. Ang media record na ito ay naglalaman ng master playlist URL.


  2. Kinukuha ng video player ang master playlist mula sa CDN at nagpapasya kung aling stream ang ipe-play batay sa mga salik gaya ng laki ng viewport, resolution ng screen, mga kundisyon ng network, atbp. Pagkatapos ay kinukuha nito ang stream playlist at ang mga segment ng video mula sa CDN at sinimulang i-play ang video .


Ang solusyon na ito ay napakadaling i-deploy at hindi nangangailangan ng pagpapanatili. Tungkol sa scalability para sa maraming user, mahalagang tandaan na, bilang default, ang mga trabaho sa MediaConvert ay idinaragdag sa isang queue na maaaring magproseso ng 100–200 video nang sabay-sabay (depende sa rehiyon). Maaaring gumawa ng mga karagdagang pila (hanggang 10 bawat rehiyon), at maaaring italaga ang mga priyoridad sa mga trabaho kapag idinagdag ang mga ito sa mga pila. Mayroon ding opsyon na humiling ng pagtaas ng quota mula sa AWS.


Sa konklusyon, ang pag-automate ng video conversion gamit ang cloud-based na mga serbisyo tulad ng AWS Elemental MediaConvert ay isang epektibong paraan upang maghatid ng mataas na kalidad na streaming content sa mga device nang walang pasanin sa pamamahala ng kumplikadong imprastraktura. Ang diskarteng ito ay hindi lamang pinapasimple ang proseso ng pag-encode ng video ngunit pinahuhusay din ang scalability, na tinitiyak na kakayanin ng iyong platform ang lumalaking demand.


Sa pamamagitan ng paggamit ng mga tool gaya ng S3, Lambda function, at CloudFront kasabay ng MediaConvert, mahusay kang makakabuo at makakapaghatid ng mga adaptive na stream ng HLS, na nagbibigay sa mga user ng na-optimize na karanasan sa panonood.