С другого сервера по RTMP¶
Описание¶
WCS может по требованию захватывать RTMP-видеопоток, раздаваемый с другого сервера. Захваченный поток может раздаваться на любые из поддерживаемых платформ, по любой из поддерживаемых технологий. Для управления захватом RTMP-потока используется REST API.
Схема работы¶
- На WCS сервер отправляется REST-запрос
/pull/rtmp/pull
- WCS сервер запрашивает RTMP-поток с указанного сервера
- RTMP-поток транслируется на WCS сервер
- Браузер запрашивает воспроизведение захваченного потока по WebSocket
- Браузер получает поток по WebRTC
REST API¶
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP:
http://test.flashphoner.com:8081/rest-api/pull/rtmp/pull
- HTTPS:
https://test.flashphoner.com:8444/rest-api/pull/rtmp/pull
Здесь:
test.flashphoner.com
- адрес WCS-сервера8081
- стандартный REST / HTTP порт WCS-сервера8444
- стандартный HTTPS портrest-api
- обязательная часть URL/pull/rtmp/pull
- используемый REST-метод
REST-методы и статусы ответа¶
REST метод | Тело запроса | Тело ответа | Статусы ответа | Описание |
---|---|---|---|---|
`/pull/rtmp/pull` | 409 Conflict 500 Internal error | Извлечь RTMP-поток по указанному URL | ||
`/pull/rtmp/find_all` | 200 OK 404 Not found 500 Internal error | Найти все извлеченные RTMP-потоки | ||
`/pull/rtmp/terminate` | 200 OK 404 Not found 500 Internal error | Завершить извлеченный RTMP-поток |
Параметры¶
Параметр | Описание | Пример |
---|---|---|
uri | URL RTMP-потока | `rtmp://myserver.com/live/myStream` |
localMediaSessionId | Идентификатор сессии | `5a072377-73c1-4caf-abd3` |
localStreamName | Локальное имя, присвоенное захваченному потоку. По данному имени поток может быть запрошен с WCS сервера | `stream1` |
status | Текущий статус потока | `PROCESSED_REMOTE` |
record | Записывается ли захваченный поток | `false` |
hasAudio | Есть ли аудио в потоке | `true` |
hasVideo | Есть ли видео в потоке | `true` |
Публикация потока под заданным именем¶
В сборке 5.2.724 добавлена возможность указать имя, под которым захваченный поток будет опубликован на сервере, при помощи параметра localStreamName
. Если имя не указано, поток будет опубликован под именем, совпадающим с uri
, как в предыдущих сборках.
Повторный захват потока с тем же URI¶
При попытке повторного захвата потока с тем же URI запрос /pull/rtmp/pull
вернет 409 Conflict
. Если поток уже опубликован на сервере, необходимо подключаться к этому потоку.
Настройка¶
Управление параметрами кодеков¶
В каталоге /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
Для того, чтобы при записи захваченного потока на диск записывалось не только аудио, но и видео, необходимо в данном файле указать атрибут
для видео.
Публикация потока без одной из составляющих¶
Если из файла rtmp_agent.sdp
убрать аудио или видео составляющую, то захваченный поток будет опубликован на сервере без этой составляющей. Например. для публикации только видео SDP должно выглядеть так:
v=0
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
Определение типа фрейма¶
В некоторых случаях, источник RTMP потока может некорректно проставлять тип фрейма на уровне сообщений RTMP протокола. В этом случае тип фрейма необходимо определять по его содержимому. Для этого используется настройка, добавленная в сборке 5.2.1446
Краткое руководство по тестированию¶
Захват RTMP-потока, транслируемого другим сервером, при помощи REST-запроса /pull/rtmp/pull
¶
- Для теста используем:
- демо-сервер
demo.flashphoner.com
; - браузер Chrome и REST-клиент для отправки запросов на сервер;
-
веб-приложение Two Way Streaming для воспроизведения захваченного потока в браузере.
-
Откройте REST-клиент. Отправьте запрос
/pull/rtmp/pull
, указав в параметрах URL RTMP-потока:
-
Убедитесь, что поток захвачен сервером. Для этого отправьте запрос
/rtmp/pull/find_all
:
и скопируйте локальное имя потока из параметра ответаlocalStreamName
:
-
Откройте страницу веб-приложения Two Way Streaming. Нажмите
Connect
и укажите локальное имя потока, затем нажмитеPlay
:
-
Графики WebRTC internals в браузере:
Захват RTMP-потока, транслируемого другим сервером, без использования REST-запроса¶
- Для теста используем:
- демо-сервер
demo.flashphoner.com
; -
веб-приложение Two Way Streaming для захвата и воспроизведения захваченного потока в браузере.
-
Откройте страницу веб-приложения Two Way Streaming. Нажмите
Connect
и укажите имя RTMP-потока, который нужно захватить, затем нажмитеPlay
:
-
Графики WebRTC internals в браузере:
Последовательность выполнения операций¶
Ниже приводится последовательность выполнения операций при захвате RTMP-потока с другого сервера
Авторизация на сервере-источнике¶
WCS поддерживает авторизацию на RTMP сервере при захвате с него потока при помощи параметров в RTMP URL:
Отметим, что, если поток запрашивается с другого WCS сервера по RTMP, такая авторизация не поддерживается.
В сборке 5.2.1069 также добавлена возможность передать параметры после имени потока
В этом случае параметры будут переданы на сервер в RTMP сообщении connect
.
При необходимости, параметры могут быть указаны и после имени приложения
В этом случае параметры также будут переданы на сервер в RTMP сообщении connect
. Если поток запрашивается с другого WCS сервера по RTMP, параметры авторизации будут доступны в REST hook /connect.
Известные проблемы¶
1. Поток, содержащий B-фреймы, не воспроизводится либо воспроизводится с артефактами (задержки, подергивания)¶
Симптомы
- поток не проигрывается, дает задержки видео или подергивания
- предупреждения в клиентском логе:
Решение
- изменить настройки кодировщика таким образом, чтобы исключить использование B-фреймов (понизить профиль кодирования, указать в командной строке и т.п.).
- транскодировать поток, в этом случае в выходном потоке транскодера B-фреймов не будет
2. AAC фреймы типа 0 не поддерживаются декодером FFmpeg и будут игнорироваться при воспроизведении захваченного потока¶
Симптомы
Предупреждения в клиентском логе:
3. При публикации и последующем воспроизведении и записи H264 + AAC потока возможна рассинхронизация видео и звука, либо полное отсутствие звука.¶
Симптомы
При воспроизведении H264 + AAC потока, опубликованного на сервере, а также в записи потока, звук не синхронизирован с видео или отсутствует
Решение
a) установить настройку в файле flashphoner.properties
Эта настройка, в том числе, отключает игнорирование AAC фреймов.
b) использовать кодек Fraunhofer при помощи настройки
4. При преобразовании звуковой дорожки AAC к частоте дискретизации 11025 Гц звук искажен или отсутствует¶
Симптомы
При публикации H264 + AAC потока на WCS сервере и воспроизведении его как H264 + AAC c частотой дискретизации звука 11025 Гц звук искажен или отсутствует
Решение
Не использовать частоту дискретизации звука 11025 Гц, либо избегать преобразования звука к данной частоте, например, не указывать данную частоту в файлах настроек SDP.
5. Некоторые функции RTMP не поддерживаются и будут игнорированы¶
FCSubscribe
FCPublish
FCUnpublish
onStatus
onUpstreamBase
releaseStream
6. В записи потока присутствует только звук¶
Симптомы
При установленном параметре "record":true
запроса /pull/rtmp/pull
в файле нет видео, есть только звук.
7. При захвате RTMP потока с Adobe Media Server возможны фризы при использовании Aggregate messages¶
Симптомы
Фризы, завершение публикации по таймауту при захвате RTMP потока с Adobe Media Server
Решение
Не использовать Aggregate messages на AMS, отключив следующие параметры
- все вхождения
EnableAggMsgs
вServer.xml
Client/AggregateMessages
иQueue/AggregateMessages
вconf/_defaultRoot_/_defaultVHost/Application.xml
AggregateMessages
вVhost.xml