2

我正在尝试在仅支持 WebRTC 流而不支持 RTSP 的 Nest Battery Cam 上执行sdm.devices.commands.CameraLiveStream.GenerateWebRtcStream命令:

curl -X POST \
  'https://smartdevicemanagement.googleapis.com/v1/enterprises/FOO/devices/BAR:executeCommand' \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $AT" \
  --data-raw '{
    "command" : "sdm.devices.commands.CameraLiveStream.GenerateWebRtcStream",
    "params" : {
    "offerSdp" : "v=0\r\no=- 3846095231 3846095231 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0\r\na=msid-semantic:WMS *\r\nm=video 52697 UDP/TLS/RTP/SAVPF 97 98 99 100 101 102\r\nc=IN IP4 192.168.178.30\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=mid:0\r\na=msid:da672441-0269-4c8d-a30f-690e81947987 d7634d8f-f452-455c-bd6e-c5aa890b3433\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=rtcp-mux\r\na=ssrc-group:FID 3144836330 4019375712\r\na=ssrc:3144836330 cname:a5ec0936-9faa-48c5-9d06-e61020812f0b\r\na=ssrc:4019375712 cname:a5ec0936-9faa-48c5-9d06-e61020812f0b\r\na=rtpmap:97 VP8/90000\r\na=rtcp-fb:97 nack\r\na=rtcp-fb:97 nack pli\r\na=rtcp-fb:97 goog-remb\r\na=rtpmap:98 rtx/90000\r\na=fmtp:98 apt=97\r\na=rtpmap:99 H264/90000\r\na=rtcp-fb:99 nack\r\na=rtcp-fb:99 nack pli\r\na=rtcp-fb:99 goog-remb\r\na=fmtp:99 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42001f\r\na=rtpmap:100 rtx/90000\r\na=fmtp:100 apt=99\r\na=rtpmap:101 H264/90000\r\na=rtcp-fb:101 nack\r\na=rtcp-fb:101 nack pli\r\na=rtcp-fb:101 goog-remb\r\na=fmtp:101 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42e01f\r\na=rtpmap:102 rtx/90000\r\na=fmtp:102 apt=101\r\na=candidate:b5a862d0ae1ed7334dea68b94dfa8e6f 1 udp 2130706431 192.168.178.30 52697 typ host\r\na=candidate:7f6336d9b24b4d36e0c8e622fd79e141 1 udp 1694498815 79.20.79.217 52697 typ srflx raddr 192.168.178.30 rport 52697\r\na=end-of-candidates\r\na=ice-ufrag:6Uh1\r\na=ice-pwd:cLKAgmaZAA5i1Tw7BHJkLD\r\na=fingerprint:sha-256 18:34:6E:4B:DC:6E:3D:00:49:28:24:AB:F5:CB:7F:FC:3E:4A:AD:A7:DE:D9:29:6D:5A:7C:A3:0F:76:C8:BD:E4\r\na=setup:actpass\r\n"
    }
  }'

而且我总是收到一个通用错误:

{
  "error": {
    "code": 400,
    "message": "Request contains an invalid argument.",
    "status": "INVALID_ARGUMENT"
  }
}

有谁知道我做错了什么?

4

1 回答 1

2

解决方案

事实是我缺少数据通道 ( myPeerConnection.createDataChannel("dataSendChannel");) 和正确的 createOffer 参数 ( {offerToReceiveAudio:!0,offerToReceiveVideo:!0})。

以下代码生成正确的 SDP 报价,Google 接受该报价。

    const myPeerConnection = new RTCPeerConnection

    myPeerConnection.createDataChannel("dataSendChannel");

    myPeerConnection.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0}).then(function(offer) {
        return myPeerConnection.setLocalDescription(offer);
      })
      .then(function() {
        console.log(myPeerConnection.localDescription.sdp + "\n");
      })
      .catch(function(reason) {
        console.log("An error occurred, so handle the failure to connect");
      });

还要注意:如果你没有在offer字符串的末尾发送换行符,你会得到如下错误:

{
  "error": {
    "code": 500,
    "message": "Internal error encountered.",
    "status": "INTERNAL"
  }
}
于 2021-11-18T22:56:36.277 回答