Перейти к содержанию

С другого сервера по RTMP

Описание

WCS может по требованию захватывать RTMP-видеопоток, раздаваемый с другого сервера. Захваченный поток может раздаваться на любые из поддерживаемых платформ, по любой из поддерживаемых технологий. Для управления захватом RTMP-потока используется REST API.

Схема работы

  1. На WCS сервер отправляется REST-запрос /pull/rtmp/pull
  2. WCS сервер запрашивает RTMP-поток с указанного сервера
  3. RTMP-поток транслируется на WCS сервер
  4. Браузер запрашивает воспроизведение захваченного потока по WebSocket
  5. Браузер получает поток по 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`
{ 
    "uri":"rtmp://myserver.com/live/myStream",
    "localStreamName":"stream1",
    "record": "false",
    "hasAudio": true,
    "hasVideo": true
}
409 Conflict 500 Internal error Извлечь RTMP-поток по указанному URL
`/pull/rtmp/find_all`
[
    {
        "localMediaSessionId": "5a072377-73c1-4caf-abd3"
        "localStreamName": "stream1"
        "uri": "rtmp://myserver.com/live/myStream",
        "status": "PROCESSED_REMOTE",
        "hasAudio": true,
        "hasVideo": true,
        "record": false
    }
]
200 OK 404 Not found 500 Internal error Найти все извлеченные RTMP-потоки
`/pull/rtmp/terminate`
{ 
    "uri":"rtmp://myserver.com/live/myStream"
}
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

Для того, чтобы при записи захваченного потока на диск записывалось не только аудио, но и видео, необходимо в данном файле указать атрибут

a=sendonly

для видео.

Публикация потока без одной из составляющих

Если из файла 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_detect_h264_frame_type=true

Краткое руководство по тестированию

Захват RTMP-потока, транслируемого другим сервером, при помощи REST-запроса /pull/rtmp/pull

  1. Для теста используем:
  2. демо-сервер demo.flashphoner.com;
  3. браузер Chrome и REST-клиент для отправки запросов на сервер;
  4. веб-приложение Two Way Streaming для воспроизведения захваченного потока в браузере.

  5. Откройте REST-клиент. Отправьте запрос /pull/rtmp/pull, указав в параметрах URL RTMP-потока:

  6. Убедитесь, что поток захвачен сервером. Для этого отправьте запрос /rtmp/pull/find_all:

    и скопируйте локальное имя потока из параметра ответа localStreamName:

  7. Откройте страницу веб-приложения Two Way Streaming. Нажмите Connect и укажите локальное имя потока, затем нажмите Play:

  8. Графики WebRTC internals в браузере:

Захват RTMP-потока, транслируемого другим сервером, без использования REST-запроса

  1. Для теста используем:
  2. демо-сервер demo.flashphoner.com;
  3. веб-приложение Two Way Streaming для захвата и воспроизведения захваченного потока в браузере.

  4. Откройте страницу веб-приложения Two Way Streaming. Нажмите Connect и укажите имя RTMP-потока, который нужно захватить, затем нажмите Play:

  5. Графики WebRTC internals в браузере:

Последовательность выполнения операций

Ниже приводится последовательность выполнения операций при захвате RTMP-потока с другого сервера

Авторизация на сервере-источнике

WCS поддерживает авторизацию на RTMP сервере при захвате с него потока при помощи параметров в RTMP URL:

rtmp://username:password@server:1935/live/streamKey

Отметим, что, если поток запрашивается с другого WCS сервера по RTMP, такая авторизация не поддерживается.

В сборке 5.2.1069 также добавлена возможность передать параметры после имени потока

rtmp://server:1935/live/streamKey?user=username&password=password

В этом случае параметры будут переданы на сервер в RTMP сообщении connect.

При необходимости, параметры могут быть указаны и после имени приложения

rtmp://server:1935/live?user=username&password=password/streamKey

В этом случае параметры также будут переданы на сервер в RTMP сообщении connect. Если поток запрашивается с другого WCS сервера по RTMP, параметры авторизации будут доступны в REST hook /connect.

Известные проблемы

1. Поток, содержащий B-фреймы, не воспроизводится либо воспроизводится с артефактами (задержки, подергивания)

Симптомы

  • поток не проигрывается, дает задержки видео или подергивания
  • предупреждения в клиентском логе:
    09:32:31,238 WARN 4BitstreamNormalizer - RTMP-pool-10-thread-5 It is B-frame!
    

Решение

  • изменить настройки кодировщика таким образом, чтобы исключить использование B-фреймов (понизить профиль кодирования, указать в командной строке и т.п.).
  • транскодировать поток, в этом случае в выходном потоке транскодера B-фреймов не будет

2. AAC фреймы типа 0 не поддерживаются декодером FFmpeg и будут игнорироваться при воспроизведении захваченного потока

Симптомы

Предупреждения в клиентском логе:

10:13:06,815 WARN AAC - AudioProcessor-c6c22de8-a129-43b2-bf67-1f433a814ba9 Dropping AAC frame that starts with 0, 119056e500

Решение

Использовать кодек Fraunhofer при помощи настройки

use_fdk_aac=true

3. При публикации и последующем воспроизведении и записи H264 + AAC потока возможна рассинхронизация видео и звука, либо полное отсутствие звука.

Симптомы

При воспроизведении H264 + AAC потока, опубликованного на сервере, а также в записи потока, звук не синхронизирован с видео или отсутствует

Решение

a) установить настройку в файле flashphoner.properties

disable_drop_aac_frame=true

Эта настройка, в том числе, отключает игнорирование AAC фреймов.

b) использовать кодек Fraunhofer при помощи настройки

use_fdk_aac=true

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 в файле нет видео, есть только звук.

Решение

В настройках SDP установить атрибут

a=sendonly

для видео.

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