Schéma du flux de la caméra connectée pour la maison

action.devices.traits.CameraStream : cette caractéristique décrit comment contrôler le flux de la caméra d'un appareil.

Cette caractéristique est associée aux appareils qui peuvent diffuser des flux vidéo en streaming sur des écrans connectés, des appareils compatibles Chromecast ou des smartphones. De façon générale, il s'agit de caméras de sécurité ou de caméras pour bébés. Toutefois, cette caractéristique est également valable pour les appareils plus complexes équipés d'une caméra (par exemple, les appareils de visioconférence ou les robots aspirateurs dotés d'une caméra).

ATTRIBUTS de l'appareil

Les appareils disposant de cette caractéristique peuvent signaler les attributs suivants lors de l'opération SYNC. Pour en savoir plus sur la gestion des intents SYNC, consultez Traitement des intents.

Attributs Type Description
cameraStreamSupportedProtocols Array

Obligatoire.

Types de médias compatibles avec le flux de la caméra, classés par préférence. En règle générale, le premier protocole de ce tableau compatible avec la surface cible est demandé.

[item, ...] String

Type de média.

Valeurs acceptées :

hls
Diffusion HTTP en direct
dash
Streaming adaptatif dynamique sur HTTP
smooth_stream
Streaming fluide
progressive_mp4
MP4 progressif (principalement utilisé pour les extraits)
webrtc
WebRTC
cameraStreamNeedAuthToken Booléen

Obligatoire.

Indique si un jeton d'authentification sera fourni via cameraStreamAuthToken pour que la surface cible diffuse le flux de l'appareil photo.

Exemples

Caméra compatible avec plusieurs protocoles, ne nécessitant pas de jeton d'authentification.

{
  "cameraStreamSupportedProtocols": [
    "webrtc",
    "hls",
    "dash",
    "smooth_stream",
    "progressive_mp4"
  ],
  "cameraStreamNeedAuthToken": false
}

Caméra compatible avec un seul protocole, nécessitant un jeton d'authentification.

{
  "cameraStreamSupportedProtocols": [
    "hls"
  ],
  "cameraStreamNeedAuthToken": true
}

Protocoles de streaming compatibles

Cette caractéristique est compatible avec les protocoles de streaming suivants:

Appareil STATES

Aucun.

Appareil COMMANDS

Les appareils disposant de cette caractéristique peuvent répondre aux commandes suivantes dans le cadre de l'opération EXECUTE. Pour en savoir plus sur la gestion des intents EXECUTE, consultez Traitement des intents.

action.devices.commands.GetCameraStream

Paramètres

Paramètres Type Description
StreamToChromecast Booléen

Obligatoire.

Indique si le flux sera lu sur un appareil Chromecast.

SupportedStreamProtocols Array

Obligatoire.

Types et formats de supports acceptés par la destination souhaitée.

[item, ...] String

Type de média.

Valeurs acceptées :

hls
Diffusion HTTP en direct
dash
Streaming adaptatif dynamique sur HTTP
smooth_stream
Streaming fluide
progressive_mp4
MP4 progressif (principalement utilisé pour les extraits)
webrtc
WebRTC

Résultats

Résultats Type Description
cameraStreamAuthToken String

Jeton d'authentification pour le destinataire spécifique afin d'autoriser l'accès au flux. Si cameraStreamNeedAuthToken est "true" et que cette valeur n'est pas fournie, les identifiants OAuth de l'utilisateur seront utilisés comme jeton d'authentification.

cameraStreamProtocol String

Obligatoire.

Format multimédia vers lequel l'URL de flux renvoie. Il doit s'agir de l'un des protocoles répertoriés dans le paramètre de commande SupportedStreamProtocols.

Valeurs acceptées :

hls
Diffusion HTTP en direct
dash
Streaming adaptatif dynamique sur HTTP
smooth_stream
Streaming fluide
progressive_mp4
MP4 progressif (principalement utilisé pour les extraits)
webrtc
WebRTC

Résultats hors WebRTC

Résultats Type Description
cameraStreamAccessUrl String

Obligatoire.

Point de terminaison de l'URL pour récupérer le flux en temps réel au format spécifié par cameraStreamProtocol.

cameraStreamReceiverAppId String

ID du récepteur de cast pour traiter le flux de la caméra lorsque le paramètre StreamToChromecast est défini sur "true". Le récepteur par défaut est utilisé s'il n'est pas fourni.

Résultats WebRTC

Résultats Type Description
cameraStreamSignalingUrl String

Obligatoire.

Point de terminaison de l'URL permettant de récupérer et d'échanger les protocoles de description de session (SDP) pour les caméras et les clients. Le client doit renvoyer l'URL de signalement qui utilise cameraStreamAuthToken comme jeton d'authentification dans l'en-tête de requête.

cameraStreamOffer String

Protocole de description de session d'offre (SDP).

cameraStreamIceServers String

Représente les serveurs ICE (Interactive Connectivity Establishment) à l'aide d'une chaîne JSON encodée avec la description d'un serveur RTCIceServer. Si vous ne spécifiez pas de serveurs STUN (Session Traversal Utilities for NAT), la plate-forme utilise par défaut les serveurs STUN publics de Google. Turn (Traversal Using Relaystour NAT) n'est obligatoire que si vous ne pouvez pas garantir que les adresses IP / les candidats ICE fournis seront accessibles au public (par exemple, via un serveur multimédia, un candidat ICE public d'hôte, un candidat ICE de relais, etc.).

Exemples

Afficher la caméra de la porte d'entrée (récepteur Cast par défaut)

{
  "cameraStreamAccessUrl": "https://fluffysheep.com/baaaaa.mp4",
  "cameraStreamProtocol": "progressive_mp4"
}

Afficher la caméra de la porte d'entrée (récepteur Cast personnalisé)

{
  "cameraStreamAccessUrl": "https://fluffysheep.com/baaaaa.mp4",
  "cameraStreamReceiverAppId": "1g2f89213hg",
  "cameraStreamAuthToken": "12657342190192783",
  "cameraStreamProtocol": "progressive_mp4"
}

Afficher la caméra de la porte d'entrée (flux WebRTC)

{
  "cameraStreamIceServers": "[{\"urls\": \"stun:stun.l.partner.com:19302\"},{\"urls\":\"turn:192.158.29.39:3478?transport=udp\",\"credential\": \"JZEOEt2V3Qb0y27GRntt2u2PAYA=\",\"username\": \"28224511:1379330808\"},{\"urls\": \"turn:192.158.29.39:3478?transport=tcp\",\"credential\": \"JZEOEt2V3Qb0y27GRntt2u2PAYA=\",\"username\": \"28224511:1379330808\"}]",
  "cameraStreamSignalingUrl": "https://example.com/signaling/answer",
  "cameraStreamOffer": "o=- 4611731400430051336 2 IN IP4 127.0.0.1...",
  "cameraStreamProtocol": "webrtc"
}

ERREURS sur l'appareil

Consultez la liste complète des erreurs et exceptions.

Spécifications du protocole WebRTC

Les avantages de WebRTC sont une faible latence et une communication bidirectionnelle. WebRTC utilise une méthode POST avec un corps POST et une réponse au format JSON.

WebRTC est actuellement compatible avec les écrans connectés Google Nest et Chromecast avec Google TV.

Cette section décrit les conditions requises pour utiliser le protocole de flux WebRTC.

Type de données Paramètres/Définitions
En-tête de requête de signalisation

L'en-tête doit répondre aux exigences suivantes:

  • Authentification: l'en-tête d'authentification doit utiliser le jeton d'authentification de la valeur renvoyée GetCameraStream pour cameraStreamAuthToken avec le type de jeton Bearer.
  • Content-Type: application/json
Signalisation des paramètres de requête

La requête peut inclure les paramètres suivants:

  • action: chaîne. Les valeurs valides sont les suivantes :
    • offer: proposez un message SDP du fournisseur.
    • answer: répond au message SDP du fournisseur.
    • end: ferme la session en cours.
  • deviceId: chaîne. ID de l'appareil, tel qu'indiqué dans une requête SYNC ou EXECUTE.
  • sdp: chaîne. Contient le message du protocole de description de session pour la connexion au pair. Le contenu est basé sur la valeur du paramètre action. Si action est "end", ce paramètre peut être vide.
Signalisation des paramètres de réponse

La réponse peut inclure les paramètres suivants:

  • action: chaîne. La valeur de la réponse doit être de type answer.
  • sdp: chaîne. Message SDP pour la réponse de réponse.

Exigences et recommandations de WebRTC

  • Google prend actuellement en charge la communication unidirectionnelle.
  • Vous devez accepter le regroupement et rtcp-mux.
  • Vous devez utiliser (D)TLS 1.2 ou une version ultérieure.
  • Trickle ICE n'est pas compatible. Tous les candidats ICE doivent d'abord être recueillis avant d'envoyer le SDP.
  • Il est fortement recommandé d'inclure des candidats UDP/IPv4, TCP/IPv4, UDP/IPv6 et TCP/IPv6 ICE afin d'augmenter la probabilité de réussite de la connexion.

Résolutions vidéo compatibles:

  • Minimum:480p
  • Maximum:1080p

Codecs vidéo compatibles:

  • VP8
  • H.264

Codecs audio compatibles:

  • Opus (codec préféré)
  • G.711/PCMU
  • G.722

Partage de ressources entre origines

Le partage de ressources inter-origines (CORS) est un mécanisme qui utilise des en-têtes HTTP supplémentaires pour indiquer aux navigateurs d'autoriser une application Web s'exécutant sur une origine à accéder aux ressources sélectionnées à partir d'une autre origine. Le serveur hébergeant cameraStreamSignalingUrl doit répondre avec l'en-tête suivant:

Access-Control-Allow-Origin: https://www.gstatic.com

Exemple de requête et de réponse de signalisation

L'exemple suivant montre une requête que Google envoie à votre service de signalement et la réponse correspondante à Google.

Demande
Header:

Authentication: Bearer <cameraStreamAuthToken>
Content-Type: application/json

POST body:

// When camera offer SDP is provided in the execution response, Google provides an answer SDP.
{
  "action": "answer",
  "deviceId": "123",
  "sdp": "o=- 4611731400430051336 2 IN IP4 127.0.0.1..."
}

// When camera offer SDP is not provided in execution response, Google generates and provides an offer SDP.
{
  "action": "offer",
  "deviceId": "123",
  "sdp": "o=- 4611731400430051336 2 IN IP4 127.0.0.1..."
}

// Close the current stream session.
{
  "action": "end"
  "deviceId": "123"
}

Réponse
// Response to accept the answer SDP in the request.
Response Code : 200
{}

// Response to provide the answer SDP from the service provider.
Response Code : 200
{
  // When the camera offer SDP is not provided in the execution response,
  // Google provides the answer SDP via the signaling response.
  "action": "answer"
  "sdp": "o=- 4611731400430051336 2 IN IP4 127.0.0.1..."
}

// Response to close current session.
Response Code : 200
{}