Реализация системы конвертирования видео

 

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

В данной статье мы расскажем о нашей точке зрения на внедрение подобных систем, приведем примеры функций системы, используемые для существующих приложений. Демо-версия нашей системы написана на языке Java (Spring + Hibernate), в ней использованы FFmpeg в качестве конвертера, JMS для взаимодействия с внешней системой и для внутренних коммуникаций.

Цели системы

Система конвертации видео предназначена для выполнения следующих задач:

  • Конвертировать видео в нужный формат по требованию внешней системы.
  • Уведомлять внешнюю систему о том, что конвертация закончена, включая в отчет информацию о результатах конвертации (успешно ли она прошла или закончилась неудачей и т.д.)
  • Обеспечивать возможность мониторинга системы администратором
  • Обеспечивать возможность отмены задачи
  • Обеспечивать автоматическую балансировку нагрузки

В дополнение ко всему вышеперечисленному, система видео конвертации должна соответствовать следующим техническим требованиям:

  • Система должна быть полностью независима как от основного приложения, так и от доменной модели или архитектуры внешнего приложения, все это дает возможность использовать систему неоднократно
  • Обеспечивать высокий уровень масштабируемости
  • Система должна быть надежной
  • Система также должна предотвращать потерю данных

Архитектура

Для того чтобы достичь высокого уровня производительности и при этом сохранить невысокую стоимость усовершенствования системы, мы внедрили асинхронную архитектуру конвертации видео с несинхронными процессами, поэтому система может легко масштабироваться для обработки большого количества асинхронных процессов.

Компоненты системы

Система состоит из диспетчера по конвертации видео и нескольких клиентов для конвертации видео, непосредственно проводящих конвертацию.

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

Также диспетчер предусматривает необходимые опции для управления и мониторинга системы.

Клиент конвертирует видео, используя FFmpeg, запуская его как отдельный процесс операционной системы и затем в случае,если конвертация прошла успешно, сохраняет ее результаты в хранилище ресурсов.

Каждый клиент обладает уникальным именем, назначаемым системным администратором. Схема 1:

Краткое описание работы

Рабочие процессы системы могут быть представлены в виде следующей схемы:

  • Внешняя система генерирует событие, в котором бы содержатся все необходимые для конвертации данные. Событие обрабатывается сервером конвертации видео
  • Во время обработки события, сервер создает задачу конвертации видео, сохраняет ее в базу данных, затем, если присутствуют свободные клиенты, задача перенаправляется к одному из клиентов для ее выполнения. Если свободных клиентов в данный момент нет, то задача ставится в режим ожидания. Сервер вернется к этой задаче тогда, когда появится свободный клиент. Внутренний JMS используется для передачи задач.
  • Клиент получает задачу, определяет, где находится искомый ресурс. Он выбирает подходящее соединение с хранилищем и загружает ресурс.
  • Клиент посылает сообщение, сообщающее серверу о том, что началась конвертация видео, запускает FFmpeg как отдельный процесс и ожидает его окончания. Если FFmpeg не выключается после некоторого времени, то клиент сам завершает его и сообщает об ошибке серверу, путем посылки JMS сообщения. Сообщение об ошибке также формируется, если FFmpeg завершил свою работу с ошибкой.
  • Если FFmpeg завершает свою работу корректно и итоговый файл содержит необходимую информацию, считается, что конвертация прошла успешно. Клиент загружает результат в хранилище ресурсов и уведомляет сервер, посылая ему JMS сообщение.
  • Сервер перенаправляет информацию о начале и завершении конвертации видео в основную систему.

Процессы коммуникации

Как уже было сказано выше, вся коммуникация осуществляются через JMS. Диспетчер сообщается с внешней системой, используя JMS topic. Для внутренней коммуникации мы также используем JMS topic.

Для того, чтобы облегчить процесс введения системы в действие, мы используем объектные сообщения и вся информация посылается как объект (событие-объект) внутри сообщения.

Подробнее о процессах коммуникации:

  • При запуске сервер посылает сообщения всем клиентам для того, чтобы определить их номера и статусы. Также сервер просматривает имеющиеся задачи, чтобы найти неотправленные, и если подобные задачи присутствуют – направляет их к клиентам.
  • Через определенный период времени (его можно настроить) сервер снова посылает сообщение всем клиентам, чтобы определить их номера и статусы. Это может быть полезно, когда новый клиент был запущен или остановлен уже после получения последнего запроса. Клиенты, которые не отвечают продолжительное время, помечаются как не отвечающие (подобные клиенты не участвуют в конвертации до тех пор, пока сервер не получит от них отклика, если задача назначается такому клиенту, то она перенаправляется другому). Клиент также может дать информацию о том, что в настоящий момент занят (с указанием задачи, которой он сейчас занят) или свободен.
  • Такой подход, когда клиент сообщает серверу о своем текущем статусе позволяет нам добавлять и удалять клиентов, не прерывая процесс, обеспечивая дополнительную возможность масштабировать систему.
  • Клиенты довольно пассивны в процессе коммуникации. Они только посылают сообщение в начале и завершении конвертации, и сообщение о своем статусе (свободен/занят).
  • Балансировка нагрузки в системе довольно проста. Поскольку мы используем FFmpeg для конвертации, мы совсем не можем повлиять на процесс конвертации, поэтому мы только выбираем первого свободного клиента и назначаем ему задачу. Если свободных серверов нет, задача ожидает до тех пор, пока новый клиент не запустится (клиент будет добавлен в сервер автоматически) или пока один из существующих серверов освободится.

В системе видео конвертации присутствует ряд объектов для передачи данных, событий и интерфейсов для использования во внешней системе. Ниже представлен перечень этих объектов:

  • Video Conversion Info. Этот объект для передачи данных содержит информацию о конвертации, включающую порядковый номер исходных и конвертированных видео ресурсов, а также тип хранения для того, чтобы система конвертирования могла правильно выбрать соединение с хранилищем. Данный объект создается внешней системой. Он распределяет все ресурсы и посылает их диспетчеру.
  • Перечень событий, включая Video Conversion Started Event (генерируется, когда клиент начинает конвертацию), Video Conversion Finished Event (запускается, когда клиент заканчивает конвертацию), Video Conversion Requested Event (запускается внешней системой, когда необходимо провести конвертацию) и Video Conversion Task Accepted Event (запускается диспетчером, когда задание получено и поставлено в очередь).
  • Также для конечных пользователей предлагается интерфейс Resource Storage Connector, необходимый для реализации различных вариантов хранения данных. В нашей системе мы используем Amazon S3.

Заключение

Описанная система конвертации видео использовалась в реальных проектах, включая архитектуру системы, использованные алгоритмы и подходы.