Описание
Все SDK, предоставляемые WCS: WebSDK, AndroidSDK, iOS SDK используют для взаимодействия с сервером на транспортном уровне протокол WebSocket. Поверх WebSocket реализован набор команд для обмена SDP между клиентом и сервером и установки WebRTC медиасессии.
Обмен командами по WebSocket можно наблюдать во время работы примеров приложений WebSDK, например, Two Way Streaming в браузере Chrome. Для этого откройте инструменты разработчика нажав на клавишу F12, раздел Network, выберите имя сервера и перейдите на вкладку Frames
Наборы команд для публикации и воспроизведении видеопотоков
connect
При установке соединения с сервером и создании сессии обмен командами производится следующим образом:
1. Клиент отправляет сообщение connection
{ "message":"connection", "data": [ { "appKey":"defaultApp", "mediaProviders":["WebRTC","MSE","WSPlayer"], "clientVersion":"0.5.28", "clientOSVersion":"5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", "clientBrowserVersion":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36" } ] }
Параметры сообщения
Параметр | Описание |
---|---|
appKey | Идентификатор серверного приложения, которое должно взаимодействовать с бэкенд-сервером во время сеанса |
mediaProviders | Список поддерживаемых клиентом технологий публикации или воспроизведения потока |
clientVersion | Версия SDK клиента |
clientOSVersion | Версия операционной системы клиента |
clientBrowserVersion | Версия браузера клиента |
2. Сервер отправляет сообщение getUserData
{ "message":"getUserData", "data": [ { "useWsTunnel":false, "useWsTunnelPacketization2":false, "useBase64BinaryEncoding":false, "mediaProviders":["WebRTC","MSE","WSPlayer"], "authToken":"/5.129.23.83:50066/188.40.244.249:8443", "status":"ESTABLISHED", "clientVersion":"0.5.28", "clientOSVersion":"5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", "clientBrowserVersion":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", "forceLogger":false, "keepAlive":false } ] }
Это сообщение подтверждает установку WebSocket соединения и успешное получение данных от клиента
Параметры сообщения
Параметр | Описание |
---|---|
useWSTunnel | Используется ли WS-туннель |
useWsTunnelPacketization2 | Используется ли пакетизация при использовании WS-туннеля |
useBase64BinaryEncoding | Используется ли Base64 кодировка |
mediaProviders | Список поддерживаемых клиентом технологий публикации или воспроизведения потока |
authToken | Токен авторизации, он же идентификатор сессии, сформированный из IP адреса и порта клиента и сервера |
status | Статус WebSocket сессии |
clientVersion | Версия SDK клиента |
clientOSVersion | Версия операционной системы клиента |
clientBrowserVersion | Версия браузера клиента |
forceLogger | Включено ли принудительное логирование |
keepAlive | Используются ли Keep Alive |
3. Сервер отправляет сообщение getVersion
{ "message":"getVersion", "data": [ "5.1.3674-9b5b684ac81a1c7e62d7a38e0c3a2c2433faacf9" ] }
В сообщении указывается версия WCS
4. При отсутствии других сообщений со стороны клиента, сервер периодически отправляет сообщение ping
{ "message":"ping", "data":[] }
на которое клиент должен ответить сообщением pong
{ "message":"pong", "data":[null] }
publish
При публикации потока обмен командами производится следующим образом:
1. Клиент отправляет сообщение publishStream
{ "message":"publishStream", "data": [ { "mediaSessionId":"90e14ad0-fdb2-11e8-bce2-a3f72476fb49", "name":"test", "published":true, "hasVideo":true, "hasAudio":true, "status":"PENDING", "record":false, "mediaProvider":"WebRTC", "sdp":"v=0\r\no=- 1712288193115840199 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS EZ5Uy6UkPtEoScWkyAcP5rabBY6buERZjQpH\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:qgOt\r\na=ice-pwd:KEfomSLSL4Pxj78N6T3/HAMY\r\na=ice-options:trickle\r\na=fingerprint:sha-256 EE:BC:55:18:45:6C:B4:5C:28:6F:5D:F9:42:63:1B:A2:99:8D:7A:0B:19:C3:F5:62:12:63:82:B6:F0:2C:36:E2\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3498121776 cname:Ft3gt16szZ3kAllO\r\na=ssrc:3498121776 msid:EZ5Uy6UkPtEoScWkyAcP5rabBY6buERZjQpH 55944815-d49b-4ab2-bc19-3ecdca00b4a2\r\na=ssrc:3498121776 mslabel:EZ5Uy6UkPtEoScWkyAcP5rabBY6buERZjQpH\r\na=ssrc:3498121776 label:55944815-d49b-4ab2-bc19-3ecdca00b4a2\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 123 127 122 125 107 108 109 124\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:qgOt\r\na=ice-pwd:KEfomSLSL4Pxj78N6T3/HAMY\r\na=ice-options:trickle\r\na=fingerprint:sha-256 EE:BC:55:18:45:6C:B4:5C:28:6F:5D:F9:42:63:1B:A2:99:8D:7A:0B:19:C3:F5:62:12:63:82:B6:F0:2C:36:E2\r\na=setup:actpass\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 urn:3gpp:video-orientation\r\na=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:10 http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07\r\na=sendonly\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 H264/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:123 rtx/90000\r\na=fmtp:123 apt=102\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=127\r\na=rtpmap:125 H264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 transport-cc\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 red/90000\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:124 ulpfec/90000\r\na=ssrc-group:FID 3064307282 2143201641\r\na=ssrc:3064307282 cname:Ft3gt16szZ3kAllO\r\na=ssrc:3064307282 msid:EZ5Uy6UkPtEoScWkyAcP5rabBY6buERZjQpH 77c7bd16-9a65-4f62-9d01-6ecdd3e58f8a\r\na=ssrc:3064307282 mslabel:EZ5Uy6UkPtEoScWkyAcP5rabBY6buERZjQpH\r\na=ssrc:3064307282 label:77c7bd16-9a65-4f62-9d01-6ecdd3e58f8a\r\na=ssrc:2143201641 cname:Ft3gt16szZ3kAllO\r\na=ssrc:2143201641 msid:EZ5Uy6UkPtEoScWkyAcP5rabBY6buERZjQpH 77c7bd16-9a65-4f62-9d01-6ecdd3e58f8a\r\na=ssrc:2143201641 mslabel:EZ5Uy6UkPtEoScWkyAcP5rabBY6buERZjQpH\r\na=ssrc:2143201641 label:77c7bd16-9a65-4f62-9d01-6ecdd3e58f8a\r\n", "bitrate":0, "minBitrate":0, "maxBitrate":0 } ] }
Параметры сообщения
Параметр | Описание |
---|---|
mediaSessionId | Идентификатор WebRTC медиасессии |
name | Имя публикуемого потока |
hasVideo | Присутствует ли видео в потоке |
hasAudio | Присутствует ли аудио в потоке |
status | Статус потока |
record | Записывать ли поток на сервере |
mediaProvider | Технология, используемая для публикации |
sdp | SDP, предлагаемое клиентом |
bitrate | Битрейт потока (если 0, то устанавливается в ходе публикации) |
minBitrate | Минимальный битрейт потока (если 0, то не ограничивается) |
maxBitrate | Максимальный битрейт потока (если 0, то не ограничивается) |
2. Сервер отправляет сообщение setRemoteSDP
{ "message":"setRemoteSDP", "data": [ "90e14ad0-fdb2-11e8-bce2-a3f72476fb49", "v=0\r\no=Flashphoner 0 1544579813187 IN IP4 188.40.244.249\r\ns=Flashphoner/1.0\r\nc=IN IP4 188.40.244.249\r\nt=0 0\r\nm=audio 31686 RTP/SAVPF 111 8 9\r\nc=IN IP4 188.40.244.249\r\na=mid:audio\r\na=rtpmap:111 opus/48000/2\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:9 G722/8000\r\na=ptime:20\r\na=ice-pwd:40u9aoieitv0u62tol3pr1g3h4\r\na=ice-ufrag:90e14ad0-fdb2-11e8-bce2-a3f72476fb49cfmkh1cug233q2\r\na=fingerprint:SHA-256 33:7A:40:CF:1C:42:03:20:EE:E9:F9:95:24:2A:95:85:D6:25:A9:68:C6:CF:40:09:82:74:B4:C3:F9:97:E6:EE\r\na=candidate:1 1 udp 2130706431 188.40.244.249 31686 typ host\r\na=candidate:1 2 udp 2130706431 188.40.244.249 31686 typ host\r\na=end-of-candidates\r\na=rtcp-mux\r\na=rtcp:31686 IN IP4 188.40.244.249\r\na=recvonly\r\nm=video 31920 RTP/SAVPF 100 127 102 125 96\r\nc=IN IP4 188.40.244.249\r\na=mid:video\r\na=rtpmap:100 H264/90000\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:127 H264/90000\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:102 H264/90000\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:125 H264/90000\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:* ccm fir\r\na=rtcp-fb:* nack\r\na=rtcp-fb:* nack pli\r\na=rtcp-fb:* goog-remb\r\na=ice-pwd:40u9aoieitv0u62tol3pr1g3h4\r\na=ice-ufrag:90e14ad0-fdb2-11e8-bce2-a3f72476fb49cfmkh1cug233q2\r\na=fingerprint:SHA-256 33:7A:40:CF:1C:42:03:20:EE:E9:F9:95:24:2A:95:85:D6:25:A9:68:C6:CF:40:09:82:74:B4:C3:F9:97:E6:EE\r\na=candidate:1 1 udp 2130706431 188.40.244.249 31920 typ host\r\na=candidate:1 2 udp 2130706431 188.40.244.249 31920 typ host\r\na=end-of-candidates\r\na=rtcp-mux\r\na=rtcp:31920 IN IP4 188.40.244.249\r\na=recvonly\r\n", true ] }
В сообщении содержатся:
- идентификатор медиасессии
- SDP, предложенное сервером
3. После того, как поток успешно опубликован на сервере, сервер отправляет сообщение notifyStreamStatusEvent
{ "message":"notifyStreamStatusEvent", "data": [ { "mediaSessionId":"90e14ad0-fdb2-11e8-bce2-a3f72476fb49", "name":"test", "published":true, "hasVideo":true, "hasAudio":true, "status":"PUBLISHING", "audioCodec":"opus", "videoCodec":"H264", "record":false, "width":0, "height":0, "bitrate":0, "minBitrate":0, "maxBitrate":0, "quality":0, "createDate":1544579813186, "streamInfo": { "nodeId":null, "appKey":null, "sessionId":null, "mediaSessionId":"90e14ad0-fdb2-11e8-bce2-a3f72476fb49", "name":"test", "samplingTime":null, "recordTimestamp":null, "recordStarted":false }, "mediaProvider":"WebRTC" } ] }
Параметры сообщения
Параметр | Описание |
---|---|
mediaSessionId | Идентификатор WebRTC медиасессии |
name | Имя публикуемого потока |
published | Поток опубликован на сервере |
hasVideo | Присутствует ли видео в потоке |
hasAudio | Присутствует ли аудио в потоке |
status | Статус потока |
audioCodec | Аудиокодек |
videoCodec | Видеокодек |
record | Записывается ли поток на сервере |
width | Ширина кадра (если 0, то устанавливается в ходе публикации) |
height | Высота кадра (если 0, то устанавливается в ходе публикации) |
bitrate | Битрейт потока (если 0, то устанавливается в ходе публикации) |
minBitrate | Минимальный битрейт потока (если 0, то не ограничивается) |
maxBitrate | Максимальный битрейт потока (если 0, то не ограничивается) |
quality | Показатель качества потока |
createDate | Дата создания в виде целого числа |
streamInfo | Дополнительная информация о потоке на сервере |
mediaProvider | Технология, используемая для публикации |
unpublish
При остановке публикации потока обмен командами производится следующим образом:
1. Клиент отправляет сообщение unPublishStream
{ "message":"unPublishStream", "data": [ { "mediaSessionId":"1d91ae20-fdb3-11e8-bddf-9b115426f01b", "name":"test", "published":true, "hasVideo":true, "hasAudio":true, "status":"PUBLISHING", "record":false } ] }
Параметры сообщения
Параметр | Описание |
---|---|
mediaSessionId | Идентификатор WebRTC медиасессии |
name | Имя публикуемого потока |
published | Поток опубликован на сервере |
hasVideo | Присутствует ли видео в потоке |
hasAudio | Присутствует ли аудио в потоке |
status | Статус потока |
record | Записывается ли поток на сервере |
2. Сервер останавливает публикацию и отправляет сообщение notifyStreamStatusEvent
{ "message":"notifyStreamStatusEvent", "data": [ { "mediaSessionId":"1d91ae20-fdb3-11e8-bddf-9b115426f01b", "name":"test", "published":true, "hasVideo":true, "hasAudio":true, "status":"UNPUBLISHED", "audioCodec":"opus", "videoCodec":"H264", "info":"Stopped by publisher stop", "record":false, "width":320, "height":240, "bitrate":0, "minBitrate":0, "maxBitrate":0, "quality":0, "createDate":1544580045898, "streamInfo": { "nodeId":null, "appKey":null, "sessionId":null, "mediaSessionId":"1d91ae20-fdb3-11e8-bddf-9b115426f01b", "name":"test", "samplingTime":null, "recordTimestamp":null, "recordStarted":false }, "mediaProvider":"WebRTC" } ] }
Параметры сообщения
Параметр | Описание |
---|---|
mediaSessionId | Идентификатор WebRTC медиасессии |
name | Имя публикуемого потока |
published | Поток опубликован на сервере |
hasVideo | Присутствует ли видео в потоке |
hasAudio | Присутствует ли аудио в потоке |
status | Статус потока |
audioCodec | Аудиокодек |
videoCodec | Видеокодек |
record | Записывается ли поток на сервере |
width | Ширина кадра (если 0, то устанавливается в ходе публикации) |
height | Высота кадра (если 0, то устанавливается в ходе публикации) |
bitrate | Битрейт потока (если 0, то устанавливается в ходе публикации) |
minBitrate | Минимальный битрейт потока (если 0, то не ограничивается) |
maxBitrate | Максимальный битрейт потока (если 0, то не ограничивается) |
quality | Показатель качества потока |
createDate | Дата создания в виде целого числа |
streamInfo | Дополнительная информация о потоке на сервере |
mediaProvider | Технология, используемая для публикации |
play
При воспроизведении потока обмен командами производится следующим образом:
1. Клиент отправляет сообщение playStream
{ "message":"playStream", "data": [ { "mediaSessionId":"22588500-fdb3-11e8-bddf-9b115426f01b", "name":"test", "published":false, "hasVideo":true, "hasAudio":true, "status":"PENDING", "record":false, "width":0, "height":0, "mediaProvider":"WebRTC", "sdp":"v=0\r\no=- 6636414462219466101 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:33IG\r\na=ice-pwd:R78vJJetyP2WeWpU6QWKGbJA\r\na=ice-options:trickle\r\na=fingerprint:sha-256 72:67:0A:92:8B:C2:CB:13:4E:7F:66:BB:AF:99:4A:0C:D9:C3:C1:3E:B9:B8:24:EB:2E:64:39:B2:19:76:85:09\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 123 127 122 125 107 108 109 124\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:33IG\r\na=ice-pwd:R78vJJetyP2WeWpU6QWKGbJA\r\na=ice-options:trickle\r\na=fingerprint:sha-256 72:67:0A:92:8B:C2:CB:13:4E:7F:66:BB:AF:99:4A:0C:D9:C3:C1:3E:B9:B8:24:EB:2E:64:39:B2:19:76:85:09\r\na=setup:actpass\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 urn:3gpp:video-orientation\r\na=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:10 http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07\r\na=recvonly\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 H264/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:123 rtx/90000\r\na=fmtp:123 apt=102\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=127\r\na=rtpmap:125 H264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 transport-cc\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 red/90000\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:124 ulpfec/90000\r\n", "bitrate":0, "minBitrate":0, "maxBitrate":0, "quality":0 } ] }
Параметры сообщения
Параметр | Описание |
---|---|
mediaSessionId | Идентификатор WebRTC медиасессии |
name | Имя потока для воспроизведения |
published | Поток опубликован на сервере (игнорируется) |
hasVideo | Присутствует ли видео в потоке |
hasAudio | Присутствует ли аудио в потоке |
status | Статус потока (всегда "PENDING") |
record | Записывать ли поток на сервере (игнорируется) |
width | Ширина кадра (если 0, то воспроизвести, как опубликовано) |
height | Высота кадра (если 0, то воспроизвести, как опубликовано) |
mediaProvider | Технология, используемая для воспроизведения |
sdp | SDP, предлагаемое клиентом |
bitrate | Битрейт потока (если 0, то устанавливается в ходе воспроизведения) |
minBitrate | Минимальный битрейт потока (если 0, то не ограничивается) |
maxBitrate | Максимальный битрейт потока (если 0, то не ограничивается) |
quality | Показатель качества потока (если 0, то воспроизвести, как опубликовано) |
2. Сервер отправляет сообщение notifyAudioCodec
{ "message":"notifyAudioCodec", "data": [ "22588500-fdb3-11e8-bddf-9b115426f01b", { "name":"opus" } ] }
Сообщение содержит:
- Идентификатор WebRTC медиасессии
- Имя аудиокодека, используемого для публикации потока
3. Сервер отправляет сообщение setRemoteSDP
{ "message":"setRemoteSDP", "data": [ "22588500-fdb3-11e8-bddf-9b115426f01b", "v=0\r\no=Flashphoner 0 1544580053583 IN IP4 188.40.244.249\r\ns=Flashphoner/1.0\r\nc=IN IP4 188.40.244.249\r\nt=0 0\r\nm=audio 31354 RTP/SAVPF 111 8 9\r\nc=IN IP4 188.40.244.249\r\na=mid:audio\r\na=rtpmap:111 opus/48000/2\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:9 G722/8000\r\na=ptime:20\r\na=ice-pwd:1lbmj56an4qr2airc0adreiede\r\na=ice-ufrag:22588500-fdb3-11e8-bddf-9b115426f01bvu7m1cug2aei5\r\na=fingerprint:SHA-256 33:7A:40:CF:1C:42:03:20:EE:E9:F9:95:24:2A:95:85:D6:25:A9:68:C6:CF:40:09:82:74:B4:C3:F9:97:E6:EE\r\na=candidate:1 1 udp 2130706431 188.40.244.249 31354 typ host\r\na=candidate:1 2 udp 2130706431 188.40.244.249 31354 typ host\r\na=end-of-candidates\r\na=rtcp-mux\r\na=rtcp:31354 IN IP4 188.40.244.249\r\na=sendonly\r\na=ssrc:1734923542 cname:rtp/audio/22588500-fdb3-11e8-bddf-9b115426f01b\r\nm=video 31248 RTP/SAVPF 100 127 102 125 96\r\nc=IN IP4 188.40.244.249\r\na=mid:video\r\na=rtpmap:100 H264/90000\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:127 H264/90000\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:102 H264/90000\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:125 H264/90000\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:* ccm fir\r\na=rtcp-fb:* nack\r\na=rtcp-fb:* nack pli\r\na=rtcp-fb:* goog-remb\r\na=ice-pwd:1lbmj56an4qr2airc0adreiede\r\na=ice-ufrag:22588500-fdb3-11e8-bddf-9b115426f01bvu7m1cug2aei5\r\na=fingerprint:SHA-256 33:7A:40:CF:1C:42:03:20:EE:E9:F9:95:24:2A:95:85:D6:25:A9:68:C6:CF:40:09:82:74:B4:C3:F9:97:E6:EE\r\na=candidate:1 1 udp 2130706431 188.40.244.249 31248 typ host\r\na=candidate:1 2 udp 2130706431 188.40.244.249 31248 typ host\r\na=end-of-candidates\r\na=rtcp-mux\r\na=rtcp:31248 IN IP4 188.40.244.249\r\na=sendonly\r\na=ssrc:1329233369 cname:rtp/video/22588500-fdb3-11e8-bddf-9b115426f01b\r\n", true ] }
Сообщение содержит:
- Идентификатор WebRTC медиасессии
- SDP, предлагаемое сервером
3. После того, как началась передача медиаданных, сервер отправляет сообщение notifyStreamStatusEvent
{ "message":"notifyStreamStatusEvent", "data": [ { "mediaSessionId":"22588500-fdb3-11e8-bddf-9b115426f01b", "name":"test", "published":false, "hasVideo":true, "hasAudio":true, "status":"PLAYING", "audioCodec":"opus", "videoCodec":"H264", "record":false, "width":0, "height":0, "bitrate":0, "minBitrate":0, "maxBitrate":0, "quality":0, "createDate":1544580053573, "streamInfo": { "nodeId":null, "appKey":null, "sessionId":null, "mediaSessionId":"22588500-fdb3-11e8-bddf-9b115426f01b", "name":"test", "samplingTime":null, "recordTimestamp":null, "recordStarted":false }, "mediaProvider":"WebRTC" } ] }
Параметры сообщения
Параметр | Описание |
---|---|
mediaSessionId | Идентификатор WebRTC медиасессии |
name | Имя воспроизводимого потока |
published | Поток опубликован на сервере (игнорируется) |
hasVideo | Присутствует ли видео в потоке |
hasAudio | Присутствует ли аудио в потоке |
status | Статус потока |
audioCodec | Аудиокодек |
videoCodec | Видеокодек |
record | Записывается ли поток на сервере |
width | Ширина кадра (если 0, то устанавливается в ходе воспроизведения) |
height | Высота кадра (если 0, то устанавливается в ходе воспроизведения) |
bitrate | Битрейт потока (если 0, то устанавливается в ходе воспроизведения) |
minBitrate | Минимальный битрейт потока (если 0, то не ограничивается) |
maxBitrate | Максимальный битрейт потока (если 0, то не ограничивается) |
quality | Показатель качества потока |
createDate | Дата создания в виде целого числа |
streamInfo | Дополнительная информация о потоке на сервере |
mediaProvider | Технология, используемая для воспроизведения |
4. Сервер отправляет сообщение notifyVideoFormat
{ "message":"notifyVideoFormat", "data": [ { "streamerVideoWidth":320, "streamerVideoHeight":240, "mediaSessionId":"22588500-fdb3-11e8-bddf-9b115426f01b", "status":"RESIZE" } ] }
Параметры сообщения
Параметр | Описание |
---|---|
streamerVideoWidth | Ширина публикуемого кадра |
streamerVideoHeight | Высота публикуемого кадра |
mediaSessionId | Идентификатор WebRTC медиасессии |
status | Статус видеодорожки потока |
stop
При остановке воспроизведения потока обмен командами производится следующим образом:
1. Клиент отправляет сообщение stopStream
{ "message":"stopStream", "data": [ { "mediaSessionId":"22588500-fdb3-11e8-bddf-9b115426f01b", "name":"test", "published":false, "hasVideo":true, "hasAudio":true, "status":"PLAYING", "record":false } ] }
Параметры сообщения
Параметр | Описание |
---|---|
mediaSessionId | Идентификатор WebRTC медиасессии |
name | Имя воспроизводимого потока |
published | Поток опубликован на сервере (игнорируется) |
hasVideo | Присутствует ли видео в потоке |
hasAudio | Присутствует ли аудио в потоке |
status | Статус потока |
record | Записывается ли поток на сервере |
2. Сервер останавливает воспроизведение и отправляет сообщение notifyStreamStatusEvent
{ "message":"notifyStreamStatusEvent", "data": [ { "mediaSessionId":"22588500-fdb3-11e8-bddf-9b115426f01b", "name":"test", "published":false, "hasVideo":true, "hasAudio":true, "status":"STOPPED", "audioCodec":"opus", "videoCodec":"H264", "info":"Stopped by user", "record":false, "width":320, "height":240, "bitrate":0, "minBitrate":0, "maxBitrate":0, "quality":0, "createDate":1544580053573, "streamInfo": { "nodeId":null, "appKey":null, "sessionId":null, "mediaSessionId":"22588500-fdb3-11e8-bddf-9b115426f01b", "name":"test", "samplingTime":null, "recordTimestamp":null, "recordStarted":false }, "mediaProvider":"WebRTC" } ] }
Параметры сообщения
Параметр | Описание |
---|---|
mediaSessionId | Идентификатор WebRTC медиасессии |
name | Имя воспроизводимого потока |
published | Поток опубликован на сервере (игнорируется) |
hasVideo | Присутствует ли видео в потоке |
hasAudio | Присутствует ли аудио в потоке |
status | Статус потока |
audioCodec | Аудиокодек |
videoCodec | Видеокодек |
info | Текстовое описание статуса |
record | Записывается ли поток на сервере |
width | Ширина кадра |
height | Высота кадра |
bitrate | Битрейт потока |
minBitrate | Минимальный битрейт потока |
maxBitrate | Максимальный битрейт потока |
quality | Показатель качества потока |
createDate | Дата создания в виде целого числа |
streamInfo | Дополнительная информация о потоке на сервере |
mediaProvider | Технология, используемая для воспроизведения |
Метрики публикации/воспроизведения
В сборке 5.2.576 к сообщениям inboundVideoRate, outboundVideoRate, предназначенным для мониторинга качества канала публикации/воспроизведения, добавлены основные метрики потока, для контроля их на стороне клиента:
{ "message":"inboundVideoRate", "data": [ { "mediaSessionId":"a12145d0-7eee-11ea-9833-9da59e0cc100", "videoRate":704856, "fps":31, "nack":0, "pli":0, "lostPackets":0, "width":640, "height":360 } ] } { "message":"outboundVideoRate", "data": [ { "mediaSessionId":"0040ed40-7eef-11ea-9833-9da59e0cc100", "videoRate":685256, "fps":30, "nack":0, "pli":13, "lostPackets":0, "width":640, "height":360 } ] }
Параметры сообщения
Параметр | Описание |
---|---|
mediaSessionId | Идентификатор WebRTC медиасессии |
videoRate | Битрейт видео, бит/с |
fps | Частота кадров |
nack | Количество NACK пакетов |
pli | Количество PLI запросов |
lostPackets | Количество потерянных пакетов |
width | Ширина картинки |
height | Высота картинки |
Проверка доступности потока на сервере
Для проверки доступности потока на сервере необходимо отправить сообщение availableStream
[ { "mediaSessionId": "2f693140-7d54-11eb-91fe-1fd0fb28f180", "name": "test" } ]
Параметры сообщения
Параметр | Описание |
---|---|
mediaSessionId | Идентификатор WebRTC медиасессии |
name | Имя потока |
В ответ сервер пришлет сообщение availableStream
[ { "status": "false", "info": "Restricted access", "id": "2f693140-7d54-11eb-91fe-1fd0fb28f180" } ]
Параметры сообщения
Параметр | Описание |
---|---|
status | true, если поток доступен для воспроизведения false, если недоступен |
info | Причина недоступности потока |
id | Идентификатор WebRTC медиасессии |
Информация о причине недоступности потока поддерживается, начиная со сборки 5.2.911