De beste manier om video's op schaal te beheren

In de wereld van vandaag zijn video's een gemakkelijke manier geworden om elk idee uit te leggen en om elk onderwerp te begrijpen. Video's hebben bewezen meer aandacht van de consument te eisen dan enig ander medium. Mensen hebben graag overal en altijd toegang tot video's en het is een uitdaging voor opkomende bedrijven om niet alleen hoogwaardige inhoud te leveren, maar ook een goede kijkervaring te bieden aan hun klanten.

Introductie van ons bedrijf -

Wij zijn een platform van 3 lakh-geverifieerde artsen, de grootste in het land. Als een snel bewegend bedrijf experimenteren we veel met het product en zorgen we er tegelijkertijd voor dat we kwaliteitsproducten voor iedereen leveren. Onlangs hebben we onze gebruikers in staat gesteld om video's van chirurgische procedures enz. Te uploaden, om hun bevindingen te delen en suggesties van hun collega-artsen te vragen.

De meeste van onze gebruikers hebben onderweg een minimale ontvangst tot hogere internetsnelheden en dit is een uitdaging bij het leveren van zware gegevensinhoud zoals video's.

We vonden het vrij duidelijk om het HLS-protocol te gebruiken voor videolevering, omdat het breed wordt ondersteund, ontwikkeld door Apple en wordt gebruikt door veel grote bedrijven zoals Facebook. HLS staat voor HTTP Live Streaming. Het is een mediastreamingprotocol om video- en audio-inhoud te leveren. Een mp4-video is verdeeld in kleine segmenten, meestal van 10 seconden en voor elk segment worden ook meerdere segmenten van videokwaliteit gemaakt die kunnen worden gedownload voor weergave op basis van de beschikbare internetbandbreedte.

Dus wanneer een speler een video in HLS-indeling afspeelt, kan deze het videosegment aanvragen op basis van de beschikbare bandbreedte en de video ononderbroken streamen, waardoor de gebruikers een soepele ervaring krijgen. Het ene moment kunnen gebruikers een video met lage resolutie bekijken en het volgende moment kan het overschakelen naar een hogere definitie zodra het apparaat zich in het bereik van een netwerk met hogere bandbreedte bevindt.

Hieronder staan ​​de resoluties die we voor onze use case hebben gebruikt, afgezien van de oorspronkelijke resolutie van de video -

Te genereren resoluties van video

De uitdaging was om de geüploade video's in het gewenste formaat te transformeren en de miniatuur voor de tijdelijke aanduiding voor video te genereren. Er zijn veel serviceproviders die videotransformatie en inhoudslevering bieden, maar het grootste probleem is dat ze betaalbaar zijn tot een bepaald punt en met de groei van het bedrijf heeft u een oplossing nodig die geen last voor uw zak is. AWS MediaConvert en S3 zijn de tools die we kiezen om onze videomedia te transformeren en te leveren. Door de hieronder besproken oplossing te gebruiken, kunnen we onze kosten met 90 procent verlagen, wat vrij belangrijk is voor bedrijven van elke schaal. Volg het artikel als u wilt weten hoe we de oplossing hebben benaderd.

Eerste aanpak

In plaats van een interne oplossing te bouwen, hebben we besloten om services van derden te gebruiken waarvoor Cloudinary bij onze use case past. Het biedt on-the-fly video-transformatieservice die echt heeft geholpen bij het krijgen van de transformatie die we nodig hadden en de totale tijd die werd genomen was ook erg minder.

Ontwikkeling was sneller omdat we ons geen zorgen hoeven te maken over de transformatie. Men moet de video uploaden, de benodigde transformatie selecteren en Cloudinary doet de rest. Aanvankelijk lag Cloudinary ruim binnen ons budget, maar naarmate de functie meer grip kreeg, begonnen meer gebruikers video's te uploaden. Deze groei zorgde voor een flinke stijging van het bedrag dat we aan Cloudinary uitgeven en het was tijd om naar andere opties te zoeken.

Onze experimenten

Ten eerste hebben we de beroemde open source-bibliotheek getest - ffmpeg die de videotransformatie kan uitvoeren die we nodig hadden. We hadden twee opties voor het gebruik van de ffmpeg-bibliotheek: gebruik cloudfuncties of gebruik een van de al lopende VM-exemplaren op GCP (Google Cloud Platform).

Omdat het hele proces volgens een on-demand model werkt, werd de laatste keuze verworpen. Cloud Functions is gebaseerd op het computing-on-demand-model, wat betekent dat we de middelen krijgen waar en wanneer nodig zonder onze andere services aan te tasten. Omdat het op aanvraag is, hoeven we niet de kosten van de server te betalen wanneer deze niet actief is.

Cloudfuncties zijn heel eenvoudig te gebruiken en bieden de mogelijkheid om de code in twee populairste talen te schrijven - node en python. We hebben besloten om met python te gaan, omdat we vertrouwd zijn met het paradigma, omdat onze stapel op python is. Het installeren van de afhankelijkheden is heel eenvoudig, je moet het gewoon vermelden in het requirements.txt-bestand en je bent klaar.

We hebben het script laten werken voor de cloudfunctie, waarbij we de video eerst downloaden uit de cloudopslag, deze transformeren in het vereiste formaat en deze terugzetten naar cloudopslag voor streaming.

Maar er was een vangst. We lieten onze gebruikers video's uploaden tot 100 MB en om video van die grootte cloud-functie te verwerken kostte veel tijd en werd uiteindelijk beëindigd voordat het hele proces werd voltooid vanwege de tijdslimiet (540 seconden). Ter verdediging hebben we nog niet eerder aan dat scenario gedacht.

Na het verkennen van andere opties en veel onderzoek zag AWS MediaConvert er veelbelovend uit. Werken met MediaConvert was lastig, omdat het veel opties biedt om je transformatie aan te passen en je gemakkelijk kunt verdwalen in die situatie (verwend door keuze). Maar na enige tijd rond te hebben gekeken, kregen we de sjabloon die nodig was voor onze gewenste transformatie. (voeg de sjabloon toe)

Onze hele stroom zag er ongeveer zo uit -

We uploaden een video naar de S3-bucket die op zijn beurt een Lambda-functie activeert. In lambda berekenen we de vereiste parameters als invoer voor MediaConvert met behulp van niemand minder dan ffmpeg. Na het berekenen van alle parameters, dienen we een verzoek in bij AWS MediaConvert om onze video te transformeren. Om op de hoogte te worden gehouden van de voltooiing van de transformatie, kan men een cloud watch-gebeurtenis maken van statusverandering van taak die in MediaConvert is ingediend van ‘progressie’ naar ‘complete’ die op zijn beurt een lambdafunctie zal activeren. De geactiveerde lambdafunctie kan een api-oproep doen of een DB-update uitvoeren op basis van de haalbaarheid van uw project.

In het kort :

De AWS-oplossing werkte als charme en het was echt snel. Dit lijkt misschien veel werk, maar het is de moeite waard om te doen als je moet schalen.

Voordelen van het gebruik van deze oplossing -

  • We gebruiken S3 om onze media-inhoud op te slaan en te leveren, die ook zeer schaalbaar en betaalbaar is.
  • AWS MediaConvert is erg snel en biedt de functionaliteit om verschillende wachtrijen bij te houden om opdrachten voor transformatie in te dienen. U hoeft zich dus geen zorgen te maken over plotselinge verzoeken om video's af te handelen. De prijs is ook echt zuinig, geen maandelijkse kosten en je moet alleen betalen voor de gebruikte services.
  • AWS Lambda is gebaseerd op Computation on Demand die we hierboven al hebben besproken. Afgezien van dat geeft AWS u wat gratis lambda-aanroeping en CPU-tijd van de Lambda-functie per maand, wat echt geweldig is en zelfs bij gebruik boven gratis-tier-prijzen wordt uw zak niet belast.

Problemen tijdens de AWS-implementatie:

  • Onthoud altijd dat AWS diensten aanbiedt op basis van de regio's, behalve enkele zoals S3 die wereldwijd beschikbaar is. Gebruik services in dezelfde regio, anders kun je mogelijk geen evenementen vangen of lambdafuncties activeren.
  • Geef de benodigde toestemming aan uw IAM-rol voor de services die u gebruikt.
  • Zoals hierboven vermeld, activeert video-upload naar S3 bucket een lambdafunctie waar we de nodige transformatiegegevens invullen, zoals de resolutie van de resulterende video's, bitsnelheid, enz. En voor deze waarde moet je de metagegevens van de video vinden die als hoogte is geüpload , breedte en bitrate. Je moet een videobewerkingsbibliotheek zoals ffmpeg gebruiken om deze waarde te krijgen die niet vooraf is geladen op de container waarop onze lambda draait, terwijl lambda draait op een of meer containers die op verzoek worden gemaakt en op verzoek worden verwijderd.
  • In tegenstelling tot de Google Cloud Functions, waar je gewoon de bibliotheeknaam in requirements.txt kunt toevoegen en zij de rest zullen afhandelen, moet je voor AWS lambda een zipbestand maken van alle bibliotheken en de binaire bestanden die worden gebruikt in de lambda-functie. Na wat onderzoek te hebben gedaan, kwamen we erachter dat je binaries van ffmpeg kunt toevoegen in de map / tmp en het in je functie kunt gebruiken. Bezoek hier stappen om ffmpeg in uw pad op te nemen en om een ​​aws lambda-implementatiepakket te maken.
  • Tijdens het testen kwamen we erachter dat de video's gemaakt op iOS-apparaten na transformatie van portret naar landschap werden geroteerd (StackOverflow-discussie en AWS-forum). De reden daarvoor is dat video-opnamen op iOS-apparaten oorspronkelijk zijn opgeslagen in de liggende modus met een vlag in videometa-gegevens die de speler vertelt om video te draaien tijdens het spelen. Tijdens het uitvoeren van de transformatie gaat de rotatie-ID verloren en daarom wordt de video in de liggende modus afgespeeld en lijkt deze geroteerd.
  • Om dit eerst te overwinnen, hebben we die video's geïdentificeerd met behulp van ffmpeg. Die video's hebben de waarde ‘rotatie’ in ‘Display Matrix’ van de videometagegevens die met ffmpeg kunnen worden verkregen. Roteer vervolgens die video's op basis van de gegeven rotatie en nu heb je de geroteerde video die gemakkelijk kan worden getransformeerd met behulp van de bovenstaande techniek.

Als u dit artikel nuttig vindt, drukt u zo vaak u op de klapknop drukt. Neem gerust contact op als u hulp nodig hebt bij een van de hierboven genoemde stappen.