Esquema de CameraLiveStream

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

sdm.devices.traits.CameraLiveStream

Este atributo pertenece a cualquier dispositivo que admita la transmisión en vivo.

Campos

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

VideoResolution (maxVideoResolution)

Campo Descripción Tipo de datos
width Ancho máximo de la resolución de la 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 la 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 RTSP.

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

Solicitud y respuesta de 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 de GenerateRtspStream

Campo Descripción Tipo de datos
streamUrls Mapa de URLs de transmisión en vivo de RTSP. object
streamExtensionToken Es el token que se usa para extender el streamToken para una transmisión en vivo de RTSP. string
Ejemplo: "CjY5Y3VKaTZwR3o4Y19YbTVfMF…"
streamToken Es el 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 a RTSP válido antes de que venza. 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 durante 5 minutos. Si necesitas extender la vida útil de una transmisión en vivo, usa el comando ExtendFormatStream adecuado de la función CameraLiveStream para el 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 Es el token que se usará para solicitar una extensión del token de transmisión 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 solicitar una extensión para el token de transmisión. string
Ejemplo: "dGNUlTU2CjY5Y3VKaTZwR3o4Y1…"
streamToken Es un token nuevo que se usará 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 de StopRtspStream

Solicitud

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

Respuesta

{}

Campos de la solicitud StopRtspStream

Campo Descripción Tipo de datos
streamExtensionToken Es el token que se usará para invalidar una transmisión en vivo de RTSP existente. string
Ejemplo: "CjY5Y3VKaTZwR3o4Y19YbTVfMF…"

GenerateWebRtcStream

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

Genera una transmisión en vivo de WebRTC para un dispositivo.

Solicitud y respuesta de 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" : "ytHkXZ8KQ2jxgSvoZiA6zjH0Av..."
  }
}

Campos de la solicitud de GenerateWebRtcStream

Te recomendamos que uses la muestra de la aplicación web para aprender a generar una transmisión en vivo exitosa. Este ejemplo genera un offerSdp válido que cumple con todas las restricciones de la oferta de SDP para las 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 medios (m=) deben estar presentes en la oferta y deben estar en este orden:
    1. Audio
    2. video
    3. aplicación
  • Trickle ICE es compatible, pero no es obligatorio.
  • Solo se admite el códec Opus para el audio.
  • La configuración de audio debe establecerse en a=recvonly (solo recepción).
  • La oferta debe terminar con un carácter de salto de línea \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 de GenerateWebRtcStream

Se debe usar 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, vuelve a ejecutar el comando GenerateWebRtcStream para recibir un answerSdp nuevo.

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

Campo Descripción Tipo de datos
answerSdp Es una respuesta SDP que se usará con el dispositivo local que mostrará la transmisión en vivo de WebRTC. string
Ejemplo: “answerSdp”.
expiresAt Hora en 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 Es el ID de la sesión multimedia de la transmisión en vivo de WebRTC generada. string
Ejemplo: "ytHkXZ8KQ2jxgSvoZiA6zjH0Av…"

ExtendWebRtcStream

Nest Cam (heredada) Nest Cam (para exteriores o interiores, 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 alimentación con cable. Una cámara que funciona con batería se considera que funciona con cable mientras está enchufada para cargarse. Si la cámara funciona con batería, se ignorará una solicitud para extender una transmisión activa de WebRTC.

Las sesiones de transmisión en vivo de la cámara solo son válidas durante 5 minutos. Si necesitas extender la vida útil de una transmisión en vivo, usa el comando ExtendFormatStream adecuado de la función CameraLiveStream para el 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" : "ytHkXZ8KQ2jxgSvoZiA6zjH0Av..."
  }
}

Respuesta

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

Campos de solicitud de ExtendWebRtcStream

Campo Descripción Tipo de datos
mediaSessionId Se extenderá el ID de sesión multimedia de la transmisión en vivo de WebRTC. string
Ejemplo: "ytHkXZ8KQ2jxgSvoZiA6zjH0Av…"

Campos de respuesta de ExtendWebRtcStream

Campo Descripción Tipo de datos
expiresAt La nueva hora en 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 Es el ID de sesión multimedia de la transmisión en vivo de WebRTC que se extendió. string
Ejemplo: "ytHkXZ8KQ2jxgSvoZiA6zjH0Av…"

StopWebRtcStream

Nest Cam (heredada) Nest Cam (para exteriores o interiores, 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" : "ytHkXZ8KQ2jxgSvoZiA6zjH0Av..."
  }
}

Respuesta

{}

Campos de la solicitud StopWebRtcStream

Campo Descripción Tipo de datos
mediaSessionId Es el ID de sesión multimedia de la transmisión en vivo de WebRTC que se detendrá. string
Ejemplo: "ytHkXZ8KQ2jxgSvoZiA6zjH0Av…"

Errores

En relación con este atributo, se pueden mostrar los siguientes códigos de error:

Mensaje de error RPC Solución de problemas
La cámara no está disponible para transmitir. FAILED_PRECONDITION La cámara se encuentra sin conexión o no está disponible para transmitir debido a un problema técnico.
El comando no es compatible con el timbre. FAILED_PRECONDITION No se puede extender una transmisión de WebRTC en timbres que funcionan con batería. Si se necesita ver 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 El user no le otorgó a developerlos permisos adecuados a nivel del dispositivo 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 indicar que la configuración de audio en offerSdp es incorrecta.

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