Найкращий спосіб керувати відео в масштабі

У сучасних світових відео стали простим способом пояснити будь-яку ідею, а також зрозуміти будь-яку тему. Відео доведено, що вимагають більшої уваги споживачів, ніж будь-який інший носій. Люди люблять отримувати доступ до відео в будь-якому місці та в будь-який час, і компаніям, що розвиваються, це завдання не тільки доставляти якісний контент, але й надавати своїм клієнтам хороший досвід перегляду.

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

Ми є платформою з трьох перевірених лікарів, найбільших у країні. Як компанія, що швидко розвивається, ми багато експериментуємо з продуктом і водночас обережно доставляємо якісний продукт для всіх. Нещодавно ми дозволяли нашим користувачам завантажувати відео з хірургічних процедур тощо, ділитися своїми висновками та шукати пропозиції у своїх колег-лікарів.

Більшість наших користувачів, на ходу, отримують мінімальний прийом для швидшої швидкості Інтернету, і це є проблемою при доставці важкого вмісту даних, як-от відео.

Ми вважаємо цілком очевидним використання протоколу HLS для доставки відео, оскільки він широко підтримується, розробляється Apple і використовується багатьма великими компаніями, такими як Facebook. HLS розшифровується як пряма трансляція HTTP. Це протокол потокового передавання медіа для доставки відео та аудіоконтенту. Відео mp4 поділяється на невеликі сегменти, як правило, на 10 секунд, і для кожного сегмента також створюються кілька сегментів якості відео, які можна завантажувати для відтворення на основі наявної пропускної здатності Інтернету.

Отже, кожен раз, коли гравець відтворює відео у форматі HLS, він може запитувати сегмент відеозапису на основі наявної пропускної здатності та безперервно передавати відео, надаючи користувачам безперебійний досвід. В один момент користувачі можуть переглядати відео з низькою роздільною здатністю, а в наступний момент він може переключитися на більш високу чіткість, як тільки пристрій опиниться в діапазоні мережі з більшою пропускною здатністю.

Нижче наведено рішення, які ми використовували для нашого випадку, крім оригінальної роздільної здатності відео -

Роздільна здатність відео, яке потрібно створити

Завдання полягала в тому, щоб перетворити завантажені відео у потрібний формат, а також створити ескіз для заповнювача відео. Є багато постачальників послуг, які забезпечують трансформацію відео та передачу контенту, але головна проблема полягає в тому, що вони доступні до певного моменту, і з ростом компанії вам потрібно рішення, яке не обтяжує ваші кишені. AWS MediaConvert і S3 - це інструменти, які ми обираємо для трансформації та доставки наших відеомедіа. Використовуючи рішення, обговорене нижче, ми можемо знизити наші витрати на 90 відсотків, що досить важливо для компанії будь-якого масштабу. Перегляньте статтю, якщо ви хочете знати, як ми зробили нуль у вирішенні.

Початковий підхід

Замість розробки внутрішнього рішення ми вирішили скористатись сторонніми послугами, для яких Cloudinary підходить для нашого випадку використання. Він надає послугу трансформації відео на льоту, яка справді допомогла отримати необхідну трансформацію, а загальний витрачений час був також дуже меншим.

Розвиток пройшов швидше, оскільки нам не потрібно турбуватися про трансформацію. Треба завантажити відео, вибрати потрібну трансформацію, а Cloudinary зробить все інше. Спочатку Cloudinary добре входив у наш бюджет, але оскільки ця функція почала набирати більше тяги, все більше користувачів почали завантажувати відео. Цей ріст прискорив суму, яку ми витратили на Cloudinary, і настав час шукати інші варіанти.

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

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

Оскільки весь процес працює за моделлю на замовлення, останній вибір був відхилений. Хмарні функції базуються на моделі обчислення на вимогу, що означає, що ми отримаємо ресурси як і коли потрібно, не впливаючи на інші наші послуги. Оскільки це на вимогу, нам не доведеться платити вартість сервера, коли він не працює.

Хмарні функції дійсно прості у використанні та дають можливість записати код двома найпопулярнішими мовами - вузлом та пітоном. Ми вирішили піти з python, оскільки нам зручно з парадигмою, оскільки наш стек знаходиться на python. Встановити залежності дуже просто, вам потрібно лише згадати його у файлі вимог.txt, і ви налаштовані.

У нас з'явився сценарій, що працює для хмарної функції, де ми спочатку завантажуємо відео з хмарного сховища, перетворюємо його у потрібному форматі та передаємо його назад у хмарний сховище для потокового передавання.

Але був улов. Ми дозволяємо нашим користувачам завантажувати відео до 100 Мб, а обробка відео таких хмарних функцій займала багато часу і врешті-решт припиняється до завершення всього процесу через часовий ліміт (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 лямбда вам потрібно створити zip-файл із усіх бібліотек та двійкових файлів, що використовуються у функції лямбда. Провівши деякі дослідження, ми з’ясували, що ви можете додати бінарні файли ffmpeg в папку / tmp і використовувати їх у своїй функції. Щоб увімкнути ffmpeg у свій візит, відвідайте тут, і створіть тут візит пакета розгортання лямбда.
  • Під час тестування ми з’ясували, що відео, зняте на пристроях iOS, після трансформації перетворювались з портрета на пейзаж (обговорення StackOverflow та форум AWS). Причиною цього є відео, зняте на пристрої iOS, спочатку зберігається в ландшафтному режимі з прапором у метаданих відео, які сповіщають плеєр обертати відео під час відтворення. Під час трансформації ідентифікатор обертання втрачається, і через це відео відтворюється в альбомному режимі і виглядає, як поворот.
  • Щоб подолати це спочатку, ми визначили ці відеозаписи за допомогою ffmpeg. Ці відео мають значення "обертання" у "Матриці відображення" метаданих відео, які можна отримати за допомогою ffmpeg. Потім оберніть ці відео на основі заданого обертання, і тепер у вас є обернене відео, яке можна легко трансформувати за допомогою наведеної вище методики.

Якщо ви вважаєте цю статтю корисною, будь ласка, натисніть кнопку хлопання стільки разів, скільки вам подобається. Будь ласка, не соромтеся зв’язатися, якщо вам потрібна допомога на будь-якому кроці, зазначеному вище.