Esquema de CameraLiveStream

Nest Cam (heredada) Nest Cam (para interiores o exteriores, con batería) Nest Cam con reflector Nest Cam (para interiores, con cable)

sdm.devices.traits.CameraLiveStream

Esta característica pertenece a cualquier dispositivo que admita la transmisión en vivo.

Campos

Campo Descripción Tipo de datos
maxVideoResolution Resolución máxima de la transmisión de video en vivo. VideoResolution
videoCodecs Códecs de video compatibles con la transmisión en vivo. array(string)
Valor: ["H264"]
audioCodecs Códecs de audio compatibles con la transmisión en vivo array(string)
Valor: ["AAC"]
supportedProtocols Protocolos de transmisión que admite el dispositivo. El valor de este campo indica qué comandos admite el dispositivo. Por ejemplo, si este campo contiene WEB_RTC, solo se admiten comandos WEB_RTC. array(string)
Valor: ["RTSP", "WEB_RTC"]

Resolución de video (maxVideoResolution)

Campo Descripción Tipo de datos
width Ancho máximo de la resolución de imagen. También se puede usar como parámetro de consulta en la URL de descarga. int32
Ejemplo: 640
height Es la altura máxima de la resolución de imagen. También se puede usar como parámetro de consulta en la URL de descarga. int32
Ejemplo: 480

Ejemplo de solicitud y respuesta GET

Solicitud

GET /enterprises/project-id/devices/device-id

Respuesta

{
  "name" : "enterprises/project-id/devices/device-id",
  "traits" : {
    "sdm.devices.traits.CameraLiveStream" : {
      "maxVideoResolution" : {
        "width" : 640,
        "height" : 480
      },
      "videoCodecs" : ["H264"],
      "audioCodecs" : ["AAC"],
      "supportedProtocols" : ["WEB_RTC"]
    }
  }
}

Comandos

GenerateRtspStream

Nest Cam (heredada) Nest Hub Max Nest Doorbell (heredado) 

Solicita un token para acceder a una URL de transmisión en vivo de RTSP.

Las URLs de transmisión en vivo de RTSP no se pueden compartir entre clientes. Solo un cliente a la vez puede usar una URL de transmisión. Si varios clientes desean transmitir desde la misma cámara al mismo tiempo, se deben enviar los comandos RTSP para cada cliente individual, y cada cliente individual debe usar su propia URL de transmisión.

Solicitud y respuesta GenerateRtspStream

Solicitud

POST /enterprises/project-id/devices/device-id:executeCommand
{
  "command" : "sdm.devices.commands.CameraLiveStream.GenerateRtspStream",
  "params" : {}
}

Respuesta

{
  "results" : {
    "streamUrls" : {
      "rtspUrl" : "rtsps://someurl.com/CjY5Y3VKaTZwR3o4Y19YbTVfMF...?auth=g.0.streamingToken"
    },
    "streamExtensionToken" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...",
    "streamToken" : "g.0.streamingToken",
    "expiresAt" : "2018-01-04T18:30:00.000Z"
  }
}

Campos de respuesta GenerateRtspStream

Campo Descripción Tipo de datos
streamUrls Mapa de las URLs de transmisión en vivo de RTSP. object
streamExtensionToken Token que se usa para extender el streamToken de una transmisión en vivo de RTSP. string
Ejemplo: “CjY5Y3VKaTZwR3o4Y19YbTVfMF...”
streamToken Token que se usa para acceder a una transmisión en vivo de RTSP. string
Ejemplo: “g.0.streamingToken”
expiresAt Hora en la que vencen streamExtensionToken y streamToken, en formato RFC 3339. string
Ejemplo: “2018-01-04T18:30:00.000Z”

ExtendRtspStream

Nest Cam (heredada) Nest Hub Max Nest Doorbell (heredado) 

Solicita un nuevo token de acceso a la URL de transmisión en vivo de RTSP para reemplazar un token de acceso RTSP válido antes de que venza. Esto también se usa para reemplazar un token RTSP válido de una solicitud de comando ExtendRtspStream anterior.

Las sesiones de transmisión en vivo de la cámara solo son válidas por 5 minutos. Si necesitas extender la vida útil de una transmisión en vivo, usa el comando ExtendFormatStream correspondiente de la característica CameraLiveStream del formato de transmisión que generaste.

Solicitud y respuesta de ExtendRtspStream

Solicitud

POST /enterprises/project-id/devices/device-id:executeCommand
{
  "command" : "sdm.devices.commands.CameraLiveStream.ExtendRtspStream",
  "params" : {
    "streamExtensionToken" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF..."
  }
}

Respuesta

{
  "results" : {
    "streamExtensionToken" : "dGNUlTU2CjY5Y3VKaTZwR3o4Y1...",
    "streamToken" : "g.0.newStreamingToken",
    "expiresAt" : "2018-01-04T18:30:00.000Z"
  }
}

Campos de solicitud de ExtendRtspStream

Campo Descripción Tipo de datos
streamExtensionToken Token que se usará para solicitar una extensión del token de transmisión de RTSP. string
Ejemplo: “CjY5Y3VKaTZwR3o4Y19YbTVfMF...”

Campos de respuesta de ExtendRtspStream

Campo Descripción Tipo de datos
streamExtensionToken Es el token que se usa para ver una transmisión en vivo de RTSP existente y para solicitar una extensión del token de transmisión. string
Ejemplo: "dGNUlTU2CjY5Y3VKaTZwR3o4Y1..."
streamToken Es un token nuevo que se usa para acceder a una transmisión en vivo de RTSP existente. string
Ejemplo: “g.0.newStreamingToken”
expiresAt Hora en la que vencen streamExtensionToken y streamToken, en formato RFC 3339. string
Ejemplo: “2018-01-04T18:30:00.000Z”

StopRtspStream

Nest Cam (heredada) Nest Hub Max Nest Doorbell (heredado) 

Invalida un token de acceso RTSP válido y detiene la transmisión en vivo de RTSP vinculada a ese token de acceso.

Solicitud y respuesta StopRtspStream

Solicitud

POST /enterprises/project-id/devices/device-id:executeCommand
{
  "command" : "sdm.devices.commands.CameraLiveStream.StopRtspStream",
  "params" : {
    "streamExtensionToken" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF..."
  }
}

Respuesta

{}

Campos de solicitud StopRtspStream

Campo Descripción Tipo de datos
streamExtensionToken Token que se usa para invalidar una transmisión en vivo RTSP existente. string
Ejemplo: “CjY5Y3VKaTZwR3o4Y19YbTVfMF...”

GenerateWebRtcStream

Nest Cam (para interiores, con cable) Nest Cam (para interiores o exteriores, con batería) Nest Cam con reflector Nest Cam (para interiores, con cable) Nest Doorbell (con batería) Nest Doorbell (con cable) 

Generar una transmisión en vivo de WebRTC para un dispositivo

Solicitud y respuesta GenerateWebRtcStream

Solicitud

POST /enterprises/project-id/devices/device-id:executeCommand
{
  "command" : "sdm.devices.commands.CameraLiveStream.GenerateWebRtcStream",
  "params" : {
    "offerSdp" : "offerSdp"
  }
}

Respuesta

{
  "results" : {
    "answerSdp" : "answerSdp",
    "expiresAt" : "2020-01-04T18:30:00.000Z",
    "mediaSessionId" : "QW_yv1uYh-WRDT6K8ZFuVywm5v..."
  }
}

Campos de solicitud GenerateWebRtcStream

Te recomendamos usar el ejemplo de aplicación web para aprender a generar una transmisión en vivo exitosa. En este ejemplo, se genera un offerSdp válido que cumple con todas las restricciones de oferta del SDP para cámaras Nest.

Una oferta de SDP para cámaras Nest debe cumplir con las siguientes restricciones:

  • Solo se admite el formato unificado. No se admite el plan B.
  • Todas las líneas de contenido multimedia (m=) deben estar presentes en la oferta y deben estar en este orden:
    1. en varios idiomas
    2. video
    3. aplicación
  • Goteo ICE es compatible, pero no es obligatorio.
  • Solo el códec Opus es compatible con el audio.
  • La configuración de audio se debe establecer en a=recvonly (solo recepción).
  • La oferta debe terminar con un carácter de línea nueva \r\n o \n.

Consulta un ejemplo de una oferta válida

Sin formato:

v=0\r\no=- 2214114893783582286 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1 2\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 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:6ReD\r\na=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4\r\na=ice-options:trickle\r\na=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\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:63 red/48000/2\r\na=fmtp:63 111/111\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 122 102 121 127 120 125 107 108 109 35 36 124 119 123 118 114 115 116 37\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:6ReD\r\na=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4\r\na=ice-options:trickle\r\na=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:13 urn:3gpp:video-orientation\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\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 VP9/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 profile-id=2\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:122 VP9/90000\r\na=rtcp-fb:122 goog-remb\r\na=rtcp-fb:122 transport-cc\r\na=rtcp-fb:122 ccm fir\r\na=rtcp-fb:122 nack\r\na=rtcp-fb:122 nack pli\r\na=fmtp:122 profile-id=1\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=1;profile-level-id=42001f\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 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=0;profile-level-id=42001f\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 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=1;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 H264/90000\r\na=rtcp-fb:108 goog-remb\r\na=rtcp-fb:108 transport-cc\r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack\r\na=rtcp-fb:108 nack pli\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:124 H264/90000\r\na=rtcp-fb:124 goog-remb\r\na=rtcp-fb:124 transport-cc\r\na=rtcp-fb:124 ccm fir\r\na=rtcp-fb:124 nack\r\na=rtcp-fb:124 nack pli\r\na=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032\r\na=rtpmap:119 rtx/90000\r\na=fmtp:119 apt=124\r\na=rtpmap:123 H264/90000\r\na=rtcp-fb:123 goog-remb\r\na=rtcp-fb:123 transport-cc\r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack\r\na=rtcp-fb:123 nack pli\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\na=rtpmap:118 rtx/90000\r\na=fmtp:118 apt=123\r\na=rtpmap:114 red/90000\r\na=rtpmap:115 rtx/90000\r\na=fmtp:115 apt=114\r\na=rtpmap:116 ulpfec/90000\r\na=rtpmap:37 flexfec-03/90000\r\na=rtcp-fb:37 goog-remb\r\na=rtcp-fb:37 transport-cc\r\na=fmtp:37 repair-window=10000000\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:6ReD\r\na=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4\r\na=ice-options:trickle\r\na=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C\r\na=setup:actpass\r\na=mid:2\r\na=sctp-port:5000\r\na=max-message-size:262144\r\n

Con formato:

v=0
o=- 2214114893783582286 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1 2
a=extmap-allow-mixed
a=msid-semantic: WMS
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:6ReD
a=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4
a=ice-options:trickle
a=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=recvonly
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 122 102 121 127 120 125 107 108 109 35 36 124 119 123 118 114 115 116 37
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:6ReD
a=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4
a=ice-options:trickle
a=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:122 VP9/90000
a=rtcp-fb:122 goog-remb
a=rtcp-fb:122 transport-cc
a=rtcp-fb:122 ccm fir
a=rtcp-fb:122 nack
a=rtcp-fb:122 nack pli
a=fmtp:122 profile-id=1
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:35 AV1/90000
a=rtcp-fb:35 goog-remb
a=rtcp-fb:35 transport-cc
a=rtcp-fb:35 ccm fir
a=rtcp-fb:35 nack
a=rtcp-fb:35 nack pli
a=rtpmap:36 rtx/90000
a=fmtp:36 apt=35
a=rtpmap:124 H264/90000
a=rtcp-fb:124 goog-remb
a=rtcp-fb:124 transport-cc
a=rtcp-fb:124 ccm fir
a=rtcp-fb:124 nack
a=rtcp-fb:124 nack pli
a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 H264/90000
a=rtcp-fb:123 goog-remb
a=rtcp-fb:123 transport-cc
a=rtcp-fb:123 ccm fir
a=rtcp-fb:123 nack
a=rtcp-fb:123 nack pli
a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032
a=rtpmap:118 rtx/90000
a=fmtp:118 apt=123
a=rtpmap:114 red/90000
a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114
a=rtpmap:116 ulpfec/90000
a=rtpmap:37 flexfec-03/90000
a=rtcp-fb:37 goog-remb
a=rtcp-fb:37 transport-cc
a=fmtp:37 repair-window=10000000
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 0.0.0.0
a=ice-ufrag:6ReD
a=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4
a=ice-options:trickle
a=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C
a=setup:actpass
a=mid:2
a=sctp-port:5000
a=max-message-size:262144
Campo Descripción Tipo de datos
offerSdp Una oferta de SDP específica para el dispositivo local que mostrará la transmisión en vivo de WebRTC string
Ejemplo: "offerSdp"

Campos de respuesta GenerateWebRtcStream

Se debe usar el answerSdp para generar la transmisión en vivo en un plazo de 30 segundos después de recibir la respuesta; de lo contrario, vencerá. Si vence, ejecuta nuevamente el comando GenerateWebRtcStream para recibir un answerSdp nuevo.

Cuando abras canales de WebRTC para la transmisión en vivo, asegúrate de crear un canal de datos y uno de video.

Campo Descripción Tipo de datos
answerSdp Una respuesta de SDP que se usará con el dispositivo local que mostrará la transmisión en vivo de WebRTC. string
Ejemplo: "answerSdp"
expiresAt Hora a la que vence el acceso a la transmisión en vivo de WebRTC, en formato RFC 3339. string
Ejemplo: “2020-01-04T18:30:00.000Z”
mediaSessionId ID de sesión multimedia de la transmisión en vivo de WebRTC generada. string
Ejemplo: "QW_yv1uYh-WRDT6K8ZFuVywm5v..."

ExtendWebRtcStream

Nest Cam (para interiores, con cable) Nest Cam (para interiores o exteriores, con batería) Nest Cam con reflector Nest Cam (para interiores, con cable) Nest Doorbell (con cable)   con cable   

Solicita que se extienda el acceso a una transmisión en vivo de WebRTC existente antes de que venza.

Una transmisión de WebRTC solo se puede extender en cámaras con cable. Las cámaras que funcionan con batería se consideran con cable mientras están enchufadas para cargarse. Si la cámara funciona con batería, se ignorará la solicitud para extender una transmisión activa de WebRTC.

Las sesiones de transmisión en vivo de la cámara solo son válidas por 5 minutos. Si necesitas extender la vida útil de una transmisión en vivo, usa el comando ExtendFormatStream correspondiente de la característica CameraLiveStream del formato de transmisión que generaste.

Solicitud y respuesta de ExtendWebRtcStream

Solicitud

POST /enterprises/project-id/devices/device-id:executeCommand
{
  "command" : "sdm.devices.commands.CameraLiveStream.ExtendWebRtcStream",
  "params" : {
    "mediaSessionId" : "QW_yv1uYh-WRDT6K8ZFuVywm5v..."
  }
}

Respuesta

{
  "results" : {
    "expiresAt" : "2018-01-04T18:30:00.000Z",
    "mediaSessionId" : "QW_yv1uYh-WRDT6K8ZFuVywm5v..."
  }
}

Campos de solicitud de ExtendWebRtcStream

Campo Descripción Tipo de datos
mediaSessionId ID de sesión multimedia de la transmisión en vivo de WebRTC que se extenderá. string
Ejemplo: "QW_yv1uYh-WRDT6K8ZFuVywm5v..."

Campos de respuesta de ExtendWebRtcStream

Campo Descripción Tipo de datos
expiresAt La nueva hora a la que vence el acceso a la transmisión en vivo de WebRTC, en formato RFC 3339. string
Ejemplo: “2018-01-04T18:30:00.000Z”
mediaSessionId ID de sesión multimedia de la transmisión en vivo de WebRTC que se extendió. string
Ejemplo: "QW_yv1uYh-WRDT6K8ZFuVywm5v..."

StopWebRtcStream

Nest Cam (para interiores, con cable) Nest Cam (para interiores o exteriores, con batería) Nest Cam con reflector Nest Cam (para interiores, con cable) Nest Doorbell (con batería) Nest Doorbell (con cable) 

Invalida una sesión multimedia de WebRTC válida y detiene la transmisión en vivo de WebRTC vinculada a esa sesión.

Solicitud y respuesta de StopWebRtcStream

Solicitud

POST /enterprises/project-id/devices/device-id:executeCommand
{
  "command" : "sdm.devices.commands.CameraLiveStream.StopWebRtcStream",
  "params" : {
    "mediaSessionId" : "QW_yv1uYh-WRDT6K8ZFuVywm5v..."
  }
}

Respuesta

{}

Campos de solicitud StopWebRtcStream

Campo Descripción Tipo de datos
mediaSessionId Es el ID de sesión multimedia de la transmisión en vivo de WebRTC para detener. string
Ejemplo: "QW_yv1uYh-WRDT6K8ZFuVywm5v..."

Errores

Es posible que se muestren los siguientes códigos de error en relación con esta característica:

Mensaje de error RPC Solución de problemas
El comando no es compatible con el timbre. FAILED_PRECONDITION No se puede extender una transmisión de WebRTC en timbres que funcionen con batería. Si se debe visualizar una transmisión en un timbre más allá de la duración de la sesión inicial, detén la transmisión existente y genera una nueva.
Permiso denegado. PERMISSION_DENIED user no otorgó a developerlos permisos a nivel del dispositivo adecuados en el Administrador de conexiones de socios (PCM) necesarios para ejecutar un comando.

Cuando se genera una transmisión en vivo de WebRTC, este error también puede significar que la configuración de audio de offerSdp es incorrecta.

Consulta la referencia de códigos de error de la API para ver la lista completa.