为数字版权管理和内容保护配置加密

为了支持数字版权管理 (DRM) 和内容保护,请使用 Transcoder API 配置输出视频的加密。当前版本的 Transcoder API 支持通过 Google Widevine 和 Microsoft PlayReady 提供的常见加密 (CENC) DRM,以及 Apple FairPlay DRM 和 AES-128 内容保护。Transcoder API 仅负责加密内容。

准备工作

在将内容上传到 Transcoder API 进行加密之前,您需要生成并存储 128 位随机密钥(32 位十六进制字符)。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 支持通过基于 HTTP 的动态自适应流式传输 (DASH) 和 HTTP Live Streaming (HLS) 协议。这些协议的设备支持各不相同(例如,Android 和 Web 应用支持 HLS 和 DASH,但 iOS 仅支持 HLS)。这些协议的输出均使用 CENC 标准(ISO/IEC 23001-7:2016 用于 ISO-BMFF 片段)加密。 特别是,加密方案必须是 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 字段本身中提供多路复用流的加密详细信息(请参阅下文):

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

加密设置现在分为以下两部分:

  1. 加密密钥:密钥现在存储在 Secret Manager 中
  2. 加密配置和设置:这些现在是作业配置中的新字段

按照以下步骤将非公开预览版加密设置更新为 v1 格式。

  1. 创建一个 Secret,其中包含旧版作业配置中包含的加密密钥。记下密钥的资源 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 中的多路复用流,方法是移除加密字段,并改用在上一步中创建的加密设置的 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"
        }
      ]
      ...
    }
    

如需了解详情,请参阅加密转码内容