Описание
WCS может по требованию захватывать RTMP-видеопоток, раздаваемый с другого сервера. Захваченный поток может раздаваться на любые из поддерживаемых платформ, по любой из поддерживаемых технологий. Для управления захватом RTMP-потока используется REST API.
Схема работы
- На WCS сервер отправляется REST-запрос /pull/rtmp/pull
- WCS сервер запрашивает RTMP-поток с указанного сервера
- RTMP-поток транслируется на WCS сервер
- Браузер запрашивает воспроизведение захваченного потока по WebSocket
- Браузер получает поток по WebRTC
REST-вызовы
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP: http://test.flashphoner.com:9091/rest-api/pull/rtmp/pull
- HTTPS: https://test.flashphoner.com:8888/rest-api/pull/rtmp/pull
Здесь:
- test.flashphoner.com - адрес WCS-сервера
- 9091 - стандартный REST / HTTP порт WCS-сервера
- 8888 - стандартный HTTPS порт
- rest-api - обязательная часть URL
- /pull/rtmp/pull - используемый REST-метод
REST-методы и статусы ответа
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание |
---|---|---|---|---|
/pull/rtmp/pull | { "uri":"rtmp://myserver.com/live/myStream", "record": "true" } | 409 - Conflict 500 - Internal error | Извлечь RTMP-поток по указанному URL | |
/pull/rtmp/find_all | { "localMediaSessionId": "5a072377-73c1-4caf-abd3", "remoteMediaSessionId": null, "localStreamName": "rtmp://myserver.com/live/myStream", "remoteStreamName": null, "uri": "rtmp://myserver.com/live/myStream", "status": "PROCESSED_REMOTE" } | 200 – потоки найдены 404 – потоки не найдены | Найти все извлеченные RTMP-потоки | |
/pull/rtmp/terminate | { "uri":"rtmp://myserver.com/live/myStream" } | 200 - поток завершен 404 - поток не найден | Завершить извлеченный RTMP-поток |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
uri | URL RTMP-потока | rtmp://myserver.com/live/myStream |
record | Записывать ли захваченный поток | true |
localMediaSessionId | Идентификатор сессии | 5a072377-73c1-4caf-abd3 |
localStreamName | Локальное имя, присвоенное захваченному потоку. По данному имени поток может быть запрошен с WCS сервера | rtmp://myserver.com/live/myStream |
status | Текущий статус потока | PROCESSED_REMOTE |
Настройка
В каталоге /usr/local/FlashphonerWebCallServer/conf может располагаться файл описания SDP для RTMP-агента rtmp_agent.sdp:
o=- 1988962254 1988962254 IN IP4 0.0.0.0 c=IN IP4 0.0.0.0 t=0 0 a=sdplang:en m=video 0 RTP/AVP 95 a=rtpmap:95 H264/90000 a=fmtp:95 profile-level-id=42e01f;packetization-mode=1 a=sendonly m=audio 0 RTP/AVP 103 96 97 98 99 100 102 108 104 a=rtpmap:108 mpeg4-generic/48000/1 a=rtpmap:96 mpeg4-generic/8000/1 a=rtpmap:97 mpeg4-generic/11025/1 a=rtpmap:98 mpeg4-generic/12000/1 a=rtpmap:99 mpeg4-generic/16000/1 a=rtpmap:100 mpeg4-generic/22050/1 a=rtpmap:104 mpeg4-generic/24000/1 a=rtpmap:102 mpeg4-generic/32000/1 a=rtpmap:103 mpeg4-generic/44100/1 a=recvonly
Для того, чтобы при записи захваченного потока на диск записывалось не только аудио, но и видео, необходимо в данном файле указать атрибут
a=sendonly
для видео.
Краткое руководство по тестированию
Захват RTMP-потока, транслируемого другим сервером, при помощи REST-запроса /pull/rtmp/pull
1. Для теста используем:
- демо-сервер demo.flashphoner.com;
- браузер Chrome и REST-клиент для отправки запросов на сервер;
- веб-приложение Two Way Streaming для воспроизведения захваченного потока в браузере.
2. Откройте REST-клиент. Отправьте запрос /pull/rtmp/pull, указав в параметрах URL RTMP-потока:
3. Убедитесь, что поток захвачен сервером. Для этого отправьте запрос /rtmp/pull/find_all:
и скопируйте локальное имя потока из параметра ответа localStreamName:
4. Откройте страницу веб-приложения Two Way Streaming. Нажмите "Connect" и укажите локальное имя потока, затем нажмите "Play":
5. Графики WebRTC internals в браузере:
Захват RTMP-потока, транслируемого другим сервером, без использования REST-запроса
1. Для теста используем:
- демо-сервер demo.flashphoner.com;
- веб-приложение Two Way Streaming для захвата и воспроизведения захваченного потока в браузере.
2. Откройте страницу веб-приложения Two Way Streaming. Нажмите "Connect" и укажите имя RTMP-потока, который нужно захватить, затем нажмите "Play":
3. Графики WebRTC internals в браузере:
Последовательность выполнения операций (Call flow)
Ниже приводится последовательность выполнения операций при захвате RTMP-потока с другого сервера
Известные проблемы
1. Поток, содержащий B-фреймы, не воспроизводится либо воспроизводится с артефактами (задержки, подергивания)
Симптомы:
а) поток, передаваемый IP камерой по RTSP, не проигрывается, дает задержки видео или подергивания
б) предупреждения в клиентском логе:
09:32:31,238 WARN 4BitstreamNormalizer - RTMP-pool-10-thread-5 It is B-frame!
Решение: при возможности запрашивать с камеры поток более низкого разрешения, с более низким качеством таким образом, чтобы исключить использование B-фреймов, либо траскодировать данный поток.
2. При записи захваченного потока на диск записывается только аудиодорожка
Симптомы: при указании в REST-запросе /pull/rtmp/pull параметра "record": "true" в полученном файле отсуствует видеодорожка, только аудио.
Решение: указать в настройке SDP атрибут a=sendonly для видеодорожки.
3. AAC фреймы типа 0 не поддерживаются декодером и будут игнорироваться при воспроизведении захваченного потока
При этом в клиентском логе будут выведены предупреждения:
10:13:06,815 WARN AAC - AudioProcessor-c6c22de8-a129-43b2-bf67-1f433a814ba9 Dropping AAC frame that starts with 0, 119056e500
4. Некоторые функции RTMP не поддерживаются и будут игнорированы:
- FCSubscribe
- FCPublish
- FCUnpublish
- onStatus
- onUpstreamBase
- releaseStream