Представьте себе ситуацию: вам надо показать какой-нибудь видеоматериал большой группе людей, например сотрудникам по предприятию. Решений здесь несколько. Проще всего, наверное, открыть видеофайл на всеобщее обозрение, а на остальных компьютерах просматривать его через видеопроигрыватель. У такого способа есть ряд достоинств: во-первых, не надо никакого специального ПО, во-вторых, можно не заботиться о совместимости с ОС клиентов, в-третьих, файл можно просмотреть в любое время. Однако при большом количестве подключений сервер или канал могут попросту загнуться. Трансляция видеопотоков позволяет избежать этой неприятной ситуации.
В Интернете хватает ПО для трансляции видео. В данной статье речь пойдет о программе VideoLAN (http://www.videolan.org), позволяющей транслировать мультимедиа-потоки из видеофайлов в формате MPEG-1, MPEG-2, MPEG-4 и DivX, цифровых видео и DVD-дисков, цифровых спутниковых и телевизионных каналов, а также «живых» видеотрансляций, полученных от web-камер с высокой пропускной способностью, для отдельного компьютера, небольшой сети и Интернета с поддержкой протоколов IPv4 и IPv6. Для трансляции MPEG-4 потока сеть должна обеспечивать от 0.5 до 4 Мбит/с, для цифрового потока, идущего со спутникового или телевизионного канала, от 3 до 4 Мбит/с, для MPEG-2 потока DVD от 6 до 9 Мбит/с. VideoLAN может работать на компьютерах под управлением различных версий GNU/Linux, BSD-систем, Windows всех версий, MacOS X, BeOS, Solaris, QNX. Программа распространяется по лицензии GPL, т.е. совершенно бесплатно, вместе с исходными текстами. Проект начинался французскими студентами, а теперь поддерживается разработчиками из 20 стран.
В состав VideoLAN входит два приложения:
VLS сервер, транслирующий потоки из файлов;
VLC клиент, транслирующий потоки и способный получать их и декодировать. Также является универсальным видеопроигрывателем локальных файлов, поддерживающим большинство форматов.
Возможно добавление информационной службы канала для VLS-сервера (VLC анонсирует себя сам), основанной на стандарте SAP/SDP. Небольшой сервер SAP объявляет анонсы относительно транслируемых по сети программ, а VLC получают эти сообщения и автоматически добавляют объявленные программы в свой плейлист. Для работы предлагается сервер SAP под Linux и MacOS X. C VLS можно работать только с командной строкой и telnet (при удаленном доступе). VLC же имеет понятный графический интерфейс (точнее, интерфейсы организованные так, чтобы быть в ладах со «своей» ОС), позволяющий настроить большинство параметров но не забыта и командная строка, позволяющая произвести настройку максимально тонко. Модульная структура обеспечивает поддержку новых форматов и функций без необходимости серьезно перекраивать программу. Для организации одного потока достаточно компьютера класса Pentium 100 с 32 Mб ОЗУ и жесткого диска сколько не жалко.
Установка
Более подробно будем рассматривать установку/запуск сервера и клиента на Linux, как несколько более сложную, а также программы, идущие в комплекте с VLC. Под Windows установка происходит так же, как и для большинства программ написанных под эту ОС, конфигурация практически аналогична Linux'овской, а установка и настройка VLC и VLS очень похожи (об отличиях серверов VLS и VLC можно прочитать на страницах Videolan-faq и http://www.videolan.org/streaming/features.html). Хоть впрочем, проблем как с серверной, так и с клиентской стороны у меня было чуть больше с Windows-вариантом программы.
Если используется rpm-based дистрибутив, скачиваем пакеты (для RedHat практически все библиотеки имеются на дисках с дистрибутивом, и наверняка они у вас уже установлены), ссылки на которые можно найти на странице http://www.videolan.org/vlc/download-redhat.html. Далее помещаем все в одну папку, заходим в нее и вводим что-то наподобие:
Смотрим, на отсутствие каких пакетов ругается программа, доустанавливаем и повторяем попытку.
В моем случае после запуска в дистрибутиве Vector-Linux программа ругалась на несоответствие версии библиотеки glibc (ftp://ftp.gnu.org/gnu/glibc) у меня стояла более ранняя версия 2.2.5, а требовалась версия старше 2.3. В таком случае можно собрать все самому из исходников, этот же вариант подходит и для других систем, для которых нет прекомпилированных пакетов (для *BSD, например); в откомпилированных же пакетах может отсутствовать поддержка необходимого модуля или, наоборот, мешать что-нибудь лишнее. Для установки могут понадобиться еще несколько дополнительных библиотек; если же, например, не нужна поддержка DVD, ее можно отключить, введя на стадии конфигурирования VLC опцию disable-dvd. Так же можно поступить и с остальными ненужными опциями.
libdvdcss если понадобится читать зашифрованные DVD-диски (кстати, модуль не обращает внимание на зоны);
libdvdplay если нужно меню навигации DVD-дисков;
libdvbpsi чтобы читать TS/DVB-потоки видео со спутников или цифрового телевидения;
a52dec при необходимости декодировать звук в формате AC3 (A52), принятом в DVD;
ffmpeg, libmad и faad2 для чтения файлов MPEG 4/DivX;
libogg и libvorbis для поддержки звукового формата Ogg Vorbis;
lirc если хочется управлять всем этим с пульта ДУ (пример конфигурационного файла можно найти в doc/lirc/example.lircrc);
Каждую библиотеку распаковываем:
Заходим внутрь образовавшегося каталога и конфигурируем (в общем случае без дополнительных опций):
И наконец, стандартные make и make install.
С VLC ситуация аналогична. Скачиваем с http://www.videolan.org/vlc/download-sources.html, распаковываем и для ознакомления с опциями конфигурирования вводим ./configure help, особое внимание обращаем на те, напротив которых стоит default disabled. По сравнению с версией 5, количество опций значительно увеличилось. Определяем ненужные, конфигурируем. Например, так (естественно, должны быть установлены и соответствующие библиотеки с файлами заголовков):
Т.е. программа устанавливается в каталог /usr/local. Принудительно включаем поддержку Gnome и KDE, устройств Video4Linux (TV-тюнеры, видеозахват, web-камеры), звукового сервера KDE Arts, звуковых драйверов ALSA (Advanced Linux Sound Architecture), библиотек QT и FAAD, а также плагина для web-браузера Mozilla и поддержку скинов. Опять же, после окончания процесса конфигурирования традиционные make и make install.
Кстати, в архиве есть файлы для построения rpm-пакетов (ввести rpm -ba vlc.spec), для Debian (dpkg-buildpackage -rfakeroot -us -uc) и ebuild-файл для Gentoo, что уже делает честь разработчикам. Все, с установкой покончено, запускаем.
Работаем
Запустить VLC во всех перечисленных выше ОС можно как из меню, в котором встраивается ярлык программы (в Linux только Gnome и KDE), так и из консоли, введя vlc (в Windows придется вводить полный путь к экзешнику). В результате перед нами предстанет главное окно программы. Теперь можно просмотреть локальный видеофайл, создать поток из перечисленных выше источников, в том числе и с контролем на локальном компьютере, и подключиться к имеющемуся потоку. Разберем по порядку.
Просмотр файла
В командной строке вводим:
И наслаждаемся полученным результатом. Программа сама подберет необходимый декодер. При неудаче его можно задать вручную при запуске.
Для DVD или VCD запускаем с такими параметрами:
Это для Windows, где g ваше DVD-устройство, параметры после @ необязательны, они означают номер дорожки и пр.:
А это для Linux просмотр видеодиска
При помощи системы меню это еще проще: открыть меню File и выбрать нужный пункт.
Создание и просмотр потока
VLC (как и VLS) может создавать два вида видеопотока: unicast и multicast (возможно применение сразу двух вариантов одновременно). В первом случае видеофайл разбивается на пакеты и отправляются по индивидуальному IP-адресу, указанному при запуске; принимающая сторона просто считывает данные, поступающие на открытый для приема UDP-порт (по умолчанию программой используется 1234; использовать TCP-пакеты, подтверждающие прием, в данном случае смысла особого нет это только увеличит нагрузку на канал). Во втором случае сервер транслирует передачу на специальный групповой IP-адрес, с которого и считывают информацию многочисленные клиенты. Для создания потока вводим такую команду:
где videofile.avi транслируемый видофайл, udp://192.168.0.42 unicast IP-адрес (имя DNS) отдельного компьютера или multicast IP-адрес для общесетевой трансляции, ttl означает «Time To Live», т.е. время жизни пакета: каждый маршрутизатор уменьшает его значение на единицу, и когда ttl становится равным 0, пакет уничтожается. Таким образом, установив его значение в 1, мы не допустим попадания трансляции в глобальную сеть. Можно отправить в сеть и содержимое DVD-диска:
Для трансляции DVD или VCD под Unix потребуется право на запись в /dev/dvd (/dev/cdrom); для этого включите пользователя, от имени которого запускается сервер в группу cdrom (если нет, создайте), или при трудностях с предыдущим пунктом введите просто:
Аналогичным образом можно транслироватьсигнал и с других источников.
Подключаемся к unicast-потоку таким образом:
В случае другого порта, отличного от «умолчаемого», указываем и его.
При multicast добавляется еще и IP-адрес.
Если с unicast все заработало сразу и без особых проблем, то вот с multicast вышла небольшая заминка. Дело в том, что в документации найти вразумительное объяснение, что это за адрес такой, удалось не сразу. Логично было бы поначалу предположить, что это IP-адрес самого компьютера, используемого в качестве сервера. Но подобные установки успеха не возымели, да и в таком случае пришлось бы клиентам подключаться к серверу, что сразу ставит ограничение на их количество, да и понятие трансляции в таком случае приобретает немного иной смысл. Сканирование серверных портов утилитой nmap огорчило нужный, 1234-й, открыт не был. Следующей идеей было транслировать на незанятый в сети IР-адрес опять неудача. Но на этот раз параллельно, чтобы видеть, что происходит в сети, я запустил утилиту tcpdump:
Результат немного озадачил. Сервер пытался при помощи протокола ARP (Addres Resolution Protocol, протокол разрешения адреса) разобраться, что это за компьютер такой с IP-адресом 192.168.0.223, а сам в этот момент непринужденно слал информацию по протоколу UDP в адрес 224.2.127.254, порт 9875. Ну, думаю, поймал наконец мелкософт на горячем (сервер тогда испытывался под Windows). Пришлось RTFM'ить, что это за адрес. Оказалось все просто: диапазон адресов от 224.0.0.0 до 239.255.255.255 специально забронирован для широковещательных передач. Поэтому для multicast выбираем любой понравившийся из этого диапазона и настраиваем на него как сервер, так и клиентов. И кстати, приведенный выше адрес зарезервирован по умолчанию для службы анонсов SAP, автоматически добавляющей трансляции в плейлист. Можно воспользоваться для трансляции и стандартным для любой сети адресом, заканчивающимся на 255, также отведенным под широковещательные пакеты, но в большой сети это может помешать нормальной работе некоторых служб, плюс ко всему такие пакеты удаляются маршрутизаторами автоматически, а значит, в Интернет они не попадут, как бы вы этого не хотели.
В меню поток можно организовать, открыв нужный источник при помощи, например, File > Open File; далее через Browse выбираем нужный файл, на этой же странице внизу ставим флажок напротив Stream Output и на появившейся странице либо вручную забиваем нужные параметры в строке Destination Target вверху страницы, либо (что легче) выбираем их из менюшек, активировав Play Locally; здесь же можно и просматривать, то что уходит в сеть. А для приема открываем File > Open Network Stream и выбираем нужные параметры (полученный поток можно тут же перетранслировать на другой адрес).
А теперь, чтобы вы представляли, на что способна эта утилита, кратко пробегусь по advanced-возможностям VLC.
Продвинутые возможности
Добавив в строку запуска параметр ipv6, можно использовать протокол IРv6, хотя на данный момент такая революция возможна разве что в отдельно взятой сети, но такой задел на будущее по крайней мере разумен. Следующая очень полезная в хозяйстве вещь transcoding. При этом исходный файл на лету может перекодироваться в любой из поддерживаемых форматов и затем уже отправляться в странствие или сохраняться на жестком диске (опция File во вкладке Stream Output). Активировав пункты Audio и Video codec в поле Transcoding Options, можно установить кодек, битрейт и количество аудиоканалов. В командной строке подключаем все при помощи опции transcode (если нравятся такие приятные на вид конструкции):
Т.е. получаем очень неплохую и к тому же универсальную программу грабления видеодисков и захвата видео. При помощи модуля duplicate можно разделить входящий поток на два и затем каждый обработать по своему усмотрению.
При необходимости можно использовать и http-streaming, когда клиенты подключаются почти к вашему компьютеру как к обычному web-серверу, только в ответ на запрос получают не текстовый файл, а видеоданные. Сервер в таком случае запускается так.
Теперь, подключившись через клиент VLC, получаем информацию:
Кстати, протестировать сервер можно и при помощи обычного браузера если на экран будет выводиться мусор, значит, все работает. Все хорошо, но пользователю иногда не очень нравится довольствоваться пасивным созерцанием, а хочется самому запустить нужный файл, останавливать просмотр, перематывать неинтересные участки, а с потоковым видео такой вариант не пройдет. И эта возможность реализована в VideoLAN, называется она Video On Demand (VOD, видео по требованию). Для его реализации запускается Web-сервер (например Apache), в один из каталогов которого кладется нужный видеофайл. При помощи клиента VLC подключаемся к этому серверу и запускаем файл на просмотр.
Напомню, что видеопроигрываетель xine (http://xine.sourceforge.net) имеет опцию MRL (media resource locator), позволяющую передать ему на проигрывание любой файл, находящийся на http-сервере (и не только). Но надо помнить, что такой подход здорово нагружает канал.
И напоследок. VLC совсем недавно получил поддержку скинов, пока доступную только под Windows (устойчиво работает на Windows 2000/XP ) и X11-based OSes пока только в Linux. Изменить текущий скин, который можно загрузить с сайта из меню (View > Add Interface >skins) или при запуске программы. Для Windows:
Многие параметры, чтобы не набивать всякий раз, можно прописать в конфигурационном файле. Для Linux/Unix находится в $(HOME)/.vlc/vlcrc. Для Windows 95/98/ ME в C:\Windows\Application Data\vlc\vlcrc, а в Windows XP/2000: C:\Documents and Settings\username\Application Data\vlc\vlcrc.
Мне приятно описывать программы, функциональность которых не намного шире отведенного в журнале места. Ответы на все вопросы о возможностях программ проекта VideoLAN можно найти в документации, которой на сайте более чем достаточно.