В одном из прошлых номеров я рассказывал о том, как создать свой собственный потоковый музыкальный сервер. На эту статью пришло довольно много откликов с просьбой дать более подробную информацию о вещании, как аудио, так и видеопотоков. Сегодня мы продолжим разговор об mp3-серверах, подробно остановимся на потоковых киносерверах и затронем не менее интересную тему - телевидение и сеть. После прочтения ты сможешь, используя самый обычный ТВ-тюнер и свой любимый дистрибутив линукса, не только сам смотреть телепередачи, но и показывать их своим односетчанам! Мал ffmpeg, да дорог Разработчики ультрабыстрого аудио/видео конвертера ffmpeg с недавнего времени закрыли анонимный доступ к своему CVS-репозиторию, поэтому придется скачать автоматически генерируемый ежедневный снапшот исходного кода. После распаковки архива перейдем в созданный каталог, озадачим скрипт configure инсталляционным каталогом, скомпилируем и установим: $ tar zxvf ffmpeg-cvs-YEAR-MONTH-DAY.tar.gz $ cd ffmpeg-cvs-YEAR-MONTH-DAY $ ./configure --prefix=/usr/local/ffmpeg $ nice make # make install В итоге мы получим статически слинкованные (т.е. не зависимые от программных библиотек) кодек libavcodec для воспроизведения видеоданных и ffserver для реализации потокового вещания. Простейший конфигурационный файл (синтаксис которого очень напоминает конфиг Apache) потокового mp3-сервера может состоять всего лишь из четырех строчек: # vi /etc/ffserver.conf File /path/to/mp3/girls.mp3 Format mp2 Хотя, конечно же, корректней будет сразу задать все необходимые параметры: File /path/to/music/girls.mp3 Format mp2 AudioCodec mp3 AudioBitRate 64 AudioChannels 1 AudioSampleRate 44100 NoVideo Запускаем ffmpeg-сервер и проверяем, за'bind()'ился ли он на дефолтный 8080 порт: # /usr/local/ffmpeg/bin/ffserver -f /etc/ffserver # netstat -na --inet | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN Если у тебя этот порт занят апачем или проксей, то в конфиге просто переопредели его значение директивой Port: Port 8090 Что же подразумевают под потоковым аудио и видеовещанием? Обычно мы действуем последовательно: с удаленного сервера скачиваем на винт нужный файл и скармливаем его проигрывателю. В случае с потоковой информацией все происходит совсем по-другому: сервер, на котором хранятся транслируемые данные, единовременно осуществляет одностороннюю доставку всем клиентам, подписавшимся на определенный виртуальный канал. Доставка происходит односторонняя, так как пользовательские плееры не отправляют никаких команд на сервер, а просто воспроизводят полученные данные в реальном времени, не сохраняя их на жесткий диск. Теперь для проверки на клиентской машине открываем Winamp, указываем адрес только что созданного mp3-сервера: Add -> Add URL http://ip.address.of.ffserver/test.mp3 и наслаждаемся запрошенной композицией. Для трансляции видео поступаем точно таким же способом (тестовый видеоролик sample.asf можно взять из установленного WinXP в каталоге Program Files\Movie Maker): # vi /etc/ffserver.conf File /path/to/movies/sample.asf Format asf Перезагружаем ffserver, вызываем Windows Media Player и вводим в адресную строку расположение, обрати внимание, не ролика, а созданного потока: File -> Open URL http://ip.address.of.ffserver/test.asf. Если возникнет необходимость транслировать видеоданные без звукового сопровождения, то следует добавить директиву NoAudio. Как ты мог заметить, в приведенных выше примерах файлы транслируются в сеть <по одному>. К сожалению, ffserver не умеет работать с плейлистами, зато понимает так называемый глоббинг (раскрытие имен файлов): File /path/to/music/* Ограничение пропускной способности и числа одновременно подключенных пользователей; поддержка протоколов RTPS, SDP и списков контроля доступом ACL; работа с самыми различными аудио и видеоформатами: MP3, OGG, AC3, Real Audio, Macromedia Flash, MPEG1, MPEG4; журналирование пользовательских запросов - со всеми этими задачами прекрасно справляется ffserver. Очевидно, что при минимальных системных требованиях сервер ffmpeg предоставляет достаточно широкие возможности для развертывания потокового мультимедийного сервера, однако практически полное отсутствие документации портит впечатление об этой программе. Какие же задачи мы хотим решать с помощью потокового сервера, и какие компьютерные мощности можем выделить для этих целей? Если планируется создание исключительно mp3-сервера, то вполне достаточно будет P133 с 32 Мб ОЗУ, либо P233 с 64 мегами в случае со связкой Apache + mod_mp3. Для небольшого потокового киносервера потребуется как минимум шустрый селерон со 128 Мб оперативки на борту плюс производительная дисковая подсистема, а для трансляции телепередач по локальной сети хорошей отправной точкой станет PIII, так как сжатие в MPEG1/MPEG4 будет производиться <на лету>. Тестирование проводилось в 100-мегабитной сети. Сервером выступал Celeron600/128mb/80G/Gentoo Linux 1.4rc4. Роль клиентов выполняли компьютеры с установленными Win98SE и WinXP Pro SP1. Кошерное яблочко Прямой противоположностью маленькому, быстрому и свободно распространяемому ffmpeg выступает Darwin Streaming Server - монументальный потоковый сервер от небезызвестной компании Apple. Но не спеши обременять свой download manager новой ссылкой, так как сначала придется немного потрудиться и заполнить на сайте анкету, как всегда согласившись со всем, что предлагают. Только после этой не слишком утомительной процедуры тебе разрешат скачать девять с половиной (нет, не недель) мегабайт удовольствия. Почему удовольствия? Суди сам: поддержка форматов MP3, MPEG1, MPEG4; поддержка протокола SSL для создания защищенных соединений; симпатичный и интуитивно понятный web-интерфейс; удобная работа с плейлистами (drag'n'drop присутствует); простота в администрировании; тесная интеграция с проектом mpeg4ip (кодирование, транслирование и воспроизведение MPEG4). Итак, после того, как ты расправишься с архивом, предстоит произвести ряд не совсем привычных команд, поскольку стандартной установку сервера никак не назовешь: # tar zxvf DSS-4_1_3.src.tar.gz # cd DSS-4_1_3.src # ./Buildit # mkdir altroot # ./DSS_MakeRoot -f altroot # cd altroot # ./Install После выполнения последней команды свежеиспеченные бинарики растасуются по каталогам, затем будет выдано приглашение дважды ввести пароль администратора DSS и вуаля - наш сервер установлен и запущен. Но для возможности конфигурирования через web-интерфейс еще потребуется загрузить перловый скрипт: # /usr/local/sbin/streamingadminserver.pl Теперь в браузере набиваем http://ip.address.of.dss:1220/ и настраиваем потоковый сервер, создаем плейлисты и смотрим в <онлайновые> логи. Процесс конфигурирования абсолютно никаких сложностей не вызывает, поэтому здесь останавливаться не буду. Заботливые разработчики в каталоге /usr/local/movies уже приготовили для тебя по два mov и mp4 файла (в разном качестве), так что можно немедленно приступать к проверке работоспособности сервера. Запускай на клиенте либо QuickTime Player, либо RealAudio Player, вводи rtsp://ip.address.of.dss[:port]/sample_300kbit.mp4 и оценивай результат. Нельзя не упомянуть и о многоплатформенности Darwin Streaming Server. Разработчики портировали свое детище - помимо версии для Mac OS X (родная ось для него) есть версии и под Linux, на Solaris, FreeBSD и даже Windows. Потратив немного времени, мне удалось заставить его работать и на OpenBSD 3.2. Также не забывай поглядывать в bugtraq и обновлять DSS, так как в нем периодически обнаруживают различные уязвимости. Решения от лягушатников VideoLAN Сlient - молодой проект французских студентов, главной целью которого является трансляция потокового видео в локальных сетях. Юникастное и мультикастное вещание по протоколам UDP и RTP; видео по запросу (Video On Demand); поддержка впечатляющего числа аудио и видеоформатов; работа с тарелками, хардварными MPEG-энкодерами, web-камерами, TV-тюнерами и DVD; работа в режиме медиаплеера - все это умеет VLC. На данный момент существуют версии под Windows, Linux, Free/OpenBSD, Mac OS X и BeOS. Определенную сложность может вызвать инсталляция этой программы, так как, например, для полной установки на Red Hat Linux кроме стандартных средств разработки потребуется выкачать и установить около 50 (!) rpm'ок зависимостей. Если же вручную собирать из сырцов полную версию, то потребуется примерно 20 зависимостей. Но легче от этого не становится: Поэтому для тех, кто хочет получить работоспособную программу и в то же время прилично сэкономить на трафике, предлагаю вот такой способ установки: при конфигурировании отключаем все, чем можно пренебречь, а именно: поддержкой DVD, тарелок, исков, буфера кадров, библиотеки SDL, протокола SLP и аудиоформата OGG. При таком подходе ни одной зависимости доставлять не потребуется. $ tar zxvf vlc-0.5.3.tar.gz $ cd vlc-0.5.3 $ ./configure --prefix=/usr/local/vlc --disable-dvd --disable-dvbpsi --disable-ogg --disable-vorbis --disable-x11 --disable-xvideo --disable-sdl --disable-freetype --disable-fb --disable-gtk --disable-wxwindows --disable-slp --disable-mad $ make # make install Для того чтобы транслировать файл (в данном случае в формате MPEG1), достаточно ввести следующую команду: # /usr/local/vlc/bin/vlc /usr/local/movies/cradle.mpg --sout udp://192.168.5.21 Чтобы транслируемый поток направить в другую подсеть, например, через 7 роутеров, нужно добавить ключ -ttl 8 (число роутеров + 1). Для зацикливания проигрываемого файла используй флажок -loop, а для вывода отладочных сообщений -vvv. Теперь для приема видеоклипа на хосте с IP-адресом 192.168.5.21 открываем VLC (win32) и выбираем в меню File -> Network Stream -> UDP/RTP Port 1234. Декомпрессия MPEG у клиента происходит следующим образом: кодек разделяет MPEG-трафик на две составляющие: аудио и видеоинформацию. Аудиоданные декодируются и через усилок попадают на динамики, а видео проходит через анализ и расшифровку фреймов, затем изображение просчитывается и выводится на экран. VideoLAN Server - еще одна разработка кодеров из университета Ecole Centrale Paris. В отличие от клиентской версии, VLS не умеет принимать, декодировать и воспроизводить MPEG-потоки, зато включает в себя telnet-сервер для удаленного конфигурирования и поддерживает протокол IPv6. Серверный вариант требует обязательной установки библиотеки dvbpsi: $ bunzip2 < libdvbpsi-0.1.2.tar.bz2 | tar xvf - $ cd libdvbpsi-0.1.2 $ ./configure $ make # make install И устанавливаем сам VLS: $ bunzip2 < vls-0.5.0.tar.bz2 | tar xvf - $ cd vls-0.5.0 $ ./configure --prefix=/usr/local/vls --disable-dvd $ make # make install # ldconfig Конфигурационный файл VLS неплохо прокомментирован, поэтому для экономии места я приведу только ключевые разделы конфига: # vi /etc/vls.cfg /* Заставляем VLS подвиснуть на 9999 порт */ BEGIN "Telnet" LocalPort = "9999" Use = "true" END /* Указываем абсолютный путь до транслируемого файла */ BEGIN "1" Name = "presentation" FileName = "/usr/local/movies/presentation.vob" Type = "Mpeg2-PS" END /* Определяем виртуальные каналы */ BEGIN "Channels" localhost = "network" client1 = "network" END /* Описываем клиента */ BEGIN "client1" DstHost = "192.168.5.21" DstPort = "1234" END Загружаем VLS: # /usr/local/vls/bin/vlsd -f /etc/vls.cfg Телнетимся на 9999 порт сервера, вводим пасс админа и набираем команду для транслирования презентации: admin@vls> start presentation client1 local1 Сканируем метровые диапазоны Если твой компьютер оснащен ТВ-тюнером с поддержкой SECAM D/K, то рано или поздно у тебя возникнет резонный вопрос: можно ли смотреть телепередачи под Linux? Без проблем! И в этом ты сможешь убедиться прямо сейчас. Но для начала все же проверь, скомпилировано ли твое ядро со всеми необходимыми функциями: Включены ли экспериментальные свойства ядра? Code maturity level options ---> [*] Prompt for development and/or incomplete code/drivers Добавлена ли поддержка загружаемых модулей? Loadable module support ---> [*] Enable loadable module support [*] Kernel module loader Установлена ли поддержка интерфейса I2C? Character devices ---> I2C support ---> I2C support I2C bit-banging interfaces (NEW) I2C /proc interface (NEW) /* опционально */ Присутствует ли программный интерфейс для работы с картами аудио и видеозахвата? Multimedia devices ---> Video For Linux [*] V4L information in proc filesystem (NEW) /* опционально */ BT848 Video For Linux (NEW) Включена ли поддержка звуковых карт? Sound ---> Sound card support VIA 82C686 Audio Codec (NEW) TV card (bt848) mixer support (NEW) Если чего-то не хватает, то сохраняй конфиг, перекомпилируй ядро и после перезагрузки последовательно загружай модули в следующем порядке: # modprobe i2c-core /* поддержка I2C интерфейса */ # modprobe i2c-proc /* доступ к I2C через /proc, опционально */ # modprobe i2c-algo-bit /* поддержка I2C bit-banging интерфейса */ # modprobe tuner type=3 /* тип кодировки SECAM */ # modprobe bttv card=35 /* номер ТВ-тюнера из файла /usr/src/linux/Documentation/video4linux/bttv/CARDLIST */ # modprobe via82cxxx_audio /* моя встроенная звуковуха */ Также не забудь проверить наличие устройства video0: # ls -l /dev/video0 Если получишь отрицательный ответ, то создай его с помощью скрипта MAKEDEV: # cd /usr/src/linux/Documentation/video4linux/bttv/ # ./MAKEDEV video 0 Настало время взглянуть на логи: # tail /var/log/messages midian kernel: Linux video capture interface: v1.00 midian kernel: bttv: driver version 0.7.106 loaded midian kernel: bttv0: detected: FlyVideo 98 (LR50)/ Chronos V ideo Shuttle II [card=35], PCI subsystem ID is 1851:1850 midian kernel: bttv0: using: BT878(Lifeview FlyVideo 98 LR) [card=35,insmod option] Все! Твой ТВ-тюнер готов рваться бой. Осталось лишь скачать и установить xawtv, имхо, самую лучшую на сегодняшний день программу для просмотра телевизионных передач под никсами: $ ./configure --enable-xfree-ext --enable-xvideo --enable-lirc --enable-gl --enable-dv --enable-mmx $ make # make install После установки программы сразу переходим к поиску каналов: $ scantv Здесь выбираем стандарт телевизионного изображения SECAM и страну, в которой находимся: scanning channel list russia... R1 ( 49.75 MHz): no station R2 ( 59.25 MHz): no station R3 ( 77.25 MHz): ??? [unknown (R3)] channel = R3 После первого пойманного канала нажимаем Ctrl+C, загружаем в фоновом режиме xawtv и устанавливаем метку телевизионного канала: $ xawtv & $ xawtv-remote setchannel R3 Если ты все делал правильно, на экране должна появиться телепередача в окне размером примерно со спичечный коробок ;-). Более тонкую настройку телеканалов можно произвести в самой программе указательными клавишами <влево>-<вправо>. Переключать каналы можно с помощью стрелок <вверх>-<вниз>. Пример конфигурационного файла ~/.xawtv [global] fullscreen = 640 x 480 freqtab = Russia pixsize = 128 x 96 pixcols = 1 jpeg-quality = 85 [defaults] norm = SECAM capture = over source = Television Телевидение в массы Чтобы осуществить эту благородную миссию, сначала придется пересобрать ffmpeg с аргументом --enable-shared, так как нам потребуется динамически слинкованный libavcodec. Следующим шагом будет получение исходного кода VLC из CVS-репозитория проекта (на данный момент с возможностью транслировать телепередачи по локальной сети можно познакомиться, только используя CVS-версию): $ mkdir ~/vlc_cvs $ cd ~/vlc_cvs $ cvs -d :pserver:anonymous@anoncvs.videolan.org:/var/cvs/videolan login $ cvs -d :pserver:anonymous@anoncvs.videolan.org:/var/cvs/videolan -qz9 checkout -P vlc /* следующую команду необходимо выполнять только для обновления VLC */ $ cvs -d :pserver:anonymous@anoncvs.videolan.org:/var/cvs/videolan -qz9 up -Pd $ cd vlc $ ./bootstrap С помощью последних аргументов скрипта configure мы как раз включаем в VLC поддержку ffmpeg и интерфейса video4linux: $ ./configure --prefix=/usr/local/vlc2 --disable-dvd --disable-dvbpsi --disable-ogg --disable-vorbis --disable-sdl --disable-gtk --disable-slp --disable-mad --disable-libmpeg2 --enable-ffmpeg --with-ffmpeg-tree=/home/root/ffmpeg-cvs-YEAR-MONTH-DAY --enable-v4l $ make # make install Для группового вещания (multicast) телевизионных передач воспользуемся вот такой командой: #/usr/local/vlc2/bin/vlc v4l:/dev/video:norm=secam:frequency=77.25:size=640x480:\ channel=0:adev=/dev/dsp:audio=0 -sout \ '#transcode{vcodec=mp4v,ab=256,vb=3000,vt=800000,keyint=80,acodec=mpga}: \ std{access=udp,mux=ts,url=239.255.5.10}' Если при просмотре пропадает слишком много кадров, либо изображение идет с низким fps, то попробуй уменьшить размер картинки, а если и это не сильно помогает, то отключи трансляцию аудиоданных (в этом примере идет unicast вещание): # /usr/local/vlc2/bin/vlc v4l:/dev/video:norm=secam:frequency=77.25:size=320x240 -sout \ '#transcode{vcodec=mp4v,ab=256,vb=3000,vt=800000,keyint=80}:std{access=udp, \ mux=ts,url=192.168.5.21}' Ссылки по теме: Проект ffmpeg: http://ffmpeg.sourceforge.net/ Проект mpeg4ip: http://mpeg4ip.sourceforge.net/ Пага xawtv: http://bytesex.org/xawtv/ Все, что касается VLC, VLS и dvbpsi можно найти здесь: http://www.videolan.org/ http://developers.videolan.org/ Сайт, посвященный DSS: http://developer.apple.com/darwin/projects/streaming/ WinAMP-плагин для поддержки протоколов RTP/RTSP: http://www.live.com/multikit/winamp-plugin.html Через свежемясо можно найти абсолютно все: http://freshmeat.net/