为了支持数字版权管理 (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
- HLS
创建多路复用输出流
将输出流添加到作业配置的 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"
}
}
}
]
...
}
加密设置现在分为以下两部分:
- 加密密钥:密钥现在存储在 Secret Manager 中
- 加密配置和设置:这些现在是作业配置中的新字段
按照以下步骤将非公开预览版加密设置更新为 v1 格式。
创建一个 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" ] } ] } ] } ...
为旧版作业配置中的每个加密设置创建一条加密字段消息。如需了解详情,请参阅创建作业。
... "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" } } ] ...
更新
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" } ] ... }
如需了解详情,请参阅加密转码内容。