REST хук подтверждения¶
Описание работы на примере хука /publishStream¶
REST хук /publishStream относится к подтверждающим (confirm), т.к. WCS вызывает данный хук при попытке клиента опубликовать видеопоток. Эта операция может быть авторизована, т.е. отменена либо разрешена, и параметры этой операции могут быть переопределены на стороне бэкенд сервера. Например, поле name: "stream1" может быть заменено на name: "stream2", и если такая замена успешно пройдет, WCS будет публиковать поток уже с новым именем stream2.
Последовательность вызовов:
Пример:
POST /rest/my_api/publishStream HTTP/1.1
Accept: application/json
Content-Type: application/json;charset=UTF-8
User-Agent: Java/1.8.0_111
Host: 192.168.1.101
Connection: keep-alive
Content-Length: 3611
{
"nodeId":"Hw47CFMBEchVOpBMDr29IxjudnJ1sjOY@192.168.1.101",
"appKey":"defaultApp",
"sessionId":"/192.168.1.102:4388/192.168.1.101:8443",
"mediaSessionId":"56141d10-fddc-11e6-ac3a-4d67d5b3360d",
"name":"b4e7",
"published":true,
"hasVideo":true,
"hasAudio":true,
"status":"PENDING",
"sdp":".....",
"record":false,
"width":0,
"height":0,
"bitrate":0,
"quality":0,
"mediaProvider":"WebRTC"
}
HTTP/1.1 200 OK
Date: Tue, 28 Feb 2017 17:35:43 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
Content-Length: 3653
Connection: close
Content-Type: application/json
{
"nodeId":"Hw47CFMBEchVOpBMDr29IxjudnJ1sjOY@192.168.1.101",
"appKey":"defaultApp",
"sessionId":"\/192.168.1.102:4388\/192.168.1.101:8443",
"mediaSessionId":"56141d10-fddc-11e6-ac3a-4d67d5b3360d",
"name":"b4e7",
"published":true,
"hasVideo":true,
"hasAudio":true,
"status":"PENDING",
"sdp":"",
"record":false,
"width":0,
"height":0,
"bitrate":0,
"quality":0,
"mediaProvider":"WebRTC"
}
Аутентификация¶
Аутентификация проходит так же, как и в случае вызова /connect. Можно передать токен или пароль, или разрешить/запретить операцию, основываясь на других параметрах.
Для работы аутентификации нужно настроить метод /publishStream на этапе подключения (/connect) и выставить restOnError: FAIL в объекте restClientConfig.
Пример:
POST /rest/my_api/publishStream HTTP/1.1
Accept: application/json
Content-Type: application/json;charset=UTF-8
User-Agent: Java/1.8.0_111
Host: 192.168.1.101
Connection: keep-alive
Content-Length: 3639
{
"nodeId":"Hw47CFMBEchVOpBMDr29IxjudnJ1sjOY@192.168.1.101",
"appKey":"defaultApp",
"sessionId":"/192.168.1.102:17749/192.168.1.101:8443",
"mediaSessionId":"0e17ab50-fdbc-11e6-8a47-c5292ef61cc0",
"name":"3a88",
"published":true,
"hasVideo":true,
"hasAudio":true,
"status":"PENDING",
"sdp":".....",
"record":false,
"width":0,
"height":0,
"bitrate":0,
"quality":0,
"mediaProvider":"WebRTC",
"custom":{
"token":"abcdef"
}
}
Переопределение полей¶
Переопределение полей проходит при нормальной работе хука и возврате 200 OK. Например, пользователь публикует поток stream1, но на сервере его имя меняется на stream2. Эту возможность можно использовать для сокрытия реального имени потока на сервере или адреса RTSP потока от зрителей.
Чтобы выполнить такое переопределение, нужно:
- Включить
"restPolicy":"OVERWRITE"для методаpublishStreamпри подключении к серверу, в restClientConfig. - Перечислить через запятую в
"restOverwrite":""список полей, которые должны быть перезаписаны, например"restOverwrite":"name"вrestClientConfig. В этом случае будет перезаписано только поле name - имя потока. - Вернуть в теле JSON ответа
200 OKмодифицированное полеname, а остальные поля вернуть такими, какими они были получены от WCS-сервера.
Пример:
POST /rest/my_api/publishStream HTTP/1.1
Accept: application/json
Content-Type: application/json;charset=UTF-8
User-Agent: Java/1.8.0_111
Host: 192.168.1.101
Connection: keep-alive
Content-Length: 3612
{
"nodeId":"Hw47CFMBEchVOpBMDr29IxjudnJ1sjOY@192.168.1.101",
"appKey":"defaultApp",
"sessionId":"/192.168.1.102:12514/192.168.1.101:8443",
"mediaSessionId":"abbe7e90-fdcd-11e6-9831-bd76c6e822a1",
"name":"2a0c",
"published":true,
"hasVideo":true,
"hasAudio":true,
"status":"PENDING",
"sdp":".....",
"record":false,
"width":0,
"height":0,
"bitrate":0,
"quality":0,
"mediaProvider":"WebRTC"
}
HTTP/1.1 200 OK
Date: Tue, 28 Feb 2017 15:50:44 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
Content-Length: 3669
Connection: close
Content-Type: application/json
{
"nodeId":"Hw47CFMBEchVOpBMDr29IxjudnJ1sjOY@192.168.1.101",
"appKey":"defaultApp",
"sessionId":"\/192.168.1.102:12514\/192.168.1.101:8443",
"mediaSessionId":"abbe7e90-fdcd-11e6-9831-bd76c6e822a1",
"name":"streamChangedName",
"published":true,
"hasVideo":true,
"hasAudio":true,
"status":"PENDING",
"sdp":".....",
"record":false,
"width":0,
"height":0,
"bitrate":0,
"quality":0,
"mediaProvider":"WebRTC"
}
Исключение полей из передачи¶
Этот метод работает только в одном направлении - от WCS к бэкенд серверу. Т.е. можно исключить одно или несколько полей, которые передаются от WCS сервера к бэкенд серверу в теле JSON запроса на шаге 2 (см рисунок ниже).
По-умолчанию /publishStream передает весь набор полей. Для того чтобы исключить поля, нужно перечислить исключаемые поля через запятую в настройке "restExclude":"" объекта restClientConfig при установке соединения .
Пример работы при исключении поля name - имени потока:
POST /rest/my_api/publishStream HTTP/1.1
Accept: application/json
Content-Type: application/json;charset=UTF-8
User-Agent: Java/1.8.0_111
Host: 192.168.1.101
Connection: keep-alive
Content-Length: 3602
{
"nodeId":"Hw47CFMBEchVOpBMDr29IxjudnJ1sjOY@192.168.1.101",
"appKey":"defaultApp",
"sessionId":"/192.168.1.102:9232/192.168.1.101:8443",
"mediaSessionId":"084db2f0-fdd5-11e6-9ba5-6ba06f30ad92",
"published":true,
"hasVideo":true,
"hasAudio":true,
"status":"PENDING",
"sdp":".....",
"record":false,
"width":0,
"height":0,
"bitrate":0,
"quality":0,
"mediaProvider":"WebRTC"
}
HTTP/1.1 200 OK
Date: Tue, 28 Feb 2017 16:43:26 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
Content-Length: 3649
Connection: close
Content-Type: application/json
{
"nodeId":"Hw47CFMBEchVOpBMDr29IxjudnJ1sjOY@192.168.1.101",
"appKey":"defaultApp",
"sessionId":"\/192.168.1.102:9232\/192.168.1.101:8443",
"mediaSessionId":"084db2f0-fdd5-11e6-9ba5-6ba06f30ad92",
"published":true,
"hasVideo":true,
"hasAudio":true,
"status":"PENDING",
"sdp":".....",
"record":false,
"width":0,
"height":0,
"bitrate":0,
"quality":0,
"mediaProvider":"WebRTC"
}
Обработка параметров, указанных в URL потока¶
При публикации или воспроизведении RTMP-потока на WCS, в URL потока могут быть указаны параметры RTMP-соединения и параметры потока:
rtmp://host:1935/live?connectParam1=val1&connectParam2=val2/streamName?streamParam1=val1&streamParam2=val2
Здесь
host- WCS-сервер;connectParam1,connectParam2- параметры RTMP-соединения;streamName- имя потока на сервере;streamParam1,streamParam2- параметры потока.
WCS-сервер передает указанные параметры бэкенд-серверу в поле custom, например:
-
Параметры соединения (REST hook
/connect)
POST /apps/EchoApp/connect HTTP/1.1 HOST: localhost:8081 { "nodeId" : "Qb3rAjf3lzoy6PEl1WZkUhRG1DsTykgj@192.168.1.1", "appKey" : "flashStreamingApp", "sessionId" : "/127.0.0.1:5643/192.168.1.1:1935", "useWsTunnel" : false, "useWsTunnelPacketization2" : false, "useBase64BinaryEncoding" : false, "keepAlive" : false, "custom" : { "connectParam1" : "val1", "connectParam2" : "val2" } } -
Параметры публикации (REST hook
/publishStream)
POST /apps/EchoApp/publishStream HTTP/1.1 HOST: localhost:8081 { "nodeId" : "Qb3rAjf3lzoy6PEl1WZkUhRG1DsTykgj@192.168.1.1", "appKey" : "flashStreamingApp", "sessionId" : "/127.0.0.1:5643/192.168.1.1:1935", "mediaSessionId" : "627990f9-8fe5-4e92-bb2a-863cc4eb43de", "name" : "stream1", "published" : true, "hasVideo" : false, "hasAudio" : true, "status" : "NEW", "record" : true, "width" : 0, "height" : 0, "bitrate" : 0, "minBitrate" : 0, "maxBitrate" : 0, "quality" : 0, "mediaProvider" : "Flash", "custom" : { "streamParam1" : "val1", "streamParam2" : "val2" } } -
Параметры воспроизведения (REST hook
/playStream)
POST /apps/EchoApp/playStream HTTP/1.1 HOST: localhost:8081 { "nodeId" : "Qb3rAjf3lzoy6PEl1WZkUhRG1DsTykgj@192.168.1.1", "appKey" : "flashStreamingApp", "sessionId" : "/127.0.0.1:5643/192.168.1.1:1935", "mediaSessionId" : "stream1/127.0.0.1:5643/192.168.1.1:1935", "name" : "stream1", "published" : false, "hasVideo" : true, "hasAudio" : true, "status" : "NEW", "record" : false, "width" : 0, "height" : 0, "bitrate" : 0, "minBitrate" : 0, "maxBitrate" : 0, "quality" : 0, "mediaProvider" : "Flash", "custom" : { "streamParam1" : "val1", "streamParam2" : "val2" } }
Эту возможность можно использовать, например, для авторизации клиента на бэкенд-сервере при публикации или воспроизведения RTMP-потока на WCS.
Хуки /playHLS и /playRTSP¶
Хуки playHLS и playRTSP предназначены для аутентификации воспроизведения потока по HLS и по RTSP соответственно. Эти хуки вызываются без предварительного вызова /connect, поэтому возможность изменения политики обработки ошибок при помощи restClientConfig отсутствует, всегда применяются политика: