디지털 권한 관리(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는 HTTP 동적 적응형 스트리밍(DASH) 및 HTTP 실시간 스트리밍(HLS) 프로토콜을 모두 지원합니다. 이러한 프로토콜에 대한 기기 지원은 다양합니다(예: HLS 및 DASH는 Android 및 웹에서 지원되지만 iOS에서는 HLS만 지원됨). 이러한 프로토콜의 출력은 CENC 표준(ISO/IEC 23001-7:2016 for ISO-BMFF 프래그먼트)을 사용하여 암호화됩니다. 특히 암호화 스키마는 AES-128 CTR이어야 합니다.
Apple FairPlay는 HLS 프로토콜을 사용합니다. 이 프로토콜의 출력은 SAMPLE-AES CBC를 사용하여 암호화됩니다. 이 출력에 대한 자세한 내용은 HTTP 실시간 스트리밍용 MPEG-2 스트림 암호화 형식을 참조하세요.
콘텐츠 보호
AES-128은 DASH 또는 HLS를 지원하며 CTR 또는 CBC 모드를 사용하여 암호화됩니다.
출력 컨테이너 선택
Transcoder API는 다음 컨테이너를 지원합니다.
- TS(AES-128 CBC 스키마 사용):
- SAMPLE-AES를 포함하는 HLS
- (AES-128 CTR 또는 AES-128 CBC)를 포함하는 HLS
- 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
필드 자체에서 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"
}
}
}
]
...
}
이제 암호화 설정이 다음과 같이 두 부분으로 나뉩니다.
- 암호화 키: 이제 키가 Secret Manager에 저장됩니다.
- 암호화 구성 및 설정: 작업 구성의 새 필드입니다.
다음 단계에 따라 비공개 미리보기 암호화 설정을 v1 형식으로 업데이트합니다.
기존 작업 구성에 포함된 암호화 키를 포함하는 보안 비밀을 만듭니다. 보안 비밀의 리소스 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" } } ] ...
암호화 필드를 삭제하고 대신 이전 단계에서 만든 암호화 설정의
encryptionId
를 사용하여muxStreams
에서 mux 스트림을 업데이트합니다.{ ... "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" } ] ... }
자세한 내용은 트랜스코딩된 콘텐츠 암호화를 참조하세요.