Серверная (www.it-simple.ru)

RTMPDump / flvstreamer. Как сохранить трансляцию с сервера RTMP


Задание: записать трансляцию конференции, которая идёт через интернет.

На сайте встроен флеш-объект, который, собственно, эту трансляцию и крутит. Методом просмотра исходного текста странички было обнаружено, что флешка берёт видеопоток с сервера по протоколу RTMP. Так как грабить видео очень не хотелось (геморрой, потеря качества, да и вообще отстойное решение), стал разбираться что это за протокол и как сливать такой поток непосредственно с сервера.

Протокол RTMP

RTMP (англ. Real Time Messaging Protocol) проприетарный протокол потоковой передачи данных, в основном используется для передачи потокового видео и аудиопотоков с веб-камер через интернет.

В 2009 году Adobe выпустила документ, названный спецификацией RTMP, однако это умышленно неполный документ, направленный на сдерживание развития альтернативных серверов. Для прочтения этого документа необходимо согласиться с лицензионным соглашением, которое требует создания RTMP сервера только по спецификации от Adobe без каких-либо отступлений. В этой спецификации указаны намеренно неверные данные, так, например, для включения на Flash Player декодера H.264 требуется криптографически подписать хендшейк, а в спецификации написано, что обязательно надо заполнять произвольными данными. Таким образом, приняв условия лицензии на спецификацию, разработчик лишается возможности реализовать полноценный RTMP сервер.

http://ru.wikipedia.org/wiki/RTMP (http://ru.wikipedia.org/wiki/RTMP)

Протокол прекрасен. Реализация восхитительна. Но задачу решать надо.

Сохранение потока с сервера RTMP

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

Однако, методом поиска были найдены программы RTMPDump (http://rtmpdump.mplayerhq.hu/) и её форк flvstreamer (http://savannah.nongnu.org/projects/flvstreamer), которые способны работать с сервером RTMP напрямую, минуя флеш. flvstreamer, кстати, доступен из репозиториев Ubuntu. С ним и будем работать.

Исходный код веб-странички, а точнее та часть, которая отвечает за встраивание плеера, может дать нам следующую информацию:
1. Адрес трансляции (rtmp://домен/путь)
2. Файл описания потоковой сессии по адресу из п.1 (файл.sdp)

Именно так: эта информация содержится не в одном длинном урле, а в двух разных параметрах встроенного объекта. По крайней мере — в моём случае.

Командуем в консоли:

flvstreamer -r rtmp://домен/путь/файл.sdp -o локальный_файл.flv

И в локальный_файл.flv начинает литься чистый, не пережатый, исходного качества поток.

Параметры и ключи программы flvstreamer

flvstreamer --help

Перевод мой, глубоко не вникал, замечания и исправления приветствуются.

FLVStreamer v1.9
(c) 2009 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL

Программа сохраняет потоковое видео и аудио с сервера rtmp.

--help|-hПечатает файл справки программы flvstreamer.
--rtmp|-r urlАдрес (URL) трансляции (то есть, rtmp://сервер[:порт]/путь)
--host|-n hostnameПереопределяет сервер из rtmp url
--port|-c portПереопределяет порт из rtmp url
--socks|-S host:portИспользовать определённый прокси SOCKS
--protocol|-lПереопределяет протокол из rtmp url (0 - RTMP, 3 - RTMPE)
--playpath|-yПереопределяет путь к трансляции, взятый из rtmp url
--swfUrl|-s urlURL проигрывателя swf-файлов
--tcUrl|-t urlURL проигрываемого потока (по умолчанию: "rtmp://сервер[:порт]/проигрыватель")
--pageUrl|-p urlВеб-адрес programme (?)
--app|-a appИмя используемого проигрывателя
--auth|-u stringСтрока аутентификации, которая будет добавлена в конец строки для соединения
--flashVer|-f stringВерсия Flash (по умолчанию: "LNX 10,0,22,87")
--live|-vСохранить прямой эфир , без возможности прокрутки (--resume) по доступным потокам
--subscribe|-d stringИмя потока, на который хотим подписаться (или, если задан ключ --live, - сделать его умолчательным)
--flv|-o stringФайл FLV для записи, если имя файла «-» - отправить поток на стандартный вывод
--resume|-eДокачать частично загруженный поток RTMP
--timeout|-m numВремя ожидания соединения, в секундах (по умолчанию: 120)
--start|-A numНачать на num секунде потока (не работает с --live)
--stop|-B numОстановиться на num секунде потока
--hashes|-#Отображать процесс, используя хэши вместо байтов как разделитель
--buffer|-bВремя буферизации в миллисекундах (по умолчанию: 36000000), эта опция имеет смысл только при отправке потока на стандартный вывод (-o -)
--skip|-k numПропустить num ключевых кадров в процессе поиска последнего ключевого кадра, с которого нужно начать докачку. Нужно при сбоях докачки (по умолчанию: 0)
--quiet|-qСкрыть любой вывод.
--verbose|-VУвеличить подробность вывода.
--debug|-zВключить вывод для разработчика.

Если не ввести параметры swfUrl, pageUrl, app или auth, они не будут включены в пакет инициализации соединения.