Видеопоток захватывается с RTSP-источника, отдающего аудио и видео в поддерживаемых кодеках. Далее видеопоток трансформируется на стороне сервера для воспроизведения в браузерах и мобильных устройствах.
Chrome | Firefox | Safari 11 | Internet Explorer | Edge | |
---|---|---|---|---|---|
Windows | + | + | + | + | |
Mac OS | + | + | + | ||
Android | + | + | |||
iOS | - | - | + |
В некоторых случаях, например, если подключение к IP-камере для захвата потока по RTSP производится через VPN, RTSP-клиент должен быть привязан к определенному адресу. Адрес указывается при помощи опции rtsp_client_address в файле настроек flashphoner.properties, например
rtsp_client_address=172.16.0.3 |
По умолчанию, RTSP потоки захватываются по TCP. При необходимости, можно переключиться на захват потоков по UDP при помощи параметра
rtsp_interleaved_mode=false |
По умолчанию, аудио и видео каналы в RTSP потоке выбираются динамически, в соответствии с SDP, полученным от камеры. При необходимости, выбор каналов может быть указан принудительно при помощи параметра, например
rtsp_interleaved_channels=2-3;0-1 |
Здесь
1. Для теста используем:
2. Откройте веб-приложение Player, укажите в поле "Stream" URL веб-камеры:
3. Нажмите кнопку "Start". Начнется трансляция захваченного потока.
4. Графики WebRTC internals:
Как правило, для захвата потока с IP-камеры достаточно указать URL-камеры в качестве имени потока при его создании. Однако, при необходимости, возможно управлять захватом RTSP-потока при помощи REST API.
1. Для теста используем:
2. Откройте REST-клиент. Отправьте запрос /rtsp/startup, указав в параметрах URL веб-камеры:
3. Убедитесь, что поток захвачен сервером. Для этого отправьте запрос /rtsp/find_all:
4. Откройте веб-приложение Player, укажите в поле "Stream" URL веб-камеры и нажмите Start. Начнется воспроизведение потока в браузере:
5. Отправьте запрос /rtsp/terminate, указав в параметрах URL веб-камеры:
6. Воспроизведение потока прервется с ошибкой:
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
Здесь:
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | |
---|---|---|---|---|---|
/rtsp/startup |
| 409 - Conflict 500 - Internal error | Извлечь RTSP-поток по указанному URL | ||
/rtsp/find_all |
| 200 – потоки найдены 404 – потоки не найдены | Найти все извлеченные RTSP-потоки | ||
/rtsp/terminate |
| 200 - поток завершен 404 - поток не найден | Завершить извлеченный RTSP-поток |
Имя параметра | Описание | Пример |
---|---|---|
uri | URL RTSP-потока | rtsp://myserver.com/live/myStream |
toStream | Имя, которое будет присвоено извлеченному потоку | myRTSPstream |
status | Текущий статус потока | PLAYING |
Ниже описана последовательность вызовов при использовании примера Player
1. Установка соединения с сервером.
Flashphoner.createSession(); code
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){ setStatus(session.status()); //session connected, start playback playStream(session); }).on(SESSION_STATUS.DISCONNECTED, function(){ setStatus(SESSION_STATUS.DISCONNECTED); onStopped(); }).on(SESSION_STATUS.FAILED, function(){ setStatus(SESSION_STATUS.FAILED); onStopped(); }); |
2. Получение от сервера события, подтверждающего успешное соединение.
ConnectionStatusEvent ESTABLISHED code
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){ setStatus(session.status()); //session connected, start playback playStream(session); }).on(SESSION_STATUS.DISCONNECTED, function(){ ... }).on(SESSION_STATUS.FAILED, function(){ ... }); |
3. Запрос на воспроизведение потока.
session.createStream(), stream.play(); code
URL IP-камеры передается в метод createStream() как имя потока
function playStream(session) { var streamName = $('#streamName').val(); var options = { name: streamName, display: remoteVideo, flashShowFullScreenButton: true }; ... stream = session.createStream(options).on(STREAM_STATUS.PENDING, function(stream) { ... }); stream.play(); } |
4. Запрос от WCS к RTSP-источнику на трансляцию потока.
5. Трансляция RTSP-потока
6. Получение от сервера события, подтверждающего успешный захват и проигрывание потока.
StreamStatusEvent, статус PLAYING code
stream = session.createStream(options).on(STREAM_STATUS.PENDING, function(stream) { ... }).on(STREAM_STATUS.PLAYING, function(stream) { $("#preloader").show(); setStatus(stream.status()); onStarted(stream); ... }); stream.play(); |
7. Отправка аудио-видео потока по WebRTC
8. Остановка воспроизведения потока.
stream.stop(); code
function onStarted(stream) { $("#playBtn").text("Stop").off('click').click(function(){ $(this).prop('disabled', true); stream.stop(); }).prop('disabled', false); $("#fullScreenBtn").off('click').click(function(){ stream.fullScreen(); }).prop('disabled', false); $("#volumeControl").slider("enable"); stream.setVolume(currentVolumeValue); } |
9. Получение от сервера события, подтверждающего остановку воспроизведения потока.
StreamStatusEvent, статус STOPPED code
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(); |
Если к потоку, захваченному с RTSP IP-камеры, присоединяются другие подписчики, будет использовано ранее установленное подключение к камере, при условии, что все подписчики указали одинаковый адрес камеры. Например, запросы к одной и той же камере
rtsp://host:554/live.sdp |
и
rtsp://host:554/live.sdp?p=1 |
отличаются, поэтому будет создано два RTSP-подключения, если запросить оба этих потока.
WCS поддерживает аутентификацию по имени и паролю при захвате RTSP-потока. данные пользователя должны быть указаны в URL потока, например
rtsp://user:password@hostname/stream |
Если в имени или пароле есть какие-либо спецсимволы, они должны быть экранированы. например
rtsp://user:p%40ssword@hostname/stream |
Здесь
Некоторые IP-камеры возвращают 302 Moved Temporarily в ответ на запрос DESCRIBE или OPTIONS и перенаправляют клиента на другой адрес для установки RTSP-соединения. WCS поддерживает данную возможность, начиная со сборки 5.2.179.
При этом, если камера перенаправляет запросы на другой адрес, и если подключиться отдельно к этой камере и непосредственно к камере, куда производится перенаправление, с точки зрения WCS это будут два различных потока. Для каждого из этих потоков создается свой агент захвата, и подписчики присоединяются к тому или другому агенту в зависимости от того, какой адрес они указывают при подключении.
В сборке 5.2.479 добавлена возможность опубликовать захваченный RTSP поток на сервере под заданным именем. Имя должно быть указано параметром toStream
REST запроса /rtsp/startup, например
POST /rest-api/rtsp/startup HTTP/1.1 Content-Length: 75 Content-Type: application/json { "toStream": "stream1", "uri": "rtsp://myserver.com/live/myStream" } |
По умолчанию, если параметр toStream
не указан, имя формируется из URI потока. Если RTSP поток с таким URI уже был захвачен, или на сервере существует поток с указанным именем, в ответ на запрос сервер вернет 409 Conflict.
Если захваченному RSTP потоку назначено имя, этот поток может быть воспроизведен по имени в CDN (по умолчанию, для RTSP потоков эта функция недоступна, т.к. они захватываются локально).
5. Соединение с IP-камерой разрывается при ошибке в любом из треков (аудио или видео)
Симптомы: соединение с IP-камерой разрывается, если один из треков вернул ошибку 4**.
Решение: данное поведение включено по умолчанию. Однако, если единичные ошибки не являются критичными и не требуют прекращения трансляции, в файле flashphoner.properties необходимо указать
rtsp_fail_on_error_track=false rtp_force_synchronization=true |
6. Символы в имени потока, недопустимые в URI, должны быть экранированы
Симптомы: RTSP-поток не воспроизводится с признаком ошибки 'Bad URI'
Решение: любые символы, недопустимые при указании URI, должны быть экранированы в имени потока, например
rtsp://hostname/c@@lstream/channel1 |
должен быть записан как
rtsp://hostname/c%40%40lstream/channel1 |
7. Некоторые камеры не поддерживают поле cnonce
в заголовке сообщения при установке RTSP-соединения.
Симптомы: RTSP-поток играется в VLC, но не играется в WCS.
Решение: в файле flashphoner.properties установить настройку
rtsp_auth_cnonce= |
с пустым значением.