前回の記事では、Google CloudのLive Stream APIでDRM配信を実現する方法について見ていきました。本記事では、前回の記事では説明しきれなかったDRM設定周り[1]について、より詳しく解説していきます。

この記事では、個々のJSONプロパティの詳細について説明はしません。あくまでもチャネル作成時のJSONと暗号鍵情報JSONの構造や関係性について説明していくものです。

チャネル作成時のJSONと、暗号鍵情報JSONの構造と関係

チャネル作成時のJSONと、暗号鍵情報JSONは、初見ですと構造も関係性も複雑で分かりづらいと感じるかもしれません。そのため、この項では それぞれのJSONの構造と関係性を簡単に見ていきます。

暗号鍵情報JSONについて

まずは、暗号鍵情報JSON[2]のうち、Widevineの部分について見ていきましょう。

{
    "encryptionKeys": [
      ...
      {
        "keyId": "44ec248b048c43a6a6ee58a752c6f9f8",
        "key": "f1967daca83e81f38d80aa741e7b32c2",
        "keyUri": "skd://44ec248b048c43a6a6ee58a752c6f9f8",
        "matchers": [
          {
            "muxStreams": [
              "fmp4_widevine_cenc_video",
              "fmp4_widevine_cenc_audio",
              "fmp4_widevine_cbcs_video",
              "fmp4_widevine_cbcs_audio"
            ]
          }
        ]
      }
      ...
    ]
}

“encryptionsKeys”の中には、複数の鍵情報を登録することができます。鍵情報の詳細については、Googleのドキュメントを参照いただければと思いますが、この中で注目したい部分は、”matchers[].muxStreams”です。これは、チャネル作成時に定義したストリーム(muxStream)に、どの暗号鍵を使用するかを指定するための設定となります。

チャネル作成時のJSONについて

次に、チャネル作成時のJSONについて見ていきましょう。こちらは前回の記事で使用したJSONで、必要な部分を抜粋したものとなります。

{
    ...
    "elementaryStreams": [
        {
            "key": "es_video",
            ...
        },
        {
            "key": "es_audio",
            ...
        }
    ],
    "encryptions": [
        {
            "id": "widevine-cenc",
            "secretManagerKeySource": {
                "secretVersion": "projects/{PROJECT_NUMBER}/secrets/secret-how-to-drm-livestream/versions/1"
            },
            "drmSystems": {
                "widevine": {}
            },
            "mpegCenc": {
                "scheme": "cenc"
            }
        }
    ],
    "muxStreams": [
        {
            "key": "fmp4_widevine_cenc_video",
            ...
            "elementaryStreams": [
                "es_video"
            ],
            ...
            "encryptionId": "widevine-cenc"
        },
        {
            "key": "fmp4_widevine_cenc_audio",
            ...
            "elementaryStreams": [
                "es_audio"
            ],
            ...
            "encryptionId": "widevine-cenc"
        }
    ],
    ...
}

“encryptions”

“encryptions”には、どのDRMを使用するかや、暗号化方式について複数定義していけます。また、”encryptions[].secretManagerKeySource”では、どのシークレットを使用するかについても指定できます。ここで定義された情報は、後の”muxStreams”で使用しますが、”muxStreams”から参照するために”encryptions[].id”を定義しておきます。

“muxStreams”

“muxStreams[].encryptionId”では、”encryptions”で定義している暗号化情報のどれを使用するかを指定します。”muxStreams[].key”では、前述の暗号鍵情報JSONで定義された”matchers[].muxStreams”に紐づく暗号化情報を元にDRM暗号化されます。

全体図

以上が、各JSONの構造と それぞれの関係性です。言葉だけでは分かりづらいかと思いますので、最後に図で表してみます。

チャネル作成時のJSONと、暗号鍵情報JSONの構造と関係

応用編:Widevine+PlayReadyで一本化

暗号化方式「Common Encryption(CENC)」を使用する場合、WidevinePlayReadyは、MPEG-DASH一本でまとめたいことがよくあります。そのようなケースでは、どのようにJSONを定義すればよいのでしょうか。この項では、応用編ということで、Googleのドキュメントには例示されていない方法を示していきます。

暗号化情報JSON

今回は、WidevineとPlayReadyを一本化するにあたり、これまで使用してきた暗号化情報JSONに定義されている”matchers[].muxStreams”では名前が紛らわしいため、新しくEncryptionKeyを追加します。

{
    "keyId": "44ec248b048c43a6a6ee58a752c6f9f8",
    "key": "f1967daca83e81f38d80aa741e7b32c2",
    "keyUri": "skd://44ec248b048c43a6a6ee58a752c6f9f8",
    "matchers": [
      {
        "muxStreams": [
          "fmp4_widevine_playready_cenc_video",
          "fmp4_widevine_playready_cenc_audio"
        ]
      }
    ]
}

前回の記事で登録したシークレットとは別のバージョンとして登録します。

チャネル作成時のJSON

前回の記事で使用したチャネル作成時のJSONを少し変更します。

{
    "inputAttachments": [
        {
            "key": "input-how-to-drm-livestream",
            "input": "projects/{PROJECT_NUMBER}/locations/asia-northeast1/inputs/input-how-to-drm-livestream"
        }
    ],
    "output": {
        "uri": "gs://bucket-how-to-drm-livestream"
    },
    "elementaryStreams": [
        {
            "key": "es_video",
            "videoStream": {
                "h264": {
                    "profile": "main",
                    "widthPixels": 1920,
                    "heightPixels": 1080,
                    "bitrateBps": 2500000,
                    "frameRate": 30
                }
            }
        },
        {
            "key": "es_audio",
            "audioStream": {
                "codec": "aac",
                "channelCount": 2,
                "bitrateBps": 160000
            }
        }
    ],
    "encryptions": [
        {
            "id": "widevine-playready-cenc",
            "secretManagerKeySource": {
                "secretVersion": "projects/{PROJECT_NUMBER}/secrets/secret-how-to-drm-livestream/versions/2"
            },
            "drmSystems": {
                "widevine": {}, "playready": {}
            },
            "mpegCenc": {
                "scheme": "cenc"
            }
        }
    ],
    "muxStreams": [
        {
            "key": "fmp4_widevine_playready_cenc_video",
            "container": "fmp4",
            "elementaryStreams": [
                "es_video"
            ],
            "segmentSettings": {
                "segmentDuration": "2s"
            },
            "encryptionId": "widevine-playready-cenc"
        },
        {
            "key": "fmp4_widevine_playready_cenc_audio",
            "container": "fmp4",
            "elementaryStreams": [
                "es_audio"
            ],
            "segmentSettings": {
                "segmentDuration": "2s"
            },
            "encryptionId": "widevine-playready-cenc"
        }
    ],
    "manifests": [
        {
            "fileName": "manifest_widevine_playready_cenc.mpd",
            "type": "DASH",
            "muxStreams": [
                "fmp4_widevine_playready_cenc_video",
                "fmp4_widevine_playready_cenc_audio"
            ],
            "maxSegmentCount": 10
        }
    ]
}

変更箇所を一覧化しますと、以下のようになります。

  • encryptions[]
    • id
    • secretManagerKeySource
      • secretVersion
    • drmSystems
  • muxStreams
    • key
    • encryptionId
  • manifests
    • fileName
    • muxStreams[]

大体の項目については、名称を変更しただけとなりますが、注目していただきたいのは、”encryptions[].drmSystems”となります。前回のチャネル作成時のJSONでは、「”widevine”: {}」のみが定義されていましたが、今回はそれに加えて「”playready”: {}」が追加されています。この変更のみで、WidevineとPlayReadyの配信ストリームを一本にまとめることができます。

上述の設定で実際にライブ配信をしてみましょう。できあがったMPEG-DASHマニフェストファイルを確認しますと、Widevineに加えてPlayReadyが追加されているのが確認できます。

左が前回のマニフェストファイル、右が今回のマニフェストファイル

さいごに

以上、Live Stream APIのDRM設定周りについて詳しく見ていきましたが、いかがでしょうか。JSONの構造や関係性を理解すれば、Live Stream APIで柔軟なライブ配信をすることができることが分かったかと思います。弊社『Multi DRM Kit』では、DRM配信をするために必要な機能を提供しておりますので、詳細について知りたいなどございましたら、お気軽にお問い合わせください。



  1. Secret Managerに登録した暗号鍵情報JSONや、チャネル作成時のJSONに設定したDRM部分[]
  2. https://cloud.google.com/livestream/docs/how-to/encrypt-content?hl=ja#example-fpprwidevine[]