Задание: записать трансляцию конференции, которая идёт через интернет.
На сайте встроен флеш-объект, который, собственно, эту трансляцию и крутит. Методом просмотра исходного текста странички было обнаружено, что флешка берёт видеопоток с сервера по протоколу 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)
Протокол прекрасен. Реализация восхитительна. Но задачу решать надо.
Обычно трансляции идут через веб и посмотреть их вроде бы можно только с веб-странички (во флеш-плеере), без возможности перемотки или сохранения видео на локальный компьютер.
Однако, методом поиска были найдены программы 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 --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 url | URL проигрывателя swf-файлов |
--tcUrl|-t url | URL проигрываемого потока (по умолчанию: "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, они не будут включены в пакет инициализации соединения.