Bitmovin 인코더 연동 가이드
개요
본 문서는 Bitmovin 인코딩 서비스 이용 시 PallyCon KMS(Key Management Server)와의 CPIX 또는 SPEKE API 연동을 통해 멀티 DRM 콘텐츠 패키징을 연동하는 방법을 설명합니다.
요구사항
- Bitmovin 인코딩 서비스 상용 계정: DRM 연동 API 권한 필요
- Bitmovin 인코딩 SDK 사용
- PallyCon 멀티 DRM 서비스 계정: 트라이얼 또는 상용 계정
DRM 패키징 프로세스
Bitmovin SPEKE API 연동 시
Bitmovin 인코더에서 지원하는 SPEKE 연동 API를 사용하면, PallyCon KMS 서버와의 API 연동이 Bitmovin 인코더 내부에서 처리되기 때문에 간단한 설정만으로 DRM 패키징이 가능합니다. 다만 현재 Bitmovin 인코더가 SPEKE API v1 규격만을 지원하여 SPEKE v2에서 지원되는 멀티키 패키징은 적용할 수 없습니다.
sequenceDiagram
participant A as 콘텐츠 서비스 사이트
participant B as Bitmovin 인코딩 서비스
participant C as PallyCon KMS
A -->> A: 인코딩 작업 설정 (원본 콘텐츠와 결과물 출력 스토리지)
A ->> B: SpekeDrm 객체를 이용해 DRM 패키징 작업 생성 (KMS URL, Content ID 입력)
B ->> C: PallyCon KMS에 SPEKE API로 Key/Kid 요청
C -->> C: CID에 대한 Key/Kid 생성 및 저장
C ->> B: Key/Kid 전달
B -->> B: DASH 또는 HLS 패키징 (DRM 암호화 적용)
B ->> A: 출력 스토리지에 패키징 결과물 저장
PallyCon CPIX API 연동 시
CPIX API로 연동하는 경우, PallyCon KMS 서버와의 API 통신이 Bitmovin 인코더 외부에서 처리되고 해당 결과물(KEY, KID 등)을 Bitmovin 인코더에 입력해 DRM 패키징을 진행합니다. 본 문서에 링크된 샘플을 이용하면 별도의 CPIX API 구현 없이도 해당 연동이 가능합니다.
sequenceDiagram
participant A as 콘텐츠 서비스 사이트
participant B as Bitmovin 인코딩 서비스
participant C as PallyCon KMS
A -->> A: 패키징 작업 설정 (원본 콘텐츠와 결과물 출력 스토리지 설정)
A ->> C: CPIX 클라이언트 모듈을 통해 Key와 Kid(KeyID) 요청 (Content ID 입력)
C -->> C: CID에 대한 Key/Kid 생성 및 저장
C ->> A: Key/Kid 전달
A ->> B: CencDrm 객체를 이용해 DRM 패키징 작업 생성 (Key, Kid 입력)
B -->> B: DASH 또는 HLS 패키징 (DRM 암호화 적용)
B ->> A: 출력 스토리지에 패키징 결과물 저장
방식 별 연동 설정
연동 방식 1 - Bitmovin SPEKE API 사용
이 방식은 Bitmovin 인코더 자체적으로 지원하는 SPEKE API를 사용합니다. 멀티키 지원이 필요한 경우가 아니라면 SPEKE 방식의 연동을 권장합니다.
Bitmovin 개발자 가이드의 SPEKE 연동 문서를 참고해 다음의 Java 코드와 같이 SpekeDrmProvider 객체를 생성합니다.
SpekeDrmProvider spekeDrmProvider = new SpekeDrmProvider();
spekeDrmProvider.setUrl("https://kms.pallycon.com/v1/cpix/getKey?enc-token=YOUR-KMS-TOKEN");
setUrl
함수 파라미터로 위 코드와 같은 PallyCon SPEKE v1 URL을 입력합니다.- 해당 URL의 enc-token 파라미터 값으로 PallyCon 서비스 가입 시 발급되는
KMS 토큰
값을 YOUR-KMS-TOKEN 부분에 입력합니다. - KMS 토큰 값으로 URL 접근에 대한 인증이 처리되므로, 해당 객체에
setUsername
,setPassword
,setRoleArn
과 같은 별도의 인증 데이터는 설정할 필요가 없습니다.
인코딩 및 패키징 작업에 사용될 DRM 유형에 따라 다음의 예제와 같이 SpekeDrm
객체를 생성하고 설정합니다.
// one SPEKE config for Widevine and PlayReady
SpekeDrm spekeDrmCenc = new SpekeDrm();
spekeDrmCenc.setProvider(spekeDrmProvider);
spekeDrmCenc.setContentId("my-unique-content-id");
spekeDrmCenc.setSystemIds(
Arrays.asList("edef8ba9-79d6-4ace-a3c8-27dcd51d21ed", "9a04f079-9840-4286-ab92-e65be0885f95"));
// another SPEKE config for FairPlay
SpekeDrm spekeDrmFairplay = new SpekeDrm();
spekeDrmFairplay.setProvider(spekeDrmProvider);
spekeDrmFairplay.setContentId("my-unique-content-id");
spekeDrmFairplay.setSystemIds(
Arrays.asList("94ce86fb-07ff-4f43-adb8-93d2fa968ca2"));
my-unique-content-id
값으로는 대상 콘텐츠의 고유 ID 값을 임의로 입력합니다.setSystemIds
함수의 파라미터는 각 DRM 별 시스템 ID 값을 리스트로 입력합니다.
SPEKE API를 통한 Bitmovin 인코더 연동 세부 사항은 위에 링크된 Bitmovin 개발자 문서를 참고하시기 바랍니다.
연동 방식 2 - PallyCon CPIX API 사용
이 방식은 PallyCon에서 지원하는 CPIX API 클라이언트를 사용합니다.
1단계 - CPIX API 클라이언트 실행
다음의 Github 저장소에서 PallyCon CPIX API 클라이언트 모듈과 예제를 다운로드합니다.
PallyCon CPIX API 클라이언트 Github 저장소개발 언어 별 예제와 관련 가이드를 참고해 CPIX API 요청을 수행하고 결과 값을 확인합니다.
2단계 - API 응답 데이터를 Bitmovin 인코더에 설정
1단계에서 획득한 CPIX 응답 JSON 데이터에서 다음의 값들을 파싱해 아래와 같은 Bitmovin 인코더 연동 코드에 입력합니다.
key_id_hex
,key_hex
,iv_hex
: Key ID(KID)와 Key, IV 값 모두 32자리 16진수 값을 사용합니다.pssh_payload_only
: Widevine 또는 PlayReady 용 PSSH으로, 헤더가 제외된 payload 데이터를 사용합니다.
private static CencDrm createDrmConfig(
Encoding encoding, Muxing muxing, Output output, String outputPath) throws BitmovinException {
CencDrm cencDrm = new CencDrm();
cencDrm.addOutputsItem(buildEncodingOutput(output, outputPath));
cencDrm.setKey("cab5b529ae28d5cc5e3e7bc3fd4a544d");
cencDrm.setKid("08eecef4b026deec395234d94218273d");
CencWidevine widevineDrm = new CencWidevine();
widevineDrm.setPssh("QWRvYmVhc2Rmc2FkZmFzZg==");
cencDrm.setWidevine(widevineDrm);
CencPlayReady playReadyDrm = new CencPlayReady();
playReadyDrm.setLaUrl("https://license-global.pallycon.com/ri/licenseManager.do");
//playReadyDrm.setPssh("QWRvYmVhc2Rmc2FkZmFzZg==");
cencDrm.setPlayReady(playReadyDrm);
CencFairPlay cencFairPlay = new CencFairPlay();
cencFairPlay.setIv("e7fada52ac654bbe80367505dceeb318");
cencFairPlay.setUri("skd://y7w4trUNq1P4Jj4Gtzgqow==");
cencDrm.setFairPlay(cencFairPlay);
return bitmovinApi.encoding.encodings.muxings.fmp4.drm.cenc.create(
encoding.getId(), muxing.getId(), cencDrm);
}
CPIX API를 통한 Bitmovin 인코더 연동 세부 사항은 Bitmovin 개발자 문서를 참고하시기 바랍니다.