Потоковые медиасерверы - тема, с которой, так или иначе, сталкиваются современные программисты. Аудио/видео-чаты и сервисы, запись и воспроизведение потокового медиа-контента - основные задачи, в которых востребованы данные решения. Нужно сказать, что в последнее время ситуация активно развивается, с учетом того, что имеется множество конкурирующих технологий. Если говорить о "компьютерном" медиа-контенте в интернете, то наиболее частой связкой является вариант "флэш-клиент <-> медиасервер". Среди коммерческих разработок в области последних наиболее известен Adobe Flash Media Server, из бесплатных - Red5. Также популярны Wowza и набирающий обороты erlyvideo.
Red5 - это open-source продукт, написанный на Java. Он поддерживает передачу потокового аудио (MP3, F4A, M4A, AAC) и видео (FLV, F4V, MP4, 3GP), а также обеспечивает возможность сохранения потоков данных на стороне сервера. В принципе, если говорить о прямой потоковой передаче между клиентами и организации видеочатов, то в последнее время ситуация изменилась, главным образом после внедрения со стороны Adobe peer-to-peer-протокола RTMFP (Secure Real-Time Media Flow Protocol), который поддерживается, начиная с 10-й версии плеера. Для получения справки по этому поводу советую обратиться к описанию технологии Adobe Cirrus. Именно на ее базе сейчас часто пишутся видеочаты. Но при этом мы говорим о real-time соединениях в рамках одноранговых сетей без возможностей сохранения на сервер (его, сервера, просто нет). Конечно, это ограничение можно обойти, например автор этих строк видел реализации, в которых данные передавались "через" один ПК, который выступал в качестве своеобразного сервера, то есть, он записывал входящие потоки путем захвата аудио/видео, что реализовать, на самом деле не сложно. И в данном варианте везде использовался RTMFP (кстати, это единственный сетевой протокол из RTM...-семейства, базирующийся на UDP, все остальные - TCP).
Плюс к этому стоит добавить возможность 11-й версии флэш-плеера полноценно работать с кодеком H.264 (т.е. уже и кодировать). До этого вопросы эффективного сжатия "на лету" современными кодеками решались только со стороны сервера.
Поэтому если говорить о полностью open-source комплектации, которая была наиболее распространена раньше и во многом актуальна сегодня - это Red5 (медиасервер) и Xuggler (набор кодеков и API для кодирования, декодирования, обработки аудио и видео, написанный на Java). Причем в обоих случаях дается внятный спектр демонстрационных приложений.
Нужно сказать, что автор этих строк использовал такую связку для реализации многих проектов, среди которых системы видеонаблюдения, трансляции, сервисы "видео по-запросу", а также несколько стандартных видео-чатов.
В этом материале мы затронем самую начальную тему, а именно, уделим внимание вопросам корректной установки всего этого арсенала для старта успешной разработки. При этом параллельно мы решим и еще одну актуальную задачу, а именно, в качестве протокола потоковой передачи данных, будем использовать не стандартный RTMP, а RTMPT, то есть "туннелированный" RTMP.
RTMP-протокол часто вызывает сложности в плане того, что работает на 1935 порту (TCP), который нередко блокируется файрволлами. И часто в технических заданиях прописывают условие, что передача должна осуществляться по HTTP через 80-й порт, то есть, не создавать трудностей использования для клиентов. RTMPT является как раз решением этой проблемы. Для тех, кто не работал с "туннелированными" протоколами, отметим, что термин "туннелирование" подразумевает инкапсуляцию одного сетевого протокола в другой. В данном случае мы говорим об инкапсуляции RTMP в HTTP.
В качестве примера я покажу, как производить корректную установку Red5+Xuggler на локальную машину с ОС Windows - по этой теме задается основная масса вопросов, и немного расскажу об инсталляции под Linux. Хотя в обоих случаях действия идентичны. В варианте с Windows, естественно, мы решим задачу по обеспечению возможности локальной разработки клиентских и серверных приложений.
Перенос всего этого на web-пространство не представляет никаких особых трудностей.
Установка Red5 на Windows (для теста приложения на локальной машине)
Примечание: для Windows полная связка корректно работает с x86, то есть 32-разрядными, поэтому выбирать нужно только их. Что касается Linux, то все компоненты поддерживают 64-разрядный вариант.
1. Установка JDK. Заходим на сайт, из предлагаемых вариантов выбираем JDK SE 6, по нажатию на кнопку Dowload выбираем нужный вариант для Windows (x86 - для 32-разрядных систем), для теста проекта в рамках этой статьи использовалась jdk-6u26-windows-i586.exe.
Устанавливаем по инструкции, никаких ошибок быть не должно.
2. Прописываем системную переменную JAVA_HOME. Далее, в зависимости от ОС, нужно прописать системную переменную JAVA_HOME.
В Windows XP это делается по пути: Пуск > Настройки > Панель управления > Система > Дополнительно > Переменные среды (Start > Settings > Control Panel > System > Advanced > Environment Variables), где в открывшемся окне создаем новую системную переменную JAVA_HOME и в качестве ее аргумента указываем путь к каталогу, в который мы установили JDK.
В Windows7 фактически аналогично, только можно выйти по клику правой кнопки мыши над иконкой "Мой компьютер" ("My Computer"). Перезагружаем компьютер.
3. Скачиваем и устанавливаем Xuggle. Зайдя по ссылке, выбираем вариант xuggle-xuggler-setup.exe. Рабочей является именно эта версия.
4. По аналогии как мы это делали с JAVA_HOME, прописываем системную переменную XUGGLE_HOME, указав в качестве ее значения ссылку на папку bin. Например, C:\Xuggle\bin. Перезагружаем компьютер.
5. Скачиваем и устанавливаем Red5. Теперь скачиваем Red5. Внимание!!! Нужно взять версию Red5 0.9.1 Final, не RC1. Для установки под Windows вполне подойдет exe-вариант файла инсталляции.
Автоматический установщик под Windows не требователен к настройкам: нужно просто указать папку, куда будет распаковываться сервер (она может быть любой), а в конце установки указываем в качестве IP 127.0.0.1, а порт сразу укажем как - 80. Установка завершена.
Бегло просматриваем структуру папок Red5 (те, которые нам в ближайшее время понадобятся, выделены курсивом):
- conf - конфигурационные файлы Red5.
- doc - документация по исходникам, полезная для разработчика и бесполезная для пользователя (администратора).
- lib - jar-файлы библиотек, необходимых для работы Red5.
- log - сюда будут сохранятся логи, генерируемые при работе Red5.
- plugins - плагины для Red5.
- webapps - здесь размещаются собственные приложения.
- в корне папки есть всякие файлы настроек, shell и bat скрипты, jar файлы и файлы для сборщика.
6. Включаем RTMPT. Перво-наперво без запуска сервера заходим в папку conf корневого каталога Red5. Поскольку 80-й порт мы указали по умолчанию в момент инсталляции, то ничего нового в red5.properties прописывать не нужно. Если же был указан другой порт для HTTP, то в этом файле нужно найти соответствующую строку и переписать ее на http.port=80.
Теперь нужно включить RTMPT. На самом деле, он отключен, хотя и обозначен. Для включения нужно в той же папке conf зайти в файл red5-core.xml, открыть его и найти раздел RTMPT, часть из которого заблокировано комментариями <!- и ->. Убираем эти блокираторы.
7. Интегрирование Xuggle в Red5. Опять же, пока можно еще не запускать Red5. Заходим в каталог, в который мы установили Xuggle, далее двигаемся по пути ...Xuggle\share\java\jars и копируем оттуда два файла: commons-cli.jar и xuggle-xuggler.jar. Вставляем их в каталог lib нашего Red5.
8. Первые запуски Red5, установка приложения audiotranscoder (videotranscoder). Запускаем Red5 файлом red5.bat, который находится в корневом каталоге Red5. Ждем, пока он полноценно загрузится. Далее отключаем его файлом red5-shutdown.bat.
Далее заходим по ссылке и скачиваем оттуда два WAR-файла с демостранционными приложениями audiotranscoder и videotranscoder. Действия для установки обоих идентичны, поэтому я покажу все на примере audiotranscoder.
Берем файл audiotranscoder-3.1.875.200908131110.war. Копируем его и помещаем в папку ...Red5/webapps. Снова запускаем Red5 с помощью red5.bat. Во время запуска он автоматически распакует и установит серверное приложение audiotranscoder. Смотрим, появилось ли оно в папке webapps (должна появиться папка audiotranscoder), а в самом консольном окне лога сервера появится строка JETM 1.2.2 started, после чего там пойдут специфические записи. Если да, опять отключаем Red5 с помощью red5-shutdown.bat.
Теперь внесем изменения, например, заставим сервер кодировать аудиопоток в MP3. Для этого открываем файл \audiotranscoder\src\com\eb\red5\AudioTranscoderDemo.java, заходим и изменяем там несколько строк:
ISimpleMediaFile outputStreamInfo = new SimpleMediaFile(); outputStreamInfo.setAudioSampleRate(22050/4); outputStreamInfo.setAudioChannels(1); outputStreamInfo.setAudioBitRate(32000); outputStreamInfo.setAudioCodec(ICodec.ID.CODEC_ID_MP3); outputStreamInfo.setHasVideo(false);
9. Запуск и проверка протоколов на базе демонстрационного приложения Publisher. Запускаем Red5 (red5.bat). Открываем браузер и набираем http://localhost. В результате должно отобразиться следующее.
Также смотрим на лог, отображаемый в консольном окне, в нем должны появиться специфические записи (по существу, если говорить простым языком, это значит, что приложение нашего аудиотранскодера запущено и функционирует).
Теперь возвращаемся в наш браузер (страницу http://localhost) и кликаем на ссылке Launch a demo, после чего переходим на страницу с демо-приложениями. Выбираем вариант Publisher. Переходим к нему. По существу это очень удобное приложение для тестирования.
Справа внизу находится область с тремя закладками: Server, Video и Audio. В Server нам нужно указать новый путь, для чего:
- Сначала проверяем rtmp и вводим: rtmp://localhost/audiotranscoder, после чего нажимаем Connect и в логе приложения должна появиться строка NetConnection.Connect.Success. Отключаем соединение.
- Проверяем RTMPT, поменяв строку на эту: rtmpt://localhost:80/audiotranscoder. Должна появиться строка NetConnection.Connect.Success.
10. Пробная запись аудиопотока на базе приложения Publisher. Подключившись к серверу по одному из выбранных протоколов, переходим в закладку Audio. Выбираем звуковое устройство и нажимаем Apply. Остальные настройки не трогаем. В поле имени файла вводим first_test, а тип (Type) потока указываем как Record. После чего нажимаем Publish и делаем пробную запись.
Нажав Stop, мы можем найти записанный файл first_test.flv в папке streams нашего приложения webapps/audiotranscoder на сервере Red5. Обращу внимание на то, что не зависимо от первоначальных настроек аудио кодируется в MP3 (моно, 22 КГц), который запаковывается в контейнер flv. За кодирование отвечает Xuggle.
Наиболее частые проблемы
Если в структуру Red5 часто вносятся какие-нибудь изменения, пусть даже и небольшие, он может "глюкануть", то есть писать в логах того же Publisher'а: NetConnection.Connect.InvalidApp или NetConnection.Connect.Rejected. Исправляется это все переустановкой.
Для удобства скопируйте измененный файлы, а именно, red5-core.xml (в котором мы подключили протокол RTMPT) и zip-архив с измененным приложением audiotranscoder.
Установка Red5 на Linux
Наиболее быстрая установка производится из бинарного дистрибутива. Для этого первым делом скачиваем нужный дистрибутив JDK SE 6, устанавливаем по инструкциям, а также прописываем переменную JAVA_HOME в .bashrc. Затем с сайта берем нужную версию для Linux и устанавливаем Xuggle. Прописываем переменную XUGGLE_HOME в .bashrc (обратите внимание, что ее значение должно указывать на внутреннюю папку bin).
Затем забираем с tarball или ZIP-архив Red5 0.9.1 final. Распаковываем в нужную папку, после чего запускаем файл red5.sh из ее корня.
Настройка прав доступа и т.п. производится по усмотрению. Установка не намного сложнее вариантов Windows. 80-й порт и IP прописываются в файле Red5/conf/red5.properties. RTMPT включается red5-core.xml. В общем, почти все дальнейшие действия идентичны пп. 6-10 описания установки под Windows.
Просмотр кода серверного приложения audiotranscoder в Eclipse
Для того, чтобы начать работать с проектом в Eclipse, нужно запустить Eclipse, указать в качестве Workspace папку ...Red5\webapps. Затем, если audiotranscoder успешно скопирован на сервер, в Eclipse, создаете новый Java-проект (File > New > Java Project), но при этом называете его как и имеющееся приложение audiotranscoder, нажимаете Next, Eclipse определится со всем вложением, автоматически найдет src и т.п., единственное, что нужно указать, это Output Folder, в качестве которого будет папка WEB-INF/classes. Далее заходим в библиотеки, если Eclipse не может их найти, нужно просто перебить ссылки.
После этого проект на стороне сервера готов к изменениям.
В завершение
С точки зрения программирования клиентских приложений, то для медиасерверов она довольно стандартна и описана в большом количестве интернет-ресурсов, при этом, не так важно какой у вас медиасервер, потому как вы оперируете стандартными командными запросами, предусмотренными в рамках Action Script 2 или 3. Кстати, большинство демо-приложений для Red5 написано на AS 2, хотя используемый нами для отладки Publisher - на третьей версии языка.
Кристофер,
itcs.3dn.ru
Горячие темы