Най-добрият начин за управление на видеоклипове в мащаб

В днешните световни видеоклипове се превърна в лесен начин да се обясни всяка идея и да се разбере всяка тема. Доказано е, че видеоклиповете изискват повече потребителско внимание от всеки друг носител. Хората обичат да имат достъп до видеоклипове навсякъде и по всяко време и за нововъзникващите компании е предизвикателство не само да доставят качествено съдържание, но и да дадат добро преживяване при гледане на своите клиенти.

Представяне на нашата компания -

Ние сме платформа от 3 проверени лекари, най-големият в страната. Като бързо развиваща се компания експериментираме много с продукта и в същото време внимаваме да доставим качествен продукт за всички. Наскоро ние позволихме на нашите потребители да качват видеоклипове на хирургични процедури и т.н., да споделят своите открития и да търсят предложения от своите колеги лекари.

Повечето от нашите потребители, в движение, имат минимален прием за по-бързи интернет скорости и това е предизвикателство при доставяне на тежко съдържание на данни като видеоклипове.

Открихме, че е доста очевидно да използваме HLS протокола за доставка на видео, тъй като той е широко поддържан, разработен от Apple и използван от много големи компании като Facebook. HLS означава HTTP Live Streaming. Това е протокол за поточно предаване на медии за доставяне на видео и аудио съдържание. Mp4 видео е разделено на малки сегменти обикновено от 10 секунди и за всеки сегмент се създават множество сегменти за качество на видеото, които могат да бъдат изтеглени за възпроизвеждане въз основа на наличната интернет честотна лента.

Така че всеки път, когато играчът възпроизвежда видео във формат HLS, той може да поиска видео сегмента въз основа на наличната честотна лента и да предава видеото непрекъснато, като предоставя на потребителите безпроблемно изживяване. В един момент потребителите могат да гледат видео с ниска разделителна способност и в следващия момент той може да премине към по-висока детайлност веднага щом устройството е в обхвата на мрежата с по-голяма честотна лента.

По-долу са резолюциите, които използвахме за нашия случай, с изключение на оригиналната резолюция на видеоклипа -

Резолюции на видео, което трябва да се генерира

Предизвикателството беше да трансформирате качените видеоклипове в необходимия формат, както и да генерирате миниатюрата за заместителя на видео. Има много доставчици на услуги, които осигуряват видео трансформация и доставка на съдържание, но основният проблем е, че те са достъпни до определен момент и с растежа на компанията имате нужда от решение, което не е тежест за джоба ви. AWS MediaConvert и S3 са инструментите, които избираме да трансформираме и доставяме видео медиите си. Използвайки разгледаното по-долу решение, ние можем да намалим разходите си с 90 процента, което е доста важно за компания от всякакъв мащаб. Следвайте статията, ако искате да знаете как сме нулирани в решението.

Първоначален подход

Вместо да изградим вътрешно решение решихме да използваме услуги на трети страни, за които Cloudinary отговаря на нашия случай на използване. Той предоставя услугата за видео трансформация в движение, която наистина помогна за получаването на нужната трансформация, а общото време също беше много по-малко.

Развитието беше по-бързо, тъй като не е нужно да се притесняваме за трансформацията. Човек трябва да качи видеото, да изберете необходимата трансформация и Cloudinary ще направи останалото. Първоначално Cloudinary беше доста в рамките на нашия бюджет, но тъй като функцията започна да придобива повече сцепление, повече потребители започнаха да качват видеоклипове. Този растеж скочи сумата, която харчихме за Cloudinary и беше време да потърсим други опции.

Нашите експерименти

Първо, тествахме известната библиотека с отворен код - ffmpeg, която е в състояние да извърши видео трансформацията, от която се нуждаехме. Имахме две възможности за използване на библиотеката ffmpeg - да използвате облачни функции или да използвате един от вече работещия VM екземпляр в GCP (Google Cloud Platform).

Тъй като целият процес работи по модел при поискване, последният избор беше отхвърлен. Облачните функции се основават на модела на изчисляване при поискване, което означава, че ще получим ресурсите както и когато е необходимо, без да засягаме другите ни услуги. Тъй като е при поискване, не е нужно да плащаме разходите на сървъра, когато той работи в режим на празен ход.

Облачните функции са наистина лесни за използване и дават възможност за писане на кода на два най-популярни езика - възел и питон. Решихме да продължим с python, тъй като сме удобни с парадигмата, тъй като стекът ни е на python. Инсталирането на зависимостите е наистина лесно, просто трябва да го споменете във файла requ.txt и сте готови.

Получихме скрипта, работещ за облачна функция, където първо изтегляме видеото от облачно хранилище, трансформираме го в необходимия формат и го прехвърляме обратно в облачно хранилище за стрийминг.

Но имаше уловка. Оставяме на нашите потребители да качват видеоклипове до 100 MB и обработката на видео с тази облачна функция отне много време и в крайна сметка се прекратява преди да завърши целия процес поради ограничението във времето (540 секунди). В наша защита не сме мислили за този сценарий по-рано.

След проучване на други опции и много изследвания AWS MediaConvert изглеждаше обещаващо. Работата с MediaConvert беше сложна, тъй като дава много възможности за персонализиране на вашата трансформация и човек може лесно да се изгуби в тази ситуация (развален по избор). Но след като се огледахме известно време, получихме необходимия шаблон за желаната трансформация. (прикачете шаблона)

Целият ни поток изглеждаше нещо като -

Качваме видео в кофа S3, което от своя страна задейства функция Lambda. В ламбда определяме параметрите, необходими като вход за MediaConvert, като използваме не друго, освен ffmpeg. След изчисляване на всички параметри, ние изпращаме заявка до AWS MediaConvert за трансформиране на нашето видео. За да получите известие за завършването на трансформацията, можете да създадете събитие в облачен часовник за промяна на състоянието на работа, изпратено в MediaConvert, от „напредващо“ към „завършено“, което от своя страна ще задейства ламбда функция. Задействаната ламбда функция може или да направи api повикване, или да извърши актуализация на db въз основа на осъществимостта на вашия проект.

Накратко :

Решението AWS работеше като чар и беше наистина бързо. Това може да изглежда много работа, но си струва да направите, ако трябва да мащабите.

Предимства от използването на това решение -

  • Използваме S3, за да съхраняваме и доставяме медийното си съдържание, което е много мащабируемо и достъпно.
  • AWS MediaConvert е наистина бърз и дава функционалност за поддържане на няколко опашки за изпращане на задания за трансформация. Така че не е нужно да се притеснявате от внезапен скок на заявките за обработка на видеоклипове. Също така ценообразуването е наистина икономично, без месечни такси и трябва да плащате само за използваните услуги.
  • AWS Lambda се основава на Computation on Demand, която вече обсъдихме по-горе. Освен това AWS ви предоставя малко безплатно извикване на ламбда и време на процесора на функцията на Lambda на месец, което е наистина страхотно и дори при използване извън цените на безплатни нива не натоварва джоба ви.

Проблеми, с които се сблъскват по време на внедряването на AWS:

  • Винаги помнете, че AWS предоставя услуги, базирани на регионите, с изключение на няколко като S3, който е достъпен на глобално ниво. Използвайте услуги в същия регион, в противен случай може да не успеете да уловите събития или да задействате ламбда функции.
  • Дайте необходимо разрешение на вашата IAM роля за услугите, които използвате.
  • Както бе споменато по-горе, качването на видео в кофата S3 задейства ламбда функция, при която попълваме необходимите детайли за трансформация като разделителната способност на получените видеоклипове, битова скорост и т.н., като за тази стойност трябва да намерите метаданните на видеото, качено като височина , ширина и битрейт. Трябва да използвате библиотека за видео обработка като ffmpeg, за да получите тези стойности, които не са предварително заредени в контейнера, на който работи ламбда, тъй като lambda работи на един или повече контейнери, които се създават и изтриват при поискване като заявки.
  • За разлика от облачните функции на Google, където можете просто да добавите името на библиотеката в изисквания.txt и те ще се справят с останалите, за AWS lambda трябва да създадете zip файл на всички библиотеки и двоичните файлове, използвани във функцията lambda. След като направихме някои изследвания, разбрахме, че можете да добавите двоични файлове на ffmpeg в / tmp папката и да ги използвате във вашата функция. За стъпки за включване на ffmpeg в посещението си тук и за създаване на aws lambda пакет за разгръщане посетете тук.
  • Докато тествахме, разбрахме, че видеоклиповете, заснети на iOS устройства, се превръщат от портрет в пейзаж след трансформация (StackOverflow дискусия и AWS форум). Причината за това е видеозаснемането на iOS устройство първоначално е записано в пейзажен режим с флаг във видео мета данни, което казва на плейъра да върти видео по време на възпроизвеждане. Докато правите трансформацията, идентификаторът на въртене се губи и поради това видеото се възпроизвежда в пейзажен режим и изглежда като завъртяно.
  • За да преодолеем това първо, ние идентифицирахме тези видеоклипове, използвайки ffmpeg. Тези видеоклипове имат стойност „завъртане“ в „Матрица на показване“ на метаданните за видео, които могат да бъдат получени с помощта на ffmpeg. След това завъртете тези видеоклипове въз основа на даденото завъртане и сега имате завъртеното видео, което може лесно да се трансформира с помощта на горната техника.

Ако намерите тази статия за полезна, моля, натиснете бутона за пляскане толкова пъти, колкото искате. Моля, не се колебайте да се свържете, ако се нуждаете от помощ в която и да е стъпка, спомената по-горе.