スマートホーム CameraStream トレイトのスキーマ

action.devices.traits.CameraStream - このトレイトは、サードパーティのスクリーン、Chromecast に接続しているスクリーン、Android スマートフォンに動画フィードのストリーミングが可能なデバイスのトレイトです。現在のところ、該当するデバイスのほとんどは防犯カメラやベビーモニターですが、カメラ付きのもっと複雑なデバイス(ビデオ会議用のロボットやデバイス、カメラ付きの自動掃除機など)も該当します。

デバイスの属性

属性 定義
cameraStreamSupportedProtocols リアルタイム ストリームでサポートしているメディアタイプを表す文字列の順序付きリスト。
cameraStreamNeedAuthToken カメラフィードをストリーミングするために Auth トークンが必要かどうかを示すブール値。
cameraStreamNeedDrmEncryption ストリーム コンテンツに DRM 暗号化が必要かどうかを示すブール値。

SYNC リクエストとレスポンスの例

リクエスト
{
    "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
    "inputs": [{
      "intent": "action.devices.SYNC"
    }]
}
Node.jsレスポンス
'use strict';

const {smarthome} = require('actions-on-google');
const functions = require('firebase-functions');

const app = smarthome();

app.onSync((body, headers) => {
  return {
    requestId: body.requestId,
    payload: {
      agentUserId: '1836.15267389',
      devices: [{
        id: '123',
        type: 'action.devices.types.CAMERA',
        traits: [
          'action.devices.traits.CameraStream'
        ],
        name: {
          defaultNames: ['Sirius Cybernetics Corporation 3000'],
          name: 'Front Camera',
          nicknames: ['Camera']
        },
        willReportState: false,
        attributes: {
          cameraStreamSupportedProtocols: ['hls', 'dash'],
          cameraStreamNeedAuthToken: true,
          cameraStreamNeedDrmEncryption: false
        },
        customData: {
          fooValue: 74,
          barValue: true,
          bazValue: 'lambtwirl'
        }
      }]
    }
  };
});

// ...

exports.smarthome = functions.https.onRequest(app);
JSONレスポンス
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "agentUserId": "1836.15267389",
    "devices": [
      {
        "id": "123",
        "type": "action.devices.types.CAMERA",
        "traits": [
          "action.devices.traits.CameraStream"
        ],
        "name": {
          "defaultNames": [
            "Sirius Cybernetics Corporation 3000"
          ],
          "name": "Front Camera",
          "nicknames": [
            "Camera"
          ]
        },
        "willReportState": false,
        "attributes": {
          "cameraStreamSupportedProtocols": [
            "hls",
            "dash"
          ],
          "cameraStreamNeedAuthToken": true,
          "cameraStreamNeedDrmEncryption": false
        },
        "customData": {
          "fooValue": 74,
          "barValue": true,
          "bazValue": "lambtwirl"
        }
      }
    ]
  }
}
検証ツール

デバイスのステータス

なし

デバイスのコマンド

このコマンドは、他のトレイト / コマンドのように素直に実行されるのではなく、パイプラインの最初のステージです。GetCameraStream は、アシスタントがメディア ターゲットにフィードするアドレスを返します(現時点では、Chomecast 対応のターゲットのみ)。ただし、キャッシュされている可能性のあるデータを単に問い合わせるのではなく、実際の影響があるため、QUERY ではなく EXECUTE コマンドになっています。
コマンド パラメータ / 定義
action.devices.commands.GetCameraStream ユーザーのスマートフォン、アシスタント サーフェス自体、メディア / キャスト ターゲットなどの画面に表示するために、カメラのストリーミングを開始します(ストリームのリターン URL)
  • StreamToChromecast ストリームが Chromecast デバイスで再生されるかどうかを示すブール値。
  • SupportedStreamProtocols 文字列のリスト。宛先でサポートされているメディアタイプ / メディア フォーマットをいっしょに送ります。クライアントは、これらのフォーマットのうちの 1 つを指すストリーミング URL を返す必要があります。
SupportedStreamProtocols は以下を返します。
  • cameraStreamAccessUrl 文字列。リアルタイム ストリームを取得するための URL エンドポイント。
  • cameraStreamReceiverAppId 文字列。省略可。特定のレシーバーがストリームを処理する必要がある場合の、キャスト レシーバー ID をキャストします。
  • cameraStreamAuthToken 文字列。省略可。特定の受信者がストリームを認証するためのトークン。

EXECUTE リクエストとレスポンスの例

「Chromecast で正面玄関のカメラを表示して」
リクエスト
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "inputs": [{
    "intent": "action.devices.EXECUTE",
    "payload": {
      "commands": [{
        "devices": [{
          "id": "123",
          "customData": {
            "fooValue": 74,
            "barValue": true,
            "bazValue": "lambtwirl"
          }
        }],
        "execution": [{
          "command": "action.devices.commands.GetCameraStream",
          "params": {
            "StreamToChromecast": true,
            "SupportedStreamProtocols": [
              "progressive_mp4",
              "hls",
              "dash",
              "smooth_stream"
            ]
          }
        }]
      }]
    }
  }]
}
Node.jsレスポンス
'use strict';

const {smarthome} = require('actions-on-google');
const functions = require('firebase-functions');

const app = smarthome();

app.onExecute((body, headers) => {
  return {
    requestId: body.requestId,
    payload: {
      commands: [{
        ids: ['123'],
        status: 'SUCCESS',
        states: {
          cameraStreamAccessUrl: 'https://fluffysheep.com/baaaaa.mp4',
          cameraStreamReceiverAppId: '1g2f89213hg',
          cameraStreamAuthToken: '12657342190192783'
        }
      }]
    }
  };
});

// ...

exports.smarthome = functions.https.onRequest(app);
JSONレスポンス
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [
      {
        "ids": [
          "123"
        ],
        "status": "SUCCESS",
        "states": {
          "cameraStreamAccessUrl": "https://fluffysheep.com/baaaaa.mp4",
          "cameraStreamReceiverAppId": "1g2f89213hg",
          "cameraStreamAuthToken": "12657342190192783"
        }
      }
    ]
  }
}

デバイスエラー

エラーと例外の全リストをご覧ください。

resourceUnavailable - ストリーム URL の生成に関連するエラー。

サポートされている動画形式

MPL を利用している一般的なキャスト レシーバーは、次のストリーミング メディア プロトコルをサポートできます。

  • HLS(HTTP ライブ ストリーミング)
  • DASH(動的適応型 HTTP ストリーミング)
  • Smooth Streaming
  • プログレッシブ MP4(Clips でよく使用されます)

DRM 暗号化が必要な場合、Google のキャスト デバイスは以下の CDM をサポートします。

  • Widevine
  • PlayReady

サポートされているコーデックのリストをご覧ください

カメラ パートナー用のカスタム レシーバー(つまり、ベンダー A のカメラデバイスには、ベンダー A のキャスト レシーバーが必要)は、キャストでデコード可能なすべての形式をサポートできます(上記および HTML5 / MSE / EME で実装できるその他の独自プロトコル)。カスタム レシーバーの展開により、ブランディングの強化とカスタム ビジネス ロジック(サードパーティ API とのやり取り)実現が可能になります。