paint-brush
Hoe u video's naar HLS kunt converteren voor web- en mobiele streaming met AWS Elemental MediaConvertdoor@andrei9735
478 lezingen
478 lezingen

Hoe u video's naar HLS kunt converteren voor web- en mobiele streaming met AWS Elemental MediaConvert

door Andrei12m2024/10/06
Read on Terminal Reader

Te lang; Lezen

Of u nu een streamingplatform, een online leerportaal of een andere toepassing ontwikkelt waarbij videoweergave vereist is, naadloze videostreaming is essentieel.
featured image - Hoe u video's naar HLS kunt converteren voor web- en mobiele streaming met AWS Elemental MediaConvert
Andrei HackerNoon profile picture

In het digitale landschap van vandaag is het leveren van hoogwaardige videocontent op verschillende apparaten en netwerkomstandigheden belangrijker dan ooit. Of u nu een streamingplatform, een online leerportaal, een social media-app of een andere applicatie ontwikkelt die videoweergave vereist, naadloze videostreaming is essentieel voor een optimale gebruikerservaring.


Door videoconversie te automatiseren met behulp van een cloudgebaseerde coderingsservice kunt u moeiteloos adaptieve streams genereren, waardoor u de beste videokwaliteit voor uw gebruikers verzekert en tegelijkertijd de complexiteit van de infrastructuur vermindert. Laten we eens kijken hoe u deze oplossing kunt implementeren om aan de eisen van uw applicatie te voldoen. Ons doel is om een oplossing te creëren die eenvoudig te implementeren is, geen onderhoud vereist en een groeiende gebruikersbasis ondersteunt.

Een paar woorden over HLS

We richten ons op HLS (HTTP Live Streaming), een van de populairste videostreamingprotocollen. HLS maakt gebruik van codering en segmentatie: de originele video wordt gecodeerd in meerdere versies met verschillende bitrates en resoluties. Deze gecodeerde versies worden vervolgens verdeeld in kleine stukken, meestal 2 tot 10 seconden lang, waarbij elk stuk wordt opgeslagen als een afzonderlijk bestand. Vervolgens worden afspeellijsten gemaakt: eerst wordt een afspeellijst voor elke gecodeerde versie van de video gegenereerd, met de URL's van de afzonderlijke stukken.


Vervolgens wordt er een enkele master-afspeellijst gemaakt, die verwijst naar de verschillende versies van de stream (en hun bijbehorende afspeellijsten) samen met hun resoluties en bitrates. Deze opstelling stelt client-apps in staat om de optimale stream te selecteren op basis van factoren zoals de apparaatresolutie van de client, de viewport-grootte en de netwerkomstandigheden, zodat alleen de benodigde segmenten worden gedownload.

Oplossing met AWS Elemental Mediaconvert

Er zijn veel tools beschikbaar om HLS-streams van video's te maken. Deze omvatten het direct uitvoeren van FFmpeg of het gebruiken van cloudgebaseerde services om de conversie te verwerken en infrastructuurbeheer te vermijden. Voorbeelden van dergelijke services zijn AWS Elemental MediaConvert, Google Cloud Transcoder, Bitmovin en anderen. In dit bericht richten we ons op MediaConvert. Hieronder staat een mogelijke workflow voor het automatisch converteren van geüploade video's naar HLS en het beschikbaar maken van de streams voor gebruikers. Raadpleeg tijdens het doorlopen van de workflow het bijgevoegde diagram, waar elke stap is gelabeld.


  1. Een gebruiker uploadt een video naar een S3-bucket met behulp van de mobiele of webclient-app.


  2. Een Lambda-functie wordt geactiveerd door de ObjectCreate-gebeurtenis in de Video Uploads S3-bucket. Deze functie maakt een MediaConvert-taak met behulp van de opgegeven configuratie en wordt vervolgens afgesloten (er wordt niet gewacht tot de videoconversie is voltooid). De MediaConvert API biedt verschillende instellingen, waaronder codecselectie, bitsnelheid, kwaliteit, audioverwerking en meer. Het kan ook meerdere versies van de stream genereren met verschillende compressie-instellingen, zoals 360p, 720p, 1080p, enz.


    Hoewel het selecteren van de coderingsconfiguratie buiten het bereik van deze post valt, bevat het codevoorbeeld een basis HLS-verpakkingstaak met één weergave met een bitsnelheid van 1 Mbps. De configuratie kan eenvoudig worden uitgebreid om te voldoen aan de vereisten van elke toepassing. Wat IAM-machtigingen betreft, heeft deze functie leestoegang nodig tot de bron-S3-bucket, schrijftoegang tot de bestemmings-S3-bucket en toegang tot de 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 verwerkt de video en genereert HLS-afspeellijsten en videosegmenten in de uitvoer S3-bucket. De uitvoerbucket is verbonden met een CDN die afspeellijsten en videosegmenten cachet. In dit voorbeeld gebruiken we Cloudfront, maar elk CDN dat compatibel is met S3 kan worden gebruikt.


  2. Een andere Lambda-functie wordt geactiveerd door de ObjectCreate-gebeurtenis in de uitvoerbucket. Een objectnaamfilter is gekoppeld aan die trigger om ervoor te zorgen dat de functie alleen wordt uitgevoerd wanneer een afspeellijstbestand wordt gemaakt (segmentbestanden worden genegeerd).

Objectnaamfilter in Lambda-trigger: voer de functie alleen uit wanneer het hoofdafspeellijstbestand is gemaakt.

Deze functie voegt de afspeellijst-URL toe aan het mediarecord in de database. De opslaglaag valt buiten het bereik van dit bericht, dus in het codevoorbeeld wordt de URL gewoon afgedrukt.


 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. Wanneer gebruikers de video openen in de UI van de client-app, haalt de client-app de mediarecord op uit de database met behulp van de API. Deze mediarecord bevat de URL van de master-afspeellijst.


  2. De videospeler haalt de hoofdafspeellijst op van het CDN en beslist welke stream moet worden afgespeeld op basis van factoren zoals viewportgrootte, schermresolutie, netwerkomstandigheden, enz. Vervolgens haalt de speler de streamafspeellijst en de videosegmenten op van het CDN en begint de video af te spelen.


Deze oplossing is zeer eenvoudig te implementeren en vereist geen onderhoud. Wat betreft schaalbaarheid voor veel gebruikers, is het belangrijk om op te merken dat MediaConvert-jobs standaard worden toegevoegd aan een enkele wachtrij die 100-200 video's tegelijkertijd kan verwerken (afhankelijk van de regio). Er kunnen extra wachtrijen worden gemaakt (tot 10 per regio) en er kunnen prioriteiten worden toegewezen aan jobs wanneer ze aan wachtrijen worden toegevoegd. Er is ook een optie om quotaverhogingen aan te vragen bij AWS.


Concluderend is het automatiseren van videoconversie met behulp van cloudgebaseerde services zoals AWS Elemental MediaConvert een effectieve manier om hoogwaardige streamingcontent op apparaten te leveren zonder de last van het beheren van complexe infrastructuur. Deze aanpak vereenvoudigt niet alleen het videocoderingsproces, maar verbetert ook de schaalbaarheid, waardoor uw platform de groeiende vraag aankan.


Door gebruik te maken van hulpmiddelen zoals S3, Lambda-functies en CloudFront in combinatie met MediaConvert, kunt u op efficiënte wijze adaptieve HLS-streams genereren en leveren, waardoor gebruikers een geoptimaliseerde kijkervaring krijgen.