Простой, но масштабируемый подход к добавлению функций загрузки и обработки видео в ваше новое приложение.

Введение

По мере того, как пользовательские предпочтения смещаются с изображения на видеоконтент, потребительским приложениям все чаще приходится загружать и воспроизводить видео.

Необходимость иметь дело с видео через ненадежные интернет-соединения требует, чтобы видео обрабатывалось при загрузке и обслуживалось (загружалось другими) с качеством, соответствующим доступной пропускной способности.

Для достижения этих целей было разработано несколько решений, включая предложения SaaS, такие как Mux и AWS Elemental.

Здесь мы рассмотрим простой подход, который может работать как для малых, так и для средних приложений, интегрированных в пользовательский сервер, но использующих инфраструктуру AWS для обработки и обслуживания видео.

Обзор

Подход, который мы разработаем, будет использовать 3 ключевых компонента:

  1. AWS S3: мы будем использовать S3 (с ускорением передачи), чтобы обеспечить масштабируемое и быстрое место для загрузки и хранения файлов.
  2. AWS Lambda: будет использоваться для перекодирования видеофайлов в любое количество желаемых форматов и качества.
  3. Пользовательский бэкенд: бэкэнд Ruby on Rails (подойдет любой язык) для хранения метаданных видео и обслуживания клиентов.

Загрузка выполняется по шагу, аналогичному описанному в статье ниже, когда клиент запрашивает подписанный URL-адрес из серверной части Rails, а затем использует предоставленный URL-адрес для прямой загрузки видеофайла на S3.



После загрузки мы будем использовать событие уведомления S3, чтобы активировать Lambda для обработки видео. Полученные метаданные (например, ключ S3) будут сохранены в пользовательском бэкенде. Полученный поток изображен ниже.

Выполнение

Часть 1: Видеозапись (объект) в бэкенде

Чтобы отслеживать загруженные видео, мы создадим модель в нашем бэкэнде с несколькими важными свойствами:

  • Строка key для хранения ключа S3 исходного загруженного файла и аналогичного атрибута для каждого желаемого производного видео.
  • low_res_key для хранения ключа S3 в производной версии исходного файла с низким разрешением, обработанной Lambda.

В Ruby on Rails необходимая миграция показана ниже:

Соответствующая видеомодель должна включать 2 метода:

  1. Метод назначения уникального ключа новому видео (можно использовать идентификатор видеообъекта).
  2. Метод получения криптографически подписанного URL-адреса загрузки в корзину AWS S3.

Полученная модель показана ниже:

Часть 2. Создание и извлечение видеозаписи из серверной части

Нам нужен способ создания видеозаписей и получения клиентом необходимой информации для загрузки видео в первую очередь.

Чтобы включить это, нам потребуется несколько методов контроллера:

  1. Метод POST для создания новой видеозаписи. Обратите внимание, что при создании видеообъект будет иметь автоматически назначаемый ключ, но этот ключ не будет сразу указывать на существующий файл S3, поскольку фактический видеофайл может быть еще не загружен клиентом.
  2. Метод GET для получения видеозаписи.
  3. Метод PUT, который лямбда-выражение, создающее производные видео, будет использовать для отправки отчета на сервер с ключами для сгенерированных файлов производных.

Часть 3. Обработка загруженного видео

Мы будем использовать событие уведомления S3 для автоматического запуска выполнения Lambda для обработки видеофайла, который только что был загружен на S3.

Мы будем использовать AWS SAM для объявления и развертывания наших Lambda и S3 почти так же, как в статье ниже. Однако вы можете использовать код, предоставленный в оставшейся части статьи, и вручную создать свои Lambda и S3 из консоли AWS.



Создайте структуру папок и файлов, как показано ниже:

video-processor/
├── cmd/
│   └── deploy.sh
├── src/
│   ├── s3-util.js
│   ├── child-process-promise.js
│   └── index.js
├── .gitignore 
└── template.yaml

child-process-promise.js определяет вспомогательную функцию, которая запускает новый процесс внутри обещания. Мы будем использовать его для вызова FFMPEG в основном коде нашей лямбды.

s3-util.js определяет вспомогательный метод для загрузки видеофайлов с S3.

Полный код для Lambda показан ниже в index.js. Его можно разбить на 5 частей:

  1. Загрузите видеоресурс с S3 в рабочий каталог Lambda. Файлы загружаются в /uploads клиентским приложением.
  2. Обработайте загруженный видеоресурс с помощью ffmpeg.
  3. Загрузите только что обработанный видеофайл на S3. Lambda загружает производные файлы в /processed.
  4. Сообщите серверу, что новый файл готов.
  5. Удалить файл из Lambda. Это необходимо, поскольку пространство для хранения лямбда-выражений может распределяться между выполнениями, и если файлы не удаляются, они могут накапливаться и заполнять доступное пространство.

Модель бессерверных приложений AWS (SAM) позволяет определять Lambda и связанные с ней ресурсы в файле YAML, а также автоматически развертывать и обновлять их с помощью инструментов командной строки, предоставляемых AWS.

Файл template.yaml объявляет ресурсы, которые мы будем использовать, и триггер создания файла в папке /uploads (префикс).

Заключение

Мы рассмотрели, как создать инфраструктуру для поддержки загрузки и обработки видеофайлов для мобильного (или аналогичного) приложения. Система должна хорошо масштабироваться, поскольку она использует инфраструктуру AWS для более тяжелых задач, таких как обработка видеофайлов.

Некоторые моменты, о которых стоит упомянуть:

  1. Обработка видеофайлов на стороне сервера не исключает необходимости обработки файлов на клиенте, поскольку исходные файлы могут быть слишком большими для загрузки через разумное интернет-соединение.
  2. Дополнительные производные видео можно добавить, изменив код Lambda, чтобы включить создание большего количества видеофайлов на основе требуемых спецификаций. Например, вы можете захотеть иметь ограниченную по времени версию загруженных видеофайлов для использования в предварительном просмотре.

Если у вас есть какие-либо вопросы или вы просто хотите поговорить о стартапах, предпринимательстве, заключении контрактов или разработке, просто отправьте мне электронное письмо по адресу paulo@avantsoft.com.br.