[Из песочницы] Linux, Open Source и современное телевидение

Примерно год назад было принято решение о запуске нового телеканала высокой чёткости. Встал вопрос о техническом оснащении имеющейся аппаратной по выпуске SD каналов, новым оборудованием. И первое что приходило в голову — расширить имеющийся комплекс Skylark, «докупив» оборудование. Посчитав примерные затраты, руководство пришло в лёгкий шок — цены кусались. И вот тут-то у меня родилась идея, построить эфирный комплекс на Linux.Изучив имеющиеся решения, пришел к выводу, что только труд поможет осуществить задуманное. Прикинул масштабы бедствия и ответственность перед заказчиком канала, в лице «Ростелеком», сделал глубокий вдох и отправился к руководству.Выслушав идеи, задав несколько уточняющих вопросов, видимо, приняв во внимание прошлые мои проекты, принял решение немного приостановить процесс принятия решения о покупке готового комплекса, дав мне шанс воплотить идеи в нечто «материальное», за что ему огромное спасибо.Итак, задача выглядела следующим образом: создать автоматизированный комплекс по выпуска HD канала, основываясь на существующих телевизионных стандартах и имеющий, при необходимости, возможность сопряжения с другими «стандартными» устройствами.

Первым делом предстояло самое сложное, сделать playout сервер, умеющий воспроизводить файлы по расписанию, синхронизировать время по GPS и/или NTP, подгружать недостающие, проверять на пригодность имеющие, накладывать несколько слоёв графики и ещё сообщать о своём состоянии и возможных проблемах по электропочте и/или СМС.

В качестве «всеядного плеера», естественно, был выбран ffmpeg, но не как есть, а в виде фреймворка под названием MLT Framework. Очень мощная вещь, но сделанная по принципу «ничего лишнего». К данному фреймворку было добавлено кэширование чтения файлов с диска, синхронизация времени воспроизведения (не системной службы, а именно фреймворка) с NTP. Переписан модуль наложение графических слоёв с использованием OpenGL. В отдельных потоках были организованы доступ к MySQL, подгрузка файлов с удалённых хранилищ по протоколу BitTorrent (чуть позже объясни зачем), а так же поток следящий за текущем воспроизведением и выполняющий добавление файлов в плейлист и удаление вышедших из эфира.

В качестве «выходного» модуля в сервере используется плата ввода-вывода от Blackmagic. Это компания делает интересное железо, но вот с программными компонентами, такими как драйверы и прошивки, у них вечная проблема. В результате чего пришлось искать более-менее стабильную версию драйверов. Выбор остановился на версии 9.8. Последующие версии имели интересные «плюшки», но плата переставала воспроизводить звук по SDI примерно через сутки.

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

Для этого на Qt был сделан интерфейс для загрузки готовых плейлистов в форматах xls и csv, а также возможностью формировать плейлист путём перетаскивания элементов из базы.

Спустя месяц, всевозможные проверки сервера были завершены. К тому моменту был готов интерфейс пользователя и произведена загрузка контента в базу.Пришло время показать предварительный результат и получить согласие на дальнейшие действия. Всё прошло как по маслу. И, как следствие, началось развертывание инфраструктуры на «боевых» серверах.Был поднят основной и резервный playout, несколько энкодеров, которые тоже были написаны и проверенны в общей связки, обеспечивающие транскодирование «тяжёлых» MXF и MOV в x264.

Так как основной кластерный массив на infiniband и файловой системой Lustre находился вне эфирной аппаратной, необходима было доставлять контент на сервер. Здесь и был задействован BitTorrent протокол. В данном случае, его использование было обусловленно увеличением отказоустойчивости. Сервер имеет свой собственный файловый массив RAID-10 mdadm. Но бывает всякое, и в случае выхода из строя массива, сервер начинал тянуть контент, используя возможность протокола BitTorrent, последовательно скачивать файл. А как только массив восстанавливался — переключался обратно. Плюс, это повышало оперативность замены плейлистов. Предположим, по тем или иным причинам, был изменен фильм, который, вот прямо через две минуты, должен был начаться. В этом случае сервер начинал скачивать фильм с основного массива и параллельно обмениваясь данными с резервным.

В качестве потокового энкодера mpeg-ts x264, так же был выбран Open Source продукт, но об этом, возможно, в следующий раз.

Система была готова начать эфир. Спустя несколько месяцев подготовительных работ, закупки контента, озвучания и внесения в базу, был запущен технический эфир. А спустя ёще месяц, 1 октября 2014 года, система начала вещание на всею территорию России.

Этот пост не столько о Linux, Open Source и телевидении, сколько о том, что можно и нужно осуществлять идеи. И тогда, накоплены опыт обязательно поможет вам создать что-то новое и, возможно, даже гениальное.

© Habrahabr.ru