paint-brush
Videoiden muuntaminen HLS:ksi verkko- ja mobiilisuoratoistoa varten AWS Elemental MediaConvertin avullakirjoittaja@andrei9735
Uusi historia

Videoiden muuntaminen HLS:ksi verkko- ja mobiilisuoratoistoa varten AWS Elemental MediaConvertin avulla

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

Liian pitkä; Lukea

Olitpa kehittämässä suoratoistoalustaa, verkko-oppimisportaalia tai mitä tahansa videon toistoa vaativaa sovellusta, saumaton videon suoratoisto on välttämätöntä.
featured image - Videoiden muuntaminen HLS:ksi verkko- ja mobiilisuoratoistoa varten AWS Elemental MediaConvertin avulla
Andrey O. HackerNoon profile picture

Nykypäivän digitaalisessa ympäristössä korkealaatuisen videosisällön toimittaminen useisiin laitteisiin ja verkkoolosuhteisiin on tärkeämpää kuin koskaan. Kehitätpä sitten suoratoistoalustaa, online-oppimisportaalia, sosiaalisen median sovellusta tai mitä tahansa videon toistoa vaativaa sovellusta, saumaton videon suoratoisto on välttämätöntä optimaalisen käyttökokemuksen kannalta.


Automatisoimalla videon muuntamisen pilvipohjaisen koodauspalvelun avulla voit luoda vaivattomasti mukautuvia streameja, mikä varmistaa käyttäjillesi parhaan videon laadun ja vähentää infrastruktuurin monimutkaisuutta. Katsotaanpa, kuinka voit toteuttaa tämän ratkaisun vastaamaan sovelluksesi vaatimuksia. Tavoitteenamme on luoda ratkaisu, joka on helppo ottaa käyttöön, ei vaadi ylläpitoa ja tukee kasvavaa käyttäjäkuntaa.

Muutama sana HLS:stä

Keskitymme HLS:ään (HTTP Live Streaming), joka on yksi suosituimmista videon suoratoistoprotokollista. HLS käyttää koodausta ja segmentointia: alkuperäinen video on koodattu useiksi versioiksi eri bittinopeuksilla ja resoluutioilla. Nämä koodatut versiot jaetaan sitten pieniin osiin, jotka ovat tyypillisesti 2–10 sekunnin pituisia, ja jokainen osa tallennetaan erillisenä tiedostona. Sitten luodaan soittolistat: ensin luodaan kullekin videon koodatulle versiolle soittolista, joka sisältää yksittäisten kappaleiden URL-osoitteet.


Seuraavaksi luodaan yksi pääsoittolista, joka viittaa virran eri versioihin (ja niitä vastaaviin soittolistoihin) sekä niiden resoluutiot ja bittinopeudet. Tämän asennuksen avulla asiakassovellukset voivat valita optimaalisen streamin tekijöiden, kuten asiakkaan laitteen resoluution, näkymän koon ja verkko-olosuhteiden, perusteella. Näin varmistetaan, että vain tarvittavat segmentit ladataan.

Ratkaisu AWS Elemental Mediaconvertilla

HLS-streamien luomiseen videoista on saatavilla monia työkaluja. Näitä ovat muun muassa FFmpegin käyttäminen suoraan tai pilvipohjaisten palveluiden käyttäminen muuntamisen käsittelemiseksi ja infrastruktuurin hallinnan välttämiseksi. Esimerkkejä tällaisista palveluista ovat AWS Elemental MediaConvert, Google Cloud Transcoder, Bitmovin ja muut. Tässä viestissä keskitymme MediaConvertiin. Alla on mahdollinen työnkulku ladattujen videoiden muuntamiseksi automaattisesti HLS-muotoon ja streamien saattamiseksi käyttäjien saataville. Kun käyt työnkulun läpi, katso liitteenä olevaa kaaviota, jossa jokainen vaihe on merkitty.


  1. Käyttäjä lataa videon S3-säilöyn mobiili- tai verkkoasiakassovelluksella.


  2. Lambda-toiminnon laukaisee ObjectCreate-tapahtuma Video Uploads S3 -säilössä. Tämä toiminto luo MediaConvert-työn käyttämällä annettuja määrityksiä ja poistuu sitten (se ei odota videon muuntamisen valmistumista). MediaConvert API tarjoaa erilaisia asetuksia, kuten koodekin valinnan, bittinopeuden, laadun, äänenkäsittelyn ja paljon muuta. Se voi myös luoda useita versioita streamista erilaisilla pakkausasetuksilla, kuten 360p, 720p, 1080p jne.


    Vaikka koodauskokoonpanon valitseminen ei kuulu tähän viestiin, koodinäyte sisältää HLS-peruspakkaustyön yhdellä toistolla 1 Mbps:n bittinopeudella. Kokoonpanoa voidaan helposti laajentaa vastaamaan kunkin sovelluksen vaatimuksia. Mitä tulee IAM-oikeuksiin, tämä toiminto tarvitsee lukuoikeuden lähde S3-säilöyn, kirjoitusoikeuden kohde-S3-säilöyn ja pääsyn MediaConvert API:han.


 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 käsittelee videon ja luo HLS-soittolistoja ja videosegmenttejä S3-lähtöön. Lähtöalue on kytketty CDN-verkkoon, joka tallentaa soittolistoja ja videosegmenttejä välimuistiin. Tässä esimerkissä käytämme Cloudfrontia, mutta mitä tahansa S3:n kanssa yhteensopivaa CDN:ää voidaan käyttää.


  2. Toinen Lambda-funktio laukaisee ObjectCreate-tapahtuman tulosteryhmässä. Objektin nimisuodatin on liitetty liipaisuun varmistaakseen, että toiminto suoritetaan vain, kun soittolistatiedosto luodaan (segmenttitiedostoja ei huomioida).

Objektin nimisuodatin Lambda-triggerissä: suorita toiminto vain, kun pääsoittolistatiedosto on luotu.

Tämä toiminto lisää soittolistan URL-osoitteen tietokannan mediatietueeseen. Tallennuskerros ei kuulu tämän viestin soveltamisalaan, joten koodinäytteessä URL-osoite yksinkertaisesti tulostetaan.


 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. Kun käyttäjät avaavat videon asiakassovelluksen käyttöliittymässä, asiakassovellus hakee mediatietueen tietokannasta API:n avulla. Tämä mediatietue sisältää pääsoittolistan URL-osoitteen.


  2. Videosoitin hakee pääsoittolistan CDN:stä ja päättää, mikä stream toistetaan tekijöiden, kuten näkymän koon, näytön resoluution, verkko-olosuhteiden jne. perusteella. Sitten se hakee suoratoistolistan ja videosegmentit CDN:stä ja alkaa toistaa videota. .


Tämä ratkaisu on erittäin helppo ottaa käyttöön eikä vaadi huoltoa. Mitä tulee monien käyttäjien skaalautumiseen, on tärkeää huomata, että oletusarvoisesti MediaConvert-työt lisätään yhteen jonoon, joka voi käsitellä 100–200 videota samanaikaisesti (alueesta riippuen). Lisää jonoja voidaan luoda (enintään 10 per alue), ja töille voidaan määrittää prioriteetteja, kun niitä lisätään jonoihin. AWS:ltä on myös mahdollisuus pyytää kiintiönkorotuksia.


Yhteenvetona voidaan todeta, että videon muuntamisen automatisointi pilvipohjaisilla palveluilla, kuten AWS Elemental MediaConvertilla, on tehokas tapa tarjota korkealaatuista suoratoistosisältöä eri laitteille ilman monimutkaisen infrastruktuurin hallintataakkaa. Tämä lähestymistapa ei vain yksinkertaista videon koodausprosessia, vaan myös parantaa skaalautuvuutta ja varmistaa, että alustasi pystyy käsittelemään kasvavaa kysyntää.


Hyödyntämällä työkaluja, kuten S3, Lambda-toimintoja ja CloudFrontia yhdessä MediaConvertin kanssa, voit luoda ja toimittaa mukautuvia HLS-streameja tehokkaasti, mikä tarjoaa käyttäjille optimoidun katselukokemuksen.