Wszystkie starsze kamery Nest Cam są obsługiwane przez interfejs Smart Device Management (SDM) API:
- Google Nest Cam Indoor
- Google Nest Cam Outdoor
- Google Nest Cam IQ Indoor
- Google Nest Cam IQ Outdoor
Te urządzenia zwracają typ APARATU:
sdm.devices.types.CAMERA
Google Nest Doorbell (starsza wersja) i Google Nest Hub Max również działają jako kamery i mają podobne cechy, ale zwracają odpowiednio typy urządzeń DOORBELL i DISPLAY.
Z kamer wewnętrzna i Google Nest Cam Outdoor można używać zarówno w aplikacji Nest, jak i Google Home, ale nie w obu tych aplikacjach jednocześnie. Gdy kamera jest w aplikacji Nest, obsługuje RTSP. A gdy kamera jest w aplikacji Google Home,
obsługuje WebRTC. Pole supportedProtocols
cechyCameraLiveStream pokazuje, który format jest obsługiwany. Dokładniejsze wyjaśnienia znajdziesz w artykule pomocy Migracja urządzeń do aplikacji Google Home.
Więcej informacji o funkcjach charakterystycznych dla tych typów urządzeń znajdziesz w przewodnikach dotyczących dzwonka i wyświetlacza.
Cechy
Dokumentacja
Te cechy, polecenia lub zdarzenia są powiązane z tym urządzeniem:
Cecha | Opis | Polecenia | Wydarzenia |
---|---|---|---|
CameraEventImage | Ta cecha należy do każdego urządzenia, które obsługuje generowanie obrazów na podstawie zdarzeń. | GenerateImage | |
CameraImage | Ta cecha należy do każdego urządzenia, które obsługuje robienie zdjęć. | ||
CameraLiveStream | Ta cecha należy do każdego urządzenia, które obsługuje transmisje na żywo. | GenerateRtspStream ExtendRtspStream StopRtspStream GenerateWebRtcStream ExtendWebRtcStream StopWebRtcStream | |
CameraMotion | Ta cecha należy do każdego urządzenia, które obsługuje zdarzenia wykrywania ruchu. | Ruch | |
CameraPerson | Ta cecha należy do każdego urządzenia, które obsługuje zdarzenia wykrywania osób. | Osoba | |
CameraSound | Ta cecha należy do każdego urządzenia, które obsługuje zdarzenia wykrywania dźwięku. | Dźwięk | |
Informacje | Ta cecha należy do każdego urządzenia w przypadku informacji związanych z urządzeniem. |
JSON
Brak cechy w odpowiedzi GET oznacza, że dana cecha lub funkcja nie są obecnie dostępne dla urządzenia. Więcej informacji znajdziesz w sekcji Typy urządzeń.
{ "type" : "sdm.devices.types.CAMERA", "traits" : { "sdm.devices.traits.CameraEventImage" : {}, "sdm.devices.traits.CameraImage" : { "maxImageResolution" : { "width" : 1280, "height" : 960 } }, "sdm.devices.traits.CameraLiveStream" : { "maxVideoResolution" : { "width" : 640, "height" : 480 }, "videoCodecs" : ["H264"], "audioCodecs" : ["AAC"], "supportedProtocols" : ["WEB_RTC"] }, "sdm.devices.traits.CameraMotion" : {}, "sdm.devices.traits.CameraPerson" : {}, "sdm.devices.traits.CameraSound" : {}, "sdm.devices.traits.Info" : { "customName" : "My device" } } }
Obsługa zdarzeń zarejestrowanych przez kamerę
Poniższe zdarzenia mogą być wywoływane przez urządzenia typu APARAT, DOORBELL lub DISPLAYOWA z kamerą, taką jak Google Nest Doorbell (starsza wersja) lub Google Nest Hub Max:Typ | Element | Opis |
---|---|---|
Zdarzenie | Zdarzenie ruchu właściwości CameraMotion | Kamera wykryła ruch. |
Zdarzenie | Zdarzenie Person o cechach CameraPerson | Kamera wykryła jakąś osobę. |
Zdarzenie | Zdarzenie dźwięk związane z cechą CameraSound | Kamera wykryła dźwięk. |
Ładunek
{ "eventId" : "28e4e481-b153-4b78-8373-44a30d495802",
"timestamp" : "2019-01-01T00:00:01Z",
"resourceUpdate" : { "name" : "enterprises/project-id/devices/device-id", "events" : { "sdm.devices.events.CameraMotion.Motion
" : { "eventSessionId" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...", "eventId" : "wM17EI6hoKPFiDRweX2i9j0b03...", } } } "userId" : "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
"resourceGroup" : [ "enterprises/project-id/devices/device-id" ] }
eventId
, którego można użyć z poleceniem GenerateImage. To polecenie zwraca adres URL pobierania obrazu aparatu powiązanego ze zdarzeniem:
Prośba
POST /enterprises/project-id/devices/device-id:executeCommand
{
"command" : "sdm.devices.commands.CameraEventImage.GenerateImage
",
"params" : {
"eventId" : "Gw8GQCPbiVzuCmyVtBeh8_hi0L..."
}
}
Odpowiedź
{ "results" : { "url" : "https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...", "token" : "g.0.eventToken" } }
Pobierz obraz z kamery
Aby pobrać obraz aparatu, wykonaj wywołanie GET w odpowiedzi na polecenie GenerateImage za pomocą token
w nagłówku autoryzacji HTTP z autoryzacją podstawową:url
curl -H "Authorization: Basic g.0.eventToken" \
https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...
Aby dostosować rozdzielczość pobranego obrazu, użyj parametrów zapytania width
lub height
. Musisz określić tylko jeden z tych parametrów. Drugi parametr jest skalowany automatycznie zgodnie z formatem obrazu.
Jeśli na przykład obraz kamery wynosi 4:3, to aby pobrać obraz z kamery w rozdzielczości 480 x 360, podaj szerokość lub wysokość:
Szerokość
curl -H "Authorization: Basic g.0.eventToken" \
https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...?width=480
Wysokość
curl -H "Authorization: Basic g.0.eventToken" \
https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...?height=360
Obowiązują też inne ograniczenia dotyczące adresu URL pobierania:
- Jeśli w adresie URL podasz oba parametry, parametr
width
będzie używany, aheight
będzie ignorowany. - Jeśli w adresie URL nie podasz żadnego z tych parametrów,
width
będzie używać domyślnej wartości 480.
Informacje o właściwościach obrazu znajdziesz w CameraImage .
Dostęp do transmisji na żywo
Możesz uzyskać dostęp do transmisji na żywo z kamery. Na tym urządzeniu obsługiwane są te formaty strumieniowania:
- RTSP
- WebRTC
Pełną listę kamer i obsługiwanych formatów transmisji strumieniowej znajdziesz w artykule Obsługiwane urządzenia.
Aby uzyskać dostęp do transmisji na żywo, użyj odpowiedniego polecenia WygenerujFormattransmisję w właściwościCameraLiveStream.
WebRTC
W przypadku strumienia WebRTC wyślij polecenie offerSdp
w poleceniu GenerateWebRtcStream w atrybucie CameraLiveStream, aby uzyskać answerSdp
:
Prośba
POST /enterprises/project-id/devices/device-id:executeCommand
{
"command" : "sdm.devices.commands.CameraLiveStream.GenerateWebRtcStream
",
"params" : {
"offerSdp" : "offerSdp"
}
}
Odpowiedź
{ "results" : { "answerSdp" : "answerSdp", "expiresAt" : "2020-01-04T18:30:00.000Z", "mediaSessionId" : "L3GW1E6yj6-_ceYrpD-LeCirkM..." } }
Zalecamy skorzystanie z przykładowej aplikacji internetowej, by dowiedzieć się, jak wygenerować udaną transmisję na żywo. Ten przykład generuje prawidłową wartość offerSdp
, która spełnia wszystkie ograniczenia oferty SDP dotyczące kamer Nest.
Oferta SDP dotycząca kamer Nest musi spełniać te ograniczenia:
- Obsługiwany jest tylko format ujednolicony. Plan B nie jest obsługiwany.
- Oferta musi zawierać wszystkie wiersze mediów (
m=
) w tej kolejności:- ścieżkom audio
- film,
- aplikacja
- Trickle ICE jest obsługiwany, ale nie wymagany.
- W przypadku dźwięku obsługiwany jest tylko kodek Opus.
- Ustawienie dźwięku musi być ustawione na
a=recvonly
(tylko odbiór). - Oferta musi kończyć się znakiem nowego wiersza o wartości
\r\n
lub\n
.
Do wygenerowania transmisji na żywo w ciągu 30 sekund od otrzymania odpowiedzi trzeba użyć usługi answerSdp
. W przeciwnym razie wygaśnie ona. Jeśli wiadomość wygaśnie, wykonaj jeszcze raz polecenie GenerateWebRtcStream, aby otrzymać nowy answerSdp
.
Otwierając kanały WebRTC na potrzeby transmisji na żywo, pamiętaj, aby utworzyć zarówno kanał danych, jak i kanał wideo.
Zobacz przykład prawidłowej oferty
Niesformatowany:
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
Sformatowane:
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
RTSP
W przypadku strumienia RTSP polecenie GenerateRtspStream z polecenia trait CameraLiveStream zwraca adres URL strumienia i powiązanego elementu streamToken
:
Prośba
POST /enterprises/project-id/devices/device-id:executeCommand
{
"command" : "sdm.devices.commands.CameraLiveStream.GenerateRtspStream
",
"params" : {}
}
Odpowiedź
{ "results" : { "streamUrls" : { "rtspUrl" : "rtsps://someurl.com/CjY5Y3VKaTZwR3o4Y19YbTVfMF...?auth=g.0.streamingToken" }, "streamExtensionToken" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...", "streamToken" : "g.0.streamingToken", "expiresAt" : "2018-01-04T18:30:00.000Z" } }
Następnie użyj adresu URL transmisji, aby uzyskać dostęp do transmisji na żywo z kamery:
rtsps://someurl.com/CjY5Y3VKaTZwR3o4Y19YbTVfMF...?auth=g.0.streamingToken
Adresów URL transmisji na żywo z protokołem RTSP nie można udostępniać między klientami. Adresu URL transmisji może używać tylko jeden klient naraz. Jeśli wielu klientów chce jednocześnie przesyłać dane z tej samej kamery, polecenia RTSP muszą być wysyłane do każdego z nich, a każdy klient musi używać własnego adresu URL strumienia.
Przedłużanie transmisji na żywo
Sesje transmisji na żywo z kamery trwają tylko 5 minut. Jeśli chcesz przedłużyć czas trwania transmisji na żywo, użyj odpowiedniego polecenia ExtendFormatStream w właściwości CameraLiveStream dla wygenerowanego formatu transmisji.
WebRTC
Przewodowe
Strumień WebRTC można przedłużyć tylko w przypadku kamer przewodowych. Kamera zasilana baterią podczas ładowania jest uznawana za zasilaną kablem. Jeśli kamera jest zasilana z baterii, żądanie rozszerzenia aktywnego strumienia WebRTC jest ignorowane.
Aby rozszerzyć strumień WebRTC, określ identyfikator sesji multimediów strumienia za pomocą polecenia ExtendWebRtcStream cechy CameraLiveStream:
Prośba
POST /enterprises/project-id/devices/device-id:executeCommand
{
"command" : "sdm.devices.commands.CameraLiveStream.ExtendWebRtcStream
",
"params" : {
"mediaSessionId" : "L3GW1E6yj6-_ceYrpD-LeCirkM..."
}
}
Odpowiedź
{ "results" : { "expiresAt" : "2018-01-04T18:30:00.000Z", "mediaSessionId" : "L3GW1E6yj6-_ceYrpD-LeCirkM..." } }
RTSP
Aby rozszerzyć strumień RTSP, użyj polecenia ExtendRtspStream polecenia trait CameraLiveStream w celu pobrania nowych wartości streamExtensionToken
i streamToken
:
Prośba
POST /enterprises/project-id/devices/device-id:executeCommand
{
"command" : "sdm.devices.commands.CameraLiveStream.ExtendRtspStream
",
"params" : {
"streamExtensionToken" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF..."
}
}
Odpowiedź
{ "results" : { "streamExtensionToken" : "dGNUlTU2CjY5Y3VKaTZwR3o4Y1...", "streamToken" : "g.0.newStreamingToken", "expiresAt" : "2018-01-04T18:30:00.000Z" } }
Aby nadal wyświetlać transmisję na żywo, zaktualizuj adres URL transmisji, podając nowe wartości:
rtsps://someurl.com/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...?auth=g.0.newStreamingToken
Kończenie transmisji na żywo
Za każdym razem, gdy nie korzystasz już z transmisji na żywo z kamery, przerwij ją i unieważnij transmisję. Aby to zrobić, użyj odpowiedniego polecenia StopFormatStream w właściwościCameraLiveStreamdla wygenerowanego formatu transmisji.
WebRTC
Aby zatrzymać strumień WebRTC, podaj identyfikator sesji multimedialnej w poleceniu StopWebRtcStream w właściwości CameraLiveStream:
Prośba
POST /enterprises/project-id/devices/device-id:executeCommand
{
"command" : "sdm.devices.commands.CameraLiveStream.StopWebRtcStream
",
"params" : {
"mediaSessionId" : "L3GW1E6yj6-_ceYrpD-LeCirkM..."
}
}
Odpowiedź
{}
RTSP
Aby zatrzymać strumień RTSP, użyj tokena do unieważnienia za pomocą polecenia StopRtspStream polecenia trait CameraLiveStream:
Prośba
POST /enterprises/project-id/devices/device-id:executeCommand
{
"command" : "sdm.devices.commands.CameraLiveStream.StopRtspStream
",
"params" : {
"streamExtensionToken" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF..."
}
}
Odpowiedź
{}
Błędy
W przypadku tego urządzenia mogą zostać zwrócone następujące kody błędów:
Komunikat o błędzie | RPC | Rozwiązywanie problemów |
---|---|---|
Kamera nie jest dostępna do transmitowania. | FAILED_PRECONDITION |
Kamera jest offline lub nie można jej przesyłać strumieniowo z powodu problemu technicznego. |
Polecenie nie jest obsługiwane. | INVALID_ARGUMENT |
W przypadku kamery obsługującej WebRTC użyto polecenia transmisji na żywo RTSP lub polecenia transmisji na żywo z WebRTC w przypadku kamery obsługującej protokół RTSP. |
Zdjęcie z aparatu nie jest już dostępne do pobrania. | DEADLINE_EXCEEDED |
Obrazy zdarzeń wygasają po 30 sekundach od opublikowania zdarzenia. Pamiętaj, aby pobrać obraz przed wygaśnięciem ważności. |
Identyfikator zdarzenia nie należy do kamery. | FAILED_PRECONDITION |
Użyj prawidłowej wartości eventID zwróconej przez zdarzenie kamery. |
Pełną listę kodów błędów interfejsu API znajdziesz w dokumentacji kodu błędu interfejsu API.