카메라 (기존)

Nest Cam

기존의 모든 Nest Cam은 Smart Device Management (SDM) API에서 지원됩니다.

  1. Google Nest Cam Indoor
  2. Google Nest Cam Outdoor
  3. Google 실내용 Nest Cam IQ
  4. Google 실외용 Nest Cam IQ

다음 기기는 CAMERA 기기 유형을 반환합니다.

sdm.devices.types.CAMERA

Google Nest Doorbell (기존)Google Nest Hub Max도 카메라로 작동하며 비슷한 기능을 갖추고 있지만 각각 DOORBELL 및 DISPLAY 기기 유형을 반환합니다.

Google Nest Cam Indoor 및 Google Nest Cam Outdoor는 Nest 앱 또는 Google Home 앱에서 사용할 수 있지만 동시에 둘 다에서 사용할 수는 없습니다. 카메라가 Nest 앱에 있을 때는 RTSP를 지원합니다. 카메라가 Google Home 앱에 있을 때는 WebRTC를 지원합니다.CameraLiveStream 트레잇의 supportedProtocols 필드는 지원되는 형식을 보여줍니다. 자세한 설명은 Google Home 앱으로 기기 이전 지원 도움말을 참고하세요.

이러한 기기 유형의 고유한 기능에 관한 자세한 내용은 초인종디스플레이 기기 가이드를 참고하세요.

특성

참조

이 기기와 관련된 특성, 명령어 또는 이벤트는 다음과 같습니다.

특성설명명령어이벤트
CameraEventImage이 트레잇은 이벤트에서 이미지 생성을 지원하는 모든 기기에 속합니다.GenerateImage
CameraImage이 트레잇은 이미지 촬영을 지원하는 모든 기기에 속합니다.
CameraLiveStream이 트레잇은 라이브 스트리밍을 지원하는 모든 기기에 속합니다.GenerateRtspStream
ExtendRtspStream
StopRtspStream
GenerateWebRtcStream
ExtendWebRtcStream
StopWebRtcStream
CameraMotion이 트레잇은 움직임 감지 이벤트를 지원하는 모든 기기에 속합니다.모션
CameraPerson이 트레잇은 사람 감지 이벤트를 지원하는 모든 기기에 속합니다.사람
CameraSound이 트레잇은 소리 감지 이벤트를 지원하는 모든 기기에 속합니다.소리
정보이 트레잇은 기기 관련 정보를 위한 모든 기기에 속합니다.

JSON

GET 응답에 특성이 없으면 현재 기기에서 해당 특성 또는 기능을 사용할 수 없음을 나타냅니다. 자세한 내용은 기기 유형을 참고하세요.

{
  "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"
    }
  }
}

카메라 이벤트 처리

다음 이벤트는 Google Nest Doorbell (기존) 또는 Google Nest Hub Max와 같은 카메라가 있는 카메라 기기 유형 또는 카메라가 있는 초인종 또는 디스플레이에서 트리거될 수 있습니다.

유형 요소 설명
이벤트 CameraMotion 트레잇의 Motion 이벤트 카메라가 움직임을 감지했습니다.
이벤트 CameraPerson 트레잇의 Person 이벤트 카메라가 사람을 감지했습니다.
이벤트 CameraSound trait의 Sound 이벤트 카메라에서 소리가 감지되었습니다.
예를 들어 카메라가 움직임을 감지했습니다.

페이로드

{
  "eventId" : "1ea431b1-32fd-4a1d-9a81-a2f4bf54a9fd",
"timestamp" : "2019-01-01T00:00:01Z",
"resourceUpdate" : { "name" : "enterprises/project-id/devices/device-id", "events" : { "sdm.devices.events.CameraMotion.Motion" : { "eventSessionId" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...", "eventId" : "pV-Tq1oY8hFaPhCbLhxN1i9SRf...", } } } "userId" : "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
"resourceGroup" : [ "enterprises/project-id/devices/device-id" ] }
이 이벤트의 페이로드에는 GenerateImage 명령어와 함께 사용할 수 있는 eventId가 포함됩니다. 이 명령어는 이벤트와 관련된 카메라 이미지의 다운로드 URL을 반환합니다.

요청

POST /enterprises/project-id/devices/device-id:executeCommand
{
  "command" : "sdm.devices.commands.CameraEventImage.GenerateImage",
  "params" : {
    "eventId" : "Bb5o__kVLO2ZoxEvJXQQ5_J5zB..."
  }
}

응답

{
  "results" : {
    "url" : "https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...",
    "token" : "g.0.eventToken"
  }
}

카메라 이미지 다운로드하기

GenerateImage 명령어 응답에서 url를 호출하고 기본 승인이 있는 HTTP 승인 헤더의 token를 사용하여 카메라 이미지를 다운로드합니다.

curl -H "Authorization: Basic g.0.eventToken" \
      https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...

width 또는 height 쿼리 매개변수를 사용하여 다운로드한 이미지의 해상도를 맞춤설정합니다. 이 매개변수 중 하나만 지정하면 됩니다. 다른 매개변수는 카메라의 가로세로 비율에 따라 자동으로 조정됩니다.

예를 들어 카메라의 가로세로 비율이 4:3인 경우 해상도가 480x360인 카메라 이미지를 다운로드하려면 너비 또는 높이를 지정합니다.

너비

curl -H "Authorization: Basic g.0.eventToken" \
      https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...?width=480

curl -H "Authorization: Basic g.0.eventToken" \
      https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...?height=360

다운로드 URL에는 다음과 같은 제한사항이 적용됩니다.

  • 두 매개변수가 모두 URL에 제공되면 width가 사용되고 height는 무시됩니다.
  • URL에 두 매개변수 모두 제공되지 않으면 width에 기본값 480이 선택됩니다.

이미지 속성에 관한 자세한 내용은 카메라 이미지 속성을 참고하세요.

라이브 스트림 이용

카메라의 라이브 스트림에 액세스할 수 있습니다. 이 기기에서는 다음 스트림 형식이 지원됩니다.

  • RTSP
  • WebRTC

카메라 및 지원되는 스트림 형식의 전체 목록은 지원되는 기기를 참고하세요.

라이브 스트림에 액세스하려면CameraLiveStream특성의 적절한 GenerateFormatStream 명령어를 사용합니다.

WebRTC


WebRTC 스트림의 경우 CameraLiveStream 트레잇의 GenerateWebRtcStream 명령어에서 offerSdp를 전송하여 answerSdp를 가져옵니다.

요청

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" : "AHF3eXEawlRT3ikCCFOsDqlmzC..."
  }
}

웹 애플리케이션 샘플을 사용하여 성공적인 라이브 스트림을 생성하는 방법을 알아보는 것이 좋습니다. 이 샘플은 Nest 카메라의 모든 SDP 혜택 제한사항을 충족하는 유효한 offerSdp를 생성합니다.

Nest 카메라에 대한 SDP 혜택은 다음 제한사항을 충족해야 합니다.

  • 통합 형식만 지원됩니다. 요금제 B는 지원되지 않습니다.
  • 모든 미디어 라인 (m=)은 오퍼에 있어야 하며 다음 순서여야 합니다.
    1. 오디오
    2. 동영상
    3. 애플리케이션
  • Trickle ICE가 지원되지만 필수는 아닙니다.
  • 오디오에는 Opus 코덱만 지원됩니다.
  • 오디오 설정은 a=recvonly (수신 전용)으로 설정해야 합니다.
  • 오퍼는 줄바꿈 문자 \r\n 또는 \n로 끝나야 합니다.

응답 수신 후 30초 이내에 라이브 스트림을 생성하려면 answerSdp을 사용해야 하며, 그러지 않으면 만료됩니다. 만료되는 경우 GenerateWebRtcStream 명령어를 다시 실행하여 새 answerSdp를 수신합니다.

라이브 스트림의 WebRTC 채널을 열 때 동영상 채널뿐 아니라 데이터 채널을 만들어야 합니다.

유효한 혜택의 예 보기

형식이 지정되지 않음:

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

RTSP

RTSP 스트림의 경우 CameraLiveStream 트레잇 명령어의 GenerateRtspStream 명령어는 스트림 URL 및 관련 streamToken를 반환합니다.

요청

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"
  }
}

그런 다음 스트림 URL을 사용하여 카메라 라이브 스트림에 액세스합니다.

rtsps://someurl.com/CjY5Y3VKaTZwR3o4Y19YbTVfMF...?auth=g.0.streamingToken

RTSP 라이브 스트림 URL은 클라이언트 간에 공유할 수 없습니다. 스트림 URL은 한 번에 한 클라이언트에서만 사용할 수 있습니다. 여러 클라이언트가 동일한 카메라에서 동시에 스트리밍하려는 경우 각 클라이언트에 대해 RTSP 명령을 전송해야 하며 개별 클라이언트는 자체 스트림 URL을 사용해야 합니다.

라이브 스트림 연장하기

카메라 라이브 스트림 세션은 5분 동안만 유효합니다. 라이브 스트림의 전체 기간을 연장해야 하는 경우 생성한 스트림 형식에 맞는 CameraLiveStream 속성의 적절한 '스트림 확장' 명령어를 사용하세요.Format

WebRTC


  유선   

WebRTC 스트림은 유선 전원 카메라에서만 확장할 수 있습니다. 배터리 전원 카메라는 충전을 위해 전원에 연결되어 있는 동안 유선 전원으로 간주됩니다. 카메라가 배터리 전원을 사용하는 경우 활성 WebRTC 스트림을 확장하라는 요청이 무시됩니다.

WebRTC 스트림을 확장하려면 CameraLiveStream 트레잇의 ExtendWebRtcStream 명령어로 스트림의 미디어 세션 ID를 지정합니다.

요청

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

응답

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

RTSP

RTSP 스트림을 확장하려면 CameraLiveStream 트레잇 명령어의 ExtendRtspStream 명령어를 사용하여 새로운 streamExtensionTokenstreamToken 값을 가져옵니다.

요청

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"
  }
}

라이브 스트림을 계속 보려면 스트림 URL을 다음과 같은 새 값으로 업데이트하세요.

rtsps://someurl.com/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...?auth=g.0.newStreamingToken

라이브 스트림 중지

카메라 라이브 스트림을 더 이상 사용하지 않을 때는 스트림을 중지하고 스트림을 무효화해야 합니다. 이렇게 하려면 생성한 스트림 형식에 맞는CameraLiveStream특성의 적절한 StopFormatStream 명령어를 사용합니다.

WebRTC


WebRTC 스트림을 중지하려면 CameraLiveStream 트레잇의 StopWebRtcStream 명령어로 미디어 세션 ID를 지정합니다.

요청

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

응답

{}

RTSP

RTSP 스트림을 중지하려면 토큰을 사용하여 CameraLiveStream 트레잇 명령어의 StopRtspStream 명령어로 무효화합니다.

요청

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

응답

{}

오류

이 기기와 관련하여 다음 오류 코드가 반환될 수 있습니다.

오류 메시지 RPC 문제 해결
스트리밍할 수 없는 카메라입니다. FAILED_PRECONDITION 카메라가 오프라인 상태이거나 기술적인 문제로 인해 스트리밍할 수 없습니다.
지원되지 않는 명령어입니다. INVALID_ARGUMENT WebRTC를 지원하는 카메라에 RTSP 라이브 스트림 명령어를 사용했거나, RTSP를 지원하는 카메라에 WebRTC 라이브 스트림 명령어를 사용했습니다.
카메라 이미지를 더 이상 다운로드할 수 없습니다. DEADLINE_EXCEEDED 이벤트 이미지는 이벤트가 게시된 후 30초 후에 만료됩니다. 만료되기 전에 이미지를 다운로드해야 합니다.
카메라에 속하지 않은 활동 ID입니다. FAILED_PRECONDITION 카메라 이벤트에서 반환된 올바른 eventID를 사용합니다.

API 오류 코드의 전체 목록은 API 오류 코드 참조를 확인하세요.