הסכימה של CameraLiveStream

Nest Cam (דור קודם) Nest Cam (לשימוש פנימי וחיצוני, עם סוללה) Nest Cam with floodlight Nest Cam (בתוך הבית, עם כבל) Nest Hub Max Nest Doorbell (דור קודם) Nest Doorbell (סוללה) Nest Doorbell (עם כבל) 

sdm.devices.traits.CameraLiveStream

המאפיין הזה שייך לכל מכשיר שתומך בסטרימינג בשידור חי.

שדות

שדה תיאור סוג הנתונים
maxVideoResolution הרזולוציה המקסימלית של השידור החי של הסרטון. VideoResolution
videoCodecs רכיבי הקודק של הווידאו שנתמכים בשידור החי. array(string)
ערך: ["H264"]
audioCodecs קודיקי האודיו הנתמכים בשידור החי. array(string)
ערך: ["AAC"]
supportedProtocols פרוטוקולי הסטרימינג שנתמכים במכשיר. הערך בשדה הזה מציין אילו פקודות נתמכות במכשיר. לדוגמה, אם השדה הזה מכיל את הערך WEB_RTC, תהיה תמיכה רק בפקודות WEB_RTC. array(string)
ערך: ["RTSP", "WEB_RTC"]

VideoResolution‏ (maxVideoResolution)

שדה תיאור סוג הנתונים
width רוחב הרזולוציה המקסימלית של התמונה. אפשר להשתמש בו גם כפרמטר של שאילתה בכתובת ה-URL של ההורדה. int32
דוגמה: 640
height הגובה המקסימלי של רזולוציית התמונה. אפשר להשתמש בו גם כפרמטר של שאילתה בכתובת ה-URL של ההורדה. int32
דוגמה: 480

דוגמה לבקשת GET ולתגובה

בקשה

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

תשובה

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

פקודות

GenerateRtspStream

Nest Cam (דור קודם) Nest Hub Max Nest Doorbell (דור קודם) 

שליחת בקשה לאסימון כדי לגשת לכתובת URL של שידור חי ב-RTSP.

אי אפשר לשתף כתובות URL של שידורים חיים ב-RTSP בין לקוחות. לקוח אחד בלבד יכול להשתמש בכתובת URL של שידור בכל פעם. אם כמה לקוחות רוצים להפעיל סטרימינג מאותה מצלמה בו-זמנית, צריך לשלוח פקודות RTSP לכל לקוח בנפרד, וכל לקוח צריך להשתמש בכתובת URL משלו לסטרימינג.

בקשה ותגובה של GenerateRtspStream

בקשה

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

תשובה

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

שדות התגובה של GenerateRtspStream

שדה תיאור סוג הנתונים
streamUrls מפה של כתובות URL של שידורים חיים ב-RTSP. object
streamExtensionToken אסימון לשימוש להארכת streamToken בשידור חי ב-RTSP. string
דוגמה: 'CjY5Y3VKaTZwR3o4Y19YbTVfMF…'
streamToken אסימון לשימוש כדי לגשת לשידור חי ב-RTSP. string
דוגמה: 'g.0.streamingToken'
expiresAt הזמן שבו יפוג התוקף של streamExtensionToken וגם של streamToken, בפורמט RFC 3339. string
דוגמה: ‎2018-01-04T18:30:00.000Z‎

ExtendRtspStream

Nest Cam (דור קודם) Nest Hub Max Nest Doorbell (דור קודם) 

מבקשים אסימון גישה חדש לכתובת ה-URL של שידור חי ב-RTSP כדי להחליף אסימון גישה תקף ל-RTSP לפני שתוקפו יפוג. הוא משמש גם להחלפת אסימון RTSP תקין מבקשת קוד קודמת של ExtendRtspStream.

סשנים של שידורים חיים ממצלמה תקפים למשך 5 דקות בלבד. אם אתם צריכים להאריך את משך החיים של שידור חי, השתמשו בפקודה המתאימה של ExtendFormatStream של המאפיין CameraLiveStream עבור פורמט הסטרימינג שיצרתם.

בקשה ותגובה של ExtendRtspStream

בקשה

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

תשובה

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

שדות הבקשה של ExtendRtspStream

שדה תיאור סוג הנתונים
streamExtensionToken טוקן שמשמש לבקשת הארכה לטוקן הסטרימינג של RTSP. string
דוגמה: 'CjY5Y3VKaTZwR3o4Y19YbTVfMF…'

שדות התגובה של ExtendRtspStream

שדה תיאור סוג הנתונים
streamExtensionToken אסימון שמשמש לצפייה בשידור חי קיים ב-RTSP ולבקשת הארכה של אסימון הסטרימינג. string
דוגמה: "dGNUlTU2CjY5Y3VKaTZwR3o4Y1…"
streamToken אסימון חדש לשימוש כדי לגשת לשידור חי קיים ב-RTSP. string
דוגמה: 'g.0.newStreamingToken'
expiresAt הזמן שבו יפוג התוקף של streamExtensionToken וגם של streamToken, בפורמט RFC 3339. string
דוגמה: ‎2018-01-04T18:30:00.000Z‎

StopRtspStream

Nest Cam (דור קודם) Nest Hub Max Nest Doorbell (דור קודם) 

מבטלת את התוקף של טוקן גישה תקף ל-RTSP ומפסיקה את שידור ה-RTSP החי שמקושר לטוקן הגישה הזה.

בקשה ותגובה של StopRtspStream

בקשה

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

תשובה

{}

שדות הבקשה של StopRtspStream

שדה תיאור סוג הנתונים
streamExtensionToken אסימון לשימוש כדי לבטל את התוקף של שידור חי קיים ב-RTSP. string
דוגמה: 'CjY5Y3VKaTZwR3o4Y19YbTVfMF…'

GenerateWebRtcStream

Nest Cam (דור קודם) Nest Cam (לשימוש פנימי וחיצוני, עם סוללה) Nest Cam with floodlight Nest Cam (בתוך הבית, עם כבל) Nest Doorbell (סוללה) Nest Doorbell (עם כבל) 

יצירת שידור חי ב-WebRTC למכשיר.

בקשה ותגובה של GenerateWebRtcStream

בקשה

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

תשובה

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

שדות הבקשה של GenerateWebRtcStream

מומלץ להיעזר בדוגמה לאפליקציית אינטרנט כדי ללמוד איך ליצור שידור חי מוצלח. הדוגמה הזו יוצרת קובץ offerSdp תקין שעומד בכל ההגבלות על מבצעי SDP למצלמות Nest.

הצעה ל-SDP למצלמות Nest חייבת לעמוד בהגבלות הבאות:

  • יש תמיכה רק בפורמט המאוחד. אין תמיכה בתוכנית B.
  • כל שורות המדיה (m=) חייבות להופיע במבצע, והן חייבות להיות בסדר הזה:
    1. אודיו
    2. סרטון
    3. יישום
  • הפרוטוקול Trickle ICE נתמך, אבל לא נדרש.
  • יש תמיכה רק בקודק Opus לאודיו.
  • הגדרת האודיו צריכה להיות a=recvonly (קבלה בלבד).
  • המבצע חייב להסתיים בתווית שורה חדשה (newline) מסוג \r\n או \n.

דוגמה למבצע תקין

ללא פורמט:

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

בפורמט:

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
שדה תיאור סוג הנתונים
offerSdp הצעה של SDP, ספציפית למכשיר המקומי שבו יוצג השידור החי של WebRTC. string
דוגמה: 'offerSdp'

שדות התגובה של GenerateWebRtcStream

צריך להשתמש ב-answerSdp כדי ליצור את השידור החי תוך 30 שניות ממועד קבלת התגובה, אחרת התוקף שלו יפוג. אם התוקף יפוג, מריצים שוב את הפקודה GenerateWebRtcStream כדי לקבל answerSdp חדש.

כשפותחים ערוצי WebRTC לשידור החי, חשוב ליצור ערוץ נתונים וגם ערוץ וידאו.

שדה תיאור סוג הנתונים
answerSdp תשובה של SDP לשימוש במכשיר המקומי שיציג את השידור החי של WebRTC. string
דוגמה: 'answerSdp'
expiresAt מועד התפוגה של הגישה לשידור החי ב-WebRTC, בפורמט RFC 3339. string
דוגמה: ‎2020-01-04T18:30:00.000Z‎
mediaSessionId מזהה הסשן של המדיה של שידור ה-WebRTC בשידור חי שנוצר. string
דוגמה: "KIx9GBoVn-Ci90qlAVk4MCD9P7…"

ExtendWebRtcStream

Nest Cam (דור קודם) Nest Cam (לשימוש פנימי וחיצוני, עם סוללה) Nest Cam with floodlight (עם זרקור) Nest Cam (בתוך הבית, עם כבל) Nest Doorbell (עם כבל)   חיבור קווי   

שליחת בקשה להארכת הגישה לשידור חי קיים ב-WebRTC לפני שתוקף הרשאת הגישה יפוג.

אפשר להרחיב את הסטרימינג של WebRTC רק במצלמות שמחוברות לחשמל באמצעות כבל. מצלמה שפועלת על סוללה נחשבת למכשיר שמופעל באמצעות כבל כשהיא מחוברת לטעינה. אם המצלמה פועלת על סוללה, המערכת תתעלם מבקשות להאריך סטרימינג פעיל של WebRTC.

סשנים של שידורים חיים ממצלמה תקפים למשך 5 דקות בלבד. אם אתם צריכים להאריך את משך החיים של שידור חי, השתמשו בפקודה המתאימה של ExtendFormatStream של המאפיין CameraLiveStream עבור פורמט הסטרימינג שיצרתם.

הבקשה והתגובה של ExtendWebRtcStream

בקשה

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

תשובה

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

הרחבת שדות הבקשה של ExtendWebRtcStream

שדה תיאור סוג הנתונים
mediaSessionId מזהה הסשן של המדיה של שידור ה-WebRTC החי שרוצים להאריך. string
דוגמה: "KIx9GBoVn-Ci90qlAVk4MCD9P7…"

הרחבת שדות התגובה של ExtendWebRtcStream

שדה תיאור סוג הנתונים
expiresAt המועד החדש שבו יפוג התוקף של הגישה לשידור החי ב-WebRTC, בפורמט RFC 3339. string
דוגמה: ‎2018-01-04T18:30:00.000Z‎
mediaSessionId מזהה הסשן של המדיה של שידור ה-WebRTC החי שהאריך. string
דוגמה: "KIx9GBoVn-Ci90qlAVk4MCD9P7…"

StopWebRtcStream

Nest Cam (דור קודם) Nest Cam (לשימוש פנימי וחיצוני, עם סוללה) Nest Cam with floodlight Nest Cam (בתוך הבית, עם כבל) Nest Doorbell (סוללה) Nest Doorbell (עם כבל) 

הפונקציה מבטלת את התוקף של סשן מדיה תקין ב-WebRTC ומפסיקה את השידור החי ב-WebRTC שמקושר לסשן הזה.

בקשה ותגובה של StopWebRtcStream

בקשה

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

תשובה

{}

שדות הבקשה של StopWebRtcStream

שדה תיאור סוג הנתונים
mediaSessionId מזהה הסשן של המדיה של שידור הווידאו החי ב-WebRTC שרוצים להפסיק. string
דוגמה: "KIx9GBoVn-Ci90qlAVk4MCD9P7…"

שגיאות

ייתכן שתקבלו את קודי השגיאה הבאים בנוגע למאפיין הזה:

הודעת השגיאה הכנסה לקליק פתרון בעיות
המצלמה לא זמינה לסטרימינג. FAILED_PRECONDITION המצלמה במצב אופליין או לא זמינה לשידור בשידור חי בגלל בעיה טכנית.
הפקודה לא נתמכת ב-doorbell. FAILED_PRECONDITION אי אפשר להאריך את הסטרימינג של WebRTC ב-doorbell‏ (פעמון דלת) שמופעל על ידי סוללה. אם רוצים לצפות בשידור של פעמון דלת מעבר למשך הסשן הראשוני, צריך לעצור את השידור הקיים וליצור שידור חדש.
ההרשאה נדחתה. PERMISSION_DENIED ב- user לא הוקצו ל- developerההרשאות המתאימות ברמת המכשיר ב-Partner Connections Manager‏ (PCM) שנדרשות לביצוע פקודה.

כשיוצרים שידור חי ב-WebRTC, השגיאה הזו יכולה גם להעיד שההגדרה של האודיו ב-offerSdp שגויה.

בחומר העזר בנושא קודי שגיאה ב-API מופיעה רשימה מלאה של קודי השגיאה ב-API.