Webcaster

rthraph - многопоточный видеоконвертер-вещатель для проекта Webcaster, разрабатывается фирмой Inventos. Принцип работы похож на DirectShow или GStreamer - выстраивается цепочка фильтров-обработчиков, через которые проходят кадры видео или звука.

Моей первой задачей было собрать rtgraph из исходников. Проблема в том, что для сборки требовались конкретные версии сторонних компонентов и библиотек, зачастую устаревших и несовместимых с системными. Инструкция по сборке предполагала часть библиотек установить из стандартного репозитория Debian, а часть собрать из исходников, хранящихся в определенных местах. При этом, они не всегда собираются из-за несовместимости с современными библиотеками boost, thrift - то есть их тоже нужно собирать из устаревших исходников.

В качестве решения я написал скрипт на shell (sh), который скачивает необходимые исходники компонентов в отдельную папку проекта, устанавливает переменные окружения нужным образом, компилит сначала независимые компоненты, потом инсталлирует их библиотеки и заголовки в специальную папку проекта и дальше настраивает компилятор так, чтобы он использовал эти (локальные) библиотеки, а не системные. Проверяются свойства системы (версия ядра, наличие требуемых файлов и строк в заголовках) и соответственно перестраиваются скрипты окончательной сборки проекта. Например, в разных версиях ядра по-разному называются функции работы с DVB. В новых ядрах работа со звуком уже встроена, а в старых нужно использовать внешнюю библиотеку. Все эти ситуации учитывались скриптом, новые ситуации добавлялись по мере обнаружения.

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

Далее, мне поручили написать парсер потока MPEG-TS, чтобы обнаружить причины несовместимости потоков для устройств Apple, генерируемых ffmpeg и родными яблочными утилитами. Пришлось вникать в тонкости работы цифрового вещания, но в итоге парсер был готов и причина несовместимости обнаружилась - в недостаточной точности тайминга пакетов.

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

Но управление вещателями (запуск, перезапуск, остановка) и настройка вещаемых каналов производится вручную, в командной строке и в конфигах rtgraph. Конфиги довольно сложные, с кучей параметров. И при этом нифига не документированные. Есть полсотни готовых конфигов, и если нужен новый, то берется похожий старый и в нем меняются самые очевидные настройки. Что означают многие параметры - никто не знает. Поэтому я начал (и закончил) написание подробной документации по фильтрам и их параметрам. Для этого пришлось внимательно прочитать все исходники проекта и разобраться во всех деталях. В результате получилась понятная и подробная документация по вещателю, по всем фильтрам, а также описание основ работы ретранслятора и его основных объектов, что позволило легко создавать новые фильтры. А также навести порядок в конфигах - разделить конфиги на базовые настройки (описание канала, откуда его брать и куда транслировать) и на общие шаблоны (составные части конфига, куда подставляются базовые настройки). В итоге настройка канала сводится к изменению базовых настроек и выбора шаблона цепочки фильтров.

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

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