デジタル著作権管理とコンテンツ保護の暗号化を構成する

デジタル著作権管理(DRM)とコンテンツ保護をサポートするために、Transcoder API を使用した出力動画の暗号化を構成します。最新バージョンの Transcoder API は、Google Widevine や Microsoft PlayReady の共通暗号化(CENC)DRM、および Apple FairPlay DRM や AES-128 のコンテンツ保護をサポートしています。Transcoder API は、コンテンツの暗号化のみを行います。

始める前に

コンテンツを Transcoder API にアップロードして暗号化する前に、ランダムな 128 ビットキー(32 個の 16 進数の文字)を生成して保存する方法が必要です。Transcoder API はこれらのキーを使用して、コンテナに従ってコンテンツを暗号化します。キーが DRM プロバイダのライセンス ポリシーに登録されていることを確認します。これにより、プレーヤーが後でコンテンツを復号できるようになります。コンテンツの暗号化は、次のコンテナでサポートされています。

テクノロジー 形式 動画コーデック オーディオ コーデック
H.264 H.265 AAC
DRM FairPlay HLS TS(SAMPLE-AES) fMP4(SAMPLE-AES) TS(SAMPLE-AES)
fMP4(SAMPLE-AES) fMP4(SAMPLE-AES)
DRM Widevine、PlayReady DASH fMP4(MPEG-CENC) fMP4(MPEG-CENC)
DRM Widevine、PlayReady HLS fMP4(MPEG-CENC) fMP4(MPEG-CENC)
コンテンツの保護 AES-128 HLS、DASH fMP4、TS(AES-128) fMP4、TS(AES-128) fMP4、TS(AES-128)

Google Widevine と Microsoft PlayReady は、Dynamic Adaptive Streaming over HTTP(DASH)プロトコルと HTTP Live Streaming(HLS)プロトコルの両方をサポートしています。これらのプロトコルのサポートはデバイスによって異なります(たとえば、Android とウェブでは HLS と DASH が サポートされますが、iOS では HLS のみがサポートされます)。これらのプロトコルの出力は、CENC 標準(ISO-BMFF フラグメントの場合は ISO/IEC 23001-7:2016)を使用して暗号化されます。特に、暗号化スキームは AES-128 CTR である必要があります。

Apple FairPlay では HLS プロトコルが使用されます。このプロトコルの出力は SAMPLE-AES CBC を使用して暗号化されます。この出力の詳細については、HTTP Live Streaming の MPEG-2 ストリーム暗号化形式をご覧ください。

コンテンツの保護

AES-128 は DASH または HLS をサポートし、CTR または CBC モードを使用して暗号化されます。

出力コンテナを選択する

Transcoder API は次のコンテナをサポートしています。

  • TS(AES-128 CBC スキームを使用):
    • HLS(SAMPLE-AES を使用)
    • HLS(AES-128 CTR または AES-128 CBC を使用)
  • fMP4:
    • HLS
      • SAMPLE-AES
    • DASH
      • MPEG-CENC
      • スキーム: AES-128 CTR または AES-128 CBC

多重化出力ストリームを作成する

出力構成をジョブ構成の muxStreams リストに追加します。Encryption オブジェクトを使用して暗号化設定を構成します。

以下に、TS 出力ファイル コンテナの REST/JSON の例を示します。

"muxStreams": [
  {
    "key": "360p-my-video-ts",
    "fileName": "360p-my-video.ts",
    "container": "ts",
    "elementaryStreams": [
      "video-stream0",
      "audio-stream0"
    ],
    "encryption": {
      "key": "aabbccddeeff11223344556677889900",
      "iv": "00112233445566778899aabbccddeeff",
      "sampleAes": {
        "keyUri": "skd://00112233445566778899aabbccddeeff"
      }
    }
  }
]

以下に、fMP4 出力コンテナの REST/JSON の例を示します。

"muxStreams": [
  {
    "key": "360p-my-video-fmp4",
    "container": "fmp4",
    "elementaryStreams": [
      "video-stream0"
    ],
    "fileName": "360p-my-video.fmp4",
    "encryption": {
      "key": "aabbccddeeff11223344556677889900",
      "iv": "00112233445566778899aabbccddeeff",
      "sampleAes": {
        "keyUri": "skd://00112233445566778899aabbccddeeff"
      }
    }
  },
  {
    "key": "360p-my-audio-fmp4",
    "container": "fmp4",
    "elementaryStreams": [
      "audio-stream0"
    ],
    "fileName": "360p-my-audio.fmp4",
    "encryption": {
      "key": "aabbccddeeff11223344556677889900",
      "iv": "00112253445566778899aabbccddeeff",
      "sampleAes": {
        "keyUri": "skd://00112233445566778899aabbccddeeff"
      }
    }
  }
]

出力ストリームをマニフェスト ファイルに追加する

以下に、TS 出力ファイル コンテナの REST/JSON の例を示します。

"manifests": [
  {
    "fileName": "manifest.m3u8",
    "type": "HLS",
    "muxStreams": [
      "360p-my-video-ts"
    ]
  }
]

以下に、fMP4 出力コンテナの REST/JSON の例を示します。

"manifests": [
  {
    "fileName": "main-cbcs.mpd",
    "type": "DASH",
    "muxStreams": [
      "360p-my-audio-fmp4",
      "360p-my-video-fmp4"
    ]
  }
]

v1 構成への移行

非公開プレビュー ジョブの構成を更新して v1 暗号化形式をサポートするには、このセクションの手順を行います。

従来の暗号化構成では、muxStreams フィールド自体に mux ストリームの暗号化の詳細が表示されます(以下をご覧ください)。

{
  ...
  "muxStreams": [
    {
      "key": "360p-my-video-ts",
      "fileName": "360p-my-video.ts",
      "container": "ts",
      "elementaryStreams": [
        "video-stream0",
        "audio-stream0"
      ],
      "encryption": {
        "key": "aabbccddeeff11223344556677889900",
        "iv": "10314849f4a110ad4abacdb6f5f4b86f",
        "sampleAes": {
          "keyUri": "skd://10314849f4a110ad4abacdb6f5f4b86f"
        }
      }
    },
    {
      "key": "360p-my-video-fmp4",
      "container": "fmp4",
      "elementaryStreams": [
        "video-stream0"
      ],
      "fileName": "360p-my-video.fmp4",
      "encryption": {
        "key": "11223344556677889900aabbccddeeff",
        "iv": "179b08b91372aa26e0763e87743db388",
        "mpegCenc": {
          "keyId": "skd://179b08b91372aa26e0763e87743db388",
          "scheme": "cenc"
        }
      }
    },
    {
      "key": "360p-my-audio-fmp4",
      "container": "fmp4",
      "elementaryStreams": [
        "audio-stream0"
      ],
      "fileName": "360p-my-audio.fmp4",
      "encryption": {
        "key": "11223344556677889900aabbccddeeff",
        "iv": "179b08b91372aa26e0763e87743db388",
        "mpegCenc": {
          "keyId": "skd://179b08b91372aa26e0763e87743db388",
          "scheme": "cenc"
        }
      }
    }
  ]
  ...
}

暗号化設定は、次の 2 つの部分に分かれています。

  1. 暗号鍵: 鍵が Secret Manager に格納されるようになりました
  2. 暗号化構成と設定: ジョブ構成の新しいフィールドになりました

非公開プレビューの暗号化設定を v1 形式に更新するには、次の手順を行います。

  1. 従来のジョブ構成に含まれる暗号鍵を含むシークレットを作成します。シークレットのリソース ID をメモします。詳細については、Secret Manager に暗号鍵を追加するをご覧ください。

    ...
    {
      "encryptionKeys": [
        {
          "key": "aabbccddeeff11223344556677889900",
          "keyId": "10314849f4a110ad4abacdb6f5f4b86f",
          "keyUri": "skd://10314849f4a110ad4abacdb6f5f4b86f",
          "iv": "10314849f4a110ad4abacdb6f5f4b86f",
          "matchers": [
            {
              "muxStreams": [
                "360p-my-video-ts"
              ]
            }
          ]
        },
        {
          "key": "11223344556677889900aabbccddeeff",
          "keyId": "179b08b91372aa26e0763e87743db388",
          "keyUri": "skd://179b08b91372aa26e0763e87743db388",
          "iv": "179b08b91372aa26e0763e87743db388",
          "matchers": [
            {
              "muxStreams": [
                "360p-my-video-fmp4",
                "360p-my-audio-fmp4"
              ]
            }
          ]
        }
      ]
    }
    ...
    
  2. 従来のジョブ構成から暗号化設定ごとに暗号化フィールドのメッセージを作成します。詳細については、ジョブを作成するをご覧ください。

    ...
    "encryptions": [
        {
          "id": "ts_sampleaes",
          "secretManagerKeySource": { // resource for the secret created in the preceding step
            "secretVersion": "projects/{project}/secrets/{secret_id}/versions/{version_number}"
          },
          "drmSystems": {
            "fairplay": {}
          },
          "sampleAes": {}
        },
        {
          "id": "fmp4_mpegcenc_cenc",
          "secretManagerKeySource": { // resource for the secret created in the preceding step
            "secretVersion": "projects/{project}/secrets/{secret_id}/versions/{version_number}"
          },
          "drmSystems": {
            "widevine": {},
            "playready": {}
          },
          "mpegCenc": {
            "scheme": "cbcs"
          }
        }
      ]
    ...
    
  3. muxStreams の mux ストリームを更新するには、暗号化フィールドを削除し、代わりに前の手順で作成した暗号化設定の encryptionId を使用します。

    {
      ...
      "muxStreams": [
        {
          "key": "360p-my-video-ts",
          "fileName": "360p-my-video.ts",
          "container": "ts",
          "elementaryStreams": [
            "video-stream0",
            "audio-stream0"
          ],
          "encryptionId": "ts_sampleaes"
        },
        {
          "key": "360p-my-video-fmp4",
          "container": "fmp4",
          "elementaryStreams": [
            "video-stream0"
          ],
          "fileName": "360p-my-video.fmp4",
          "encryptionId": "fmp4_mpegcenc_cenc"
        },
        {
          "key": "360p-my-audio-fmp4",
          "container": "fmp4",
          "elementaryStreams": [
            "audio-stream0"
          ],
          "fileName": "360p-my-audio.fmp4",
          "encryptionId": "fmp4_mpegcenc_cenc"
        }
      ]
      ...
    }
    

詳しくは、コード変換されたコンテンツを暗号化するをご覧ください。