8 августа 2012 г.

Трансляция видео в сети по расписанию или как я делал "телевидение"

Задача: сделать трансляцию видео роликов с какой-то очень важной социальной информация с web-сервера на несколько телевизоров, расположенных в самарских вузах. Телевизоры, ясное дело, подключены к компьютерам с выходом в интернет.

Модель "трансляции"

Казалось бы, что сложного - делаем потоковое вещание с помощью, например, VLC или его аналогов. Однако, нужно принять во внимание два важных момента: во-первых, в Самаре интернет в учреждениях не блещет скоростями (особенно там, где adsl-соединение), во-вторых, когда речь идет о роликах длительностью 0.5-1.5 ч., пускать их в режиме потока — чрезмерный расход трафика. Ко всему прочему, частота обновления контента пока будет очень далека от "реального времени".

В общем, необходимо разработать более экономичное решение. Чем я и занялся.

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

В итоге, наиболее рабочим вариантом было признано копирование по расписанию видео контента с ftp-сервера на локальные компьютеры и воспроизведение с них необходимых роликов. Задача свелась к следующему:
  1. Настроить планировщик по расписанию, который будет делать зеркало ftp-сервера на локальный диск
  2. По расписанию запускать видео плеер с загруженным в плейлист контентом
  3. По расписанию выключать видео плеер


И так каждый день с понедельника по пятницу.

1. Зеркалирование ftp-сервера

Хотелось найти легкое и надежное решение задачи по копированию видео контента с ftp-сервера. Варианты были: различные download-менеджеры, ftp-клиенты типа Total Commander и т.п. и всякие другие варианты. Явный минус был в том, что программы эти громоздкие, создают ненужные записи в реестре (тут я, конечно, уже придираюсь) и ряд прочих минусов. В итоге была выбрана свободная консольная программа с исходным кодом Wget. Вообще, эта программа из семейства GNU/Linux дистрибутивов, но благодаря высокой популярности она мигрировала и в Windows.

Наша задача по созданию зеркала ftp-сервера решается следующей командой:

wget --passive-ftp -nd -N -m -q -P путь ftp://логин:пароль@хост

Расшифровка ключей:
  • --passive-ftp - пассивный режим. Большинство (из тех что я встречал) хостингов поддерживают только пассивный режим соединения
  • -m - создает зеркало ftp-сервера на локальном компьютере, т.е. полный перенос данных
  • -nd - не создавать поддиректории. Все содержимое сервера копируется в одну папку
  • -nc - продолжение загрузки с места разрыва. Как выяснилось, эта опция устанавливается "по умолчанию", по этому из перечная ключей я её убрал
  • -N - сравнение по дате, замена более новым файлом. Если имя файла на сервере и локально совпадают, то сравнивается их дата. Копирование происходит только если на сервере более новый файл
  • -q - выключить сообщения wget и не вести лог, "тихий режим работы". В последствии он был заменен на "-a путь" - сохранять лог в указанный файл путем добавления (бывает полезно иногда логи посмотреть)
  • -P путь - указывает каталог, в котором будут размещаться получаемые файлы.

Более подробную документацию по Wget можно прочитать здесь: http://www.opennet.ru/man.shtml?topic=wget&category=1&russian=0 и http://linuxland.itam.nsc.ru/misc/wget/index.html

2. Видео плеер

Требования к плееру: свободный, кросс-платформенный, с поддержкой ключей из командной строки. Вот он - VLC Media Player.

Воспроизводить видео надо так: на весь экран, поверх всего остального,  без курсора мыши, с повтором всего плейлиста и, желательно, с наложением "водяного знака" поверх видео потока (последнее условие в рабочей версии отменилось). Все эти задачи можно решить с помощью набора соответствующих ключей. Команда получилась такая:

vlc --fullscreen --video-on-top --no-video-title-show --mouse-hide-timeout=0 --high-priority --repeat open="file:///путь/"

Расшифровка ключей:
  • --fullscreen - полноэкранный режим
  • --video-on-top - поверх всех окон
  • --no-video-title-show - не выводить заголовок файла
  • --mouse-hide-timeout=0 - спрятать сразу курсор мыши
  • --high-priority - высокий приоритет (на всякий случай)
  • --repeat - повтор файла. Если надо повторять весь плейлист (в случае, если там несколько файлов) - нужно использовать ключ --loop
  • --open="file:///путь/" - путь до нашей директории с контентом. В WinXP путь работает в формате "<диск>:\<каталог>, в Win7 - с префиксом "file:///" и обычными слэшами в адресе (веб-стандарт).

Еще одна удобная особенность VLC выяснилась в процессе работы с ним: ключ --open="file:///путь/" добавляет в плейлист все поддерживаемое содержимое указанной категории.

Нашелся один недостаток совместного использования ключей --sub-filter="logo" и --no-video-title-show. Если отключен вывод заголовка файла, то и водяной знак (--sub-filter="logo") показываться не будет. Как выяснилось в ходе переписки с разработчиками, это "Known issue" и вообще "учите матчасть". Но, как я уже отметил, в ходе запуска необходимость в водяном знаке вообще отпала и конфликт ключей был исчерпан.

Когда писал эту команду с ключами, вспомнил времена MS-DOS и навороченных (по тем временам) архиваторов типа LZH и подобных - уже очень давно не делал таких длинных команд. Подробную документацию по ключам VLC можно прочитать здесь http://wiki.videolan.org/VLC_command-line_help

Кстати, VLC может работать в portable-версии (без установки). В этом случае нужно указывать абсолютный путь до vlc.exe.

3. Планировщик задач

Казалось бы, можно далеко не ходить и воспользоваться встроенным в Windows планировщиком. Но, в том случае, если на клиентских машинах окажется Linux, например, это решение окажется не подходящим. Хотелось сделать кросс-платформенный вариант (или как минимум вариант с легко заменяемыми компонентами между ОС).

Вариантов было не много, из чего можно выбрать. По этому планировщиком стал nnCron - бесплатная программа (для exUSSR) с открытым кодом и достаточно мощными возможностями. Важно, что для MS Windows 7 нужна самая последняя версия (на момент написания статьи это http://www.nncron.ru/download/nncron193b10.exe) и при установке опция "Системная служба" должна быть отключена.

Интерфейс nnCron


У nnCron есть интуитивно понятный графический интерфейс, создание и редактирование  задач осуществляется с его помощью - здесь нет ничего интересного. В общем виде задача выглядит так:

#( название_задачи
NoLog - записывать отчет в лог или нет
Time: 0 3 * * 1-5 * - время и дата в cron формате
Action:
StartIn: "[путь]" - каталог запуска
SWHide NormalPriority - свернуто, в нормальном приоритете
START-APP: [команда_запуска]
)#


Вместо "[команда_запуска]" нужно только подставить выше перечисленные команды для соответствующих приложений. Так же верно выставить время и дату(ы), т.е. периодичность, выполнения задания. Более подробно про работу cron и его синтаксис можно прочитать в энциклопедии.

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

#( vlc_off
Time: 20 19 * * 1-5 *
Rule: PROC-EXIST: "vlc" - условние, если такой процесс существует
Action:
WIN-TERMINATE: "vlc" - закрыть процесс с именем vlc
)#


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

В рамках поставленной в начале задачи все необходимые условия выполнены, можно запускать собранную систему в дело. У данной реализации есть и свои плюсы (+ все компоненты свободные, + детально настраивается каждый шаг, + при отсутствии связи с сервером не будет простоев и т.п.) и минусы (- требуется вникать в ключи, настройки и т.п., - компоненты все надо устанавливать и кофигурировать отдельно, - пока нет "обратной связи" с планировщиком, - не решен вопрос с тем, если на сервере вдруг окажутся файлы с другим расширением). Над обратной связью, кстати, стоит поработать, уже есть варианты как её наладить (по всей видимости, по email).

UPD1: уже больше месяца система в работе - полет нормальный.

UPD2: коротко про обратную связь. В ходе экспериментов была найдена программа Blat (да, название так себе... Как сказал В. Юмашев о проекте Moodle: "хорошую вещь муделем не назовут"). Это почтовый клиент, работает из командной строки и умеет отправлять email, в том числе с приложениями. Длительного опыта эксплуатации этой программы нет, но на тестах все работало корректно.

2 комментария:

Unknown комментирует...

доброго времени суток...
данная статья для меня оказалась очень полезной... но возник ряд вопросов:
1. можно ли на сервере запустить вещание таким образом, что б у меня каждый день запускался разный плейлист (тот который мне нужен в тот или иной день)
2. как я понимаю с наложением водяного знака - невозможно его выводить постоянно из за того что отключена функция названия материала?
3. что происходит и что выводится на экран по завершению трансляции?

F13 комментирует...

http://axenttv.ru/ каким способом можно сделать видео в AVI контейнере.

Отправить комментарий