Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Видеопоток захватывается с RTSP-источника, отдающего аудио и видео в поддерживаемых кодеках. Далее видеопоток трансформируется на стороне сервера для воспроизведения в браузерах и мобильных устройствах.

RTSP-источники

...

  • IP камеры
  • Медиасерверы
  • Системы наблюдения
  • Конференц-серверы

Поддерживаемые кодеки

...

  • H.264
  • VP8
  • AAC
  • G.711
  • Speex

Поддерживаемые платформы и браузеры


Chrome

Firefox

Safari 11

Internet Explorer

Edge

Windows

+

+


+

+

Mac OS

+

+

+



Android

+

+




iOS

-

-

+

...



Схема работы


  1. Браузер соединяется с сервером по протоколу Websocket и отправляет команду play.
  2. Сервер соединяется с RTSP-источником и отправляет команду play.
  3. RTSP-источник передает на сервер RTSP-поток.
  4. Сервер трансформирует поток в WebRTC и отдает поток браузеру.

Настройка

В некоторых случаях, например, если подключение к IP-камере для захвата потока по RTSP производится через VPN, RTSP-клиент должен быть привязан к определенному адресу. Адрес указывается при помощи опции rtsp_client_address в файле настроек flashphoner.properties, например

Code Block
languagebash
themeRDark
rtsp_client_address=172.16.0.3

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

Захват видеопотока с IP-камеры и трансляция в браузер

1. Для теста используем:

  • демо-сервер demo.flashphoner.com;
  • веб-приложение Player для захвата и воспроизведения потока

2. Откройте веб-приложение Player, укажите в поле "Stream" URL веб-камеры:

Image Added


3. Нажмите кнопку "Start". Начнется трансляция захваченного потока.

Image Added


4. Графики WebRTC internals:

Image Added

Управление захватом видеопотока с IP-камеры при помощи REST API

Как правило, для захвата потока с IP-камеры достаточно указать URL-камеры в качестве имени потока при его создании. Однако, при необходимости, возможно управлять захватом RTSP-потока при помощи REST API.

Тестирование

1. Для теста используем:

  • демо-сервер demo.flashphoner.com;
  • браузер Chrome и REST-клиент для отправки запросов на сервер;
  • веб-приложение Player для воспроизведения захваченного потока в браузере.

2. Откройте REST-клиент. Отправьте запрос /rtsp/startup, указав в параметрах URL веб-камеры:

Image Added


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

Image Added


Image Added

4. Откройте веб-приложение Player, укажите в поле "Stream" URL веб-камеры и нажмите Start. Начнется воспроизведение потока в браузере:

Image Added


5. Отправьте запрос /rtsp/terminate, указав в параметрах URL веб-камеры:

Image Added


6. Воспроизведение потока прервется с ошибкой:

Image Added

REST-вызовы

REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:

  • HTTP: http://test.flashphoner.com:90918081/rest-api/rtsp/startup
  • HTTPS: https://test.flashphoner.com:88888444/rest-api/rtsp/startup

Здесь:

  • test.flashphoner.com - адрес WCS-сервера
  • 9091 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8888 8444 - стандартный HTTPS порт
  • rest-api - обязательная часть URL
  • /rtsp/startup - используемый REST-метод

REST-методы и статусы ответа

REST-метод

Пример тела REST-запроса

Пример тела REST-ответа

Статусы ответа

Описание

/rtsp/startup

Code Block
languagejs
themeRDark
{
 "uri":"rtsp://myserver.com/live/myStream"
}

409 - Conflict

500 - Internal error


Извлечь RTMP-поток по указанному URL


/rtsp/find_all


Code Block
languagejs
themeRDark
{
"uri": "rtsp://myserver.com/live/myStream",
"status": "PLAYING"
}

200 – потоки найдены

404 – потоки не найдены

Найти все извлеченные RTMP-потоки

/rtsp/terminate

Code Block
languagejs
themeRDark
{
"uri":"rtsp://myserver.com/live/myStream"
}

200 - поток завершен

404 - поток не найден

Завершить извлеченный RTMP-поток

Параметры

Имя параметра

Описание

Пример

uri

URL RTSP-потока

rtsp://myserver.com/live/myStream

status

Текущий статус потока

PLAYING

...

В некоторых случаях, например, если подключение к IP-камере для захвата потока по RTSP производится через VPN, RTSP-клиент должен быть привязан к определенному адресу. Адрес указывается при помощи опции rtsp_client_address в файле настроек flashphoner.properties, например

Code Block
languagebash
themeRDark
rtsp_client_address=172.16.0.3

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

Захват видеопотока с IP-камеры и трансляция в браузер при помощи REST-запроса /rtsp/startup

1. Для теста используем:

  • демо-сервер demo.flashphoner.com;
  • браузер Chrome и REST-клиент для отправки запросов на сервер;
  • веб-приложение Player для воспроизведения захваченного потока в браузере.

2. Откройте REST-клиент. Отправьте запрос /rtsp/startup, указав в параметрах URL веб-камеры:

Image Removed

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

Image Removed

Image Removed

4. Откройте веб-приложение Player, укажите в поле "Stream" URL веб-камеры и нажмите Start. Начнется воспроизведение потока в браузере:

Image Removed

5. Отправьте запрос /rtsp/terminate, указав в параметрах URL веб-камеры:

Image Removed

6. Воспроизведение потока прервется с ошибкой:

Image Removed

Захват видеопотока с IP-камеры и трансляция в браузер без использования REST-запроса

1. Для теста используем:

  • демо-сервер demo.flashphoner.com;
  • веб-приложение Player для захвата и воспроизведения потока

2. Откройте веб-приложение Player, укажите в поле "Stream" URL веб-камеры:

Image Removed

3. Нажмите кнопку "Start". Начнется трансляция захваченного потока.

Image Removed

4. Графики WebRTC internals:

Image Removed

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

...

3. Запрос на воспроизведение потока.

session.createStream(), stream.play(); code

URL IP-камеры передается в метод createStream() как имя потока

Code Block
languagejs
themeRDark
    stream = session.createStream(options).on(STREAM_STATUS.PENDING, function(streamfunction playStream(session) {
        var videostreamName = document.getElementById(stream.id()$('#streamName').val();
    var options   if (!video.hasListeners) = {
            video.hasListeners = true;name: streamName,
            video.addEventListener('playing', function () {display: remoteVideo,
                $("#preloader").hide();flashShowFullScreenButton: true
            });
            video.addEventListener('resize', function (event) {
                var streamResolution = stream.videoResolution();
                if (Object.keys(streamResolution).length === 0) {
                    resizeVideo(event.target);
                } else {
                    // Change aspect ratio to prevent video stretching
                    var ratio = streamResolution.width / streamResolution.height;
                    var newHeight = Math.floor(options.playWidth / ratio);
                    resizeVideo(event.target, options.playWidth, newHeight);
                }
   stream = session.createStream(options).on(STREAM_STATUS.PENDING, function(stream) {
         });
        }
        ...
    });
    stream.play();

}

4. Запрос от WCS к RTSP-источнику на трансляцию потока.

...

Code Block
languagejs
themeRDark
    stream = session.createStream(options).on(STREAM_STATUS.PENDING, function(stream) {
        ...
    }).on(STREAM_STATUS.PLAYING, function(stream) {
        ...
    }).on(STREAM_STATUS.STOPPED, function() {
        setStatus(STREAM_STATUS.STOPPED);
        onStopped();
    }).on(STREAM_STATUS.FAILED, function(stream) {
        ...
    }).on(STREAM_STATUS.NOT_ENOUGH_BANDWIDTH, function(stream){
        ...
    });
    stream.play();

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

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

Симптомы: 
а) поток, передаваемый IP камерой по RTSP, не проигрывается, дает задержки видео или подергивания
б) предупреждения в клиентском логе:

Повторное использование подключения к камере

Если к потоку, захваченному с RTSP IP-камеры, присоединяются другие подписчики, будет использовано ранее установленное подключение к камере, при условии, что все подписчики указали одинаковый адрес камеры. Например, запросы к одной и той же камере

Code Block
languagebash
themeRDark
rtsp://host:554/live.sdp

и

Code Block
languagebash
themeRDark
rtsp://host:554/live.sdp?p=1

отличаются, поэтому будет создано два RTSP-подключения, если запросить оба этих потока.

Аутентификация при захвате потока

WCS поддерживает аутентификацию по имени и паролю при захвате RTSP-потока. данные пользователя должны быть указаны в URL потока, например

Code Block
languagebash
themeRDark
rtsp://user:password@hostname/stream

Если в имени или пароле есть какие-либо спецсимволы, они должны быть экранированы. например

Code Block
languagebash
themeRDark
09rtsp:32:31,238 WARN 4BitstreamNormalizer - RTMP-pool-10-thread-5 It is B-frame!

Решение: при возможности запрашивать с камеры поток более низкого разрешения, с более низким качеством таким образом, чтобы исключить использование B-фреймов, либо траскодировать данный поток.

...

//user:p%40ssword@hostname/stream

Здесь

  • user - имя пользователя
  • p@ssword - пароль, символ '@' экранирован при указании URL.

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

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

5. Соединение с IP-камерой разрывается при ошибке в любом из треков (аудио или видео)

...

Code Block
languagebash
themeRDark
rtsp_fail_on_error_track=false
rtp_force_synchronization=true

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

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

6. Символы в имени потока, недопустимые в URI, должны быть экранированы

Симптомы: RTSP-поток не воспроизводится с признаком ошибки 'Bad URI'
Решение: любые символы, недопустимые при указании URI, должны быть экранированы в имени потока, например

Code Block
languagebash
themeRDark
rtsp://hostname/c@@lstream/channel1

должен быть записан как

Code Block
languagebash
themeRDark
10:13:06,815 WARN AAC - AudioProcessor-c6c22de8-a129-43b2-bf67-1f433a814ba9 Dropping AAC frame that starts with 0, 119056e500rtsp://hostname/c%40%40lstream/channel1

7. Некоторые камеры не поддерживают поле cnonce в заголовке сообщения при установке RTSP-соединения.

Симптомы: RTSP-поток играется в VLC, но не играется в WCS.

Решение: в файле flashphoner.properties установить настройку

Code Block
languagebash
themeRDark
rtsp_auth_cnonce=

с пустым значением.