Search

Shaka Packager구성하기

Shaka Packager 공식 GIT 주소

shaka-packager
shaka-project

왜 Shaka Packager인가??

암호화작업을 구성하기 위해서는 DRM엔진을 사용해야되는데, 여러가지 서비스들이 있다. 1. 구글의 Widevine 2. 마이크로 소프트의 PlayReady 3. 애플의 FairPlay 4. 인터트러스트의 Marlin 같은 곳에서 암호화 인증 시스템같은 것을 가지고 있고, 라이센스를 발급해주는데 이러한 프로토콜을 지원하는 영상 플레이어를 사용해야 암호화가 가능하다. 그리고 위의 목록은 기술을 지원해주는 곳이라고 보면되고, 여기서의 기술로 서비스를 해주는 업체를 통해서 라이센스를 발급받는다. 그래서 우리가 직접 사용하는 것은 아니고 아니고 제 3자를 통해서 해당 기술들을 간접적으로 이용하게 되는 것인데, 보통 비용이 한 달에 30만원 정도 발생한다. 그냥 테스트 프로젝트인데,, 30만원 쓰기에는 너무 아깝고, 그리고 그냥 서비스를 이용하는 것은 또 공부가 안되고 하니까, 라이센스 서버를 직접 구성하는 방법을 고민해 볼 수 있는데, 사용자가 암호화 하고 복호화 하는 옵션도 제공해 주는 것이 Shaka Packager이다. 그래서 이번 프로젝트에서 이걸 사용해 보았다.

프로젝트 적용하기

Readme를 읽어보면 Shaka Packager를 구성하는 방법이 있는데, 1. Docker로 이미지를 띄우는 방법 2. prebuilt로 설치된 버전의 바이너리를 exe파일로 사용하는 방법 3. 프로젝트 내에서 build하여 사용하는 방법 2번이 제일 간편하다. 2번 쓰자. 아까부터 이야기 했지만. 그래서 release를 클릭해서 들어가보자. releases
다운로드 받은 exe파일을 이동시킨다. 뭐 내키는 곳에 이동시키면 되는데, 나는 resources >> bin >> 내부에 파일을 이동 시켰다. 실행시키지말자 그냥 저렇게 있으면 된다.

환경변수로 패키지 경로 설정하기

자 이렇게 service 내부에서 경로를 이렇게 가져올 수 있는데, 이것도 절차가 좀 많긴하다.

@Value 사용하기

@Value어노테이션을 사용하면 .env 파일의 변수를 가져와 쓸 수 있다. 현재 @Value(”${SHAKA_PACKAGER_PATH}”) 라고 되어있는데 이것에 대한 정의 아래처럼 env파일에 설정이 되어있다.
Shaka 암호화 명령어를 넣을 때, 바이너리 파일의 프로젝트 루트의 경로를 요구하는데 프로젝트 내부의 src 로 부터 시작하는 상대경로이다. 이 경로를 따로 이렇게 설정해서 환경변수로 사용할 수 있게 만들면 편하다.

env설정

implementation 'io.github.cdimascio:java-dotenv:5.2.2'
JavaScript
복사
해당 의존성을 build.gradle에 추가한다.
SHAKA_PACKAGER_PATH=src/main/resources/bin/packager-win-x64.exe
JavaScript
복사
.env 파일을 루트 디렉토리에 생성하고 위의 경로를 변수명과 함께 적어 넣는다.
// .env 파일에서 환경 변수 설정 Dotenv dotenv = Dotenv.load(); // .env 파일에서 환경 변수 설정 dotenv.entries().forEach(entry -> System.setProperty(entry.getKey(), entry.getValue()));
JavaScript
복사
그 다음 프로젝트 메인 메소드가 run되기 전에 Dotenv를 로드해주면 사용할 수 있다. 그럼 @Value로 env파일의 내부 변수를 가져다 쓸수 있다.

암호화 패키징

// 예시 명령문 shaka-packager \ in=/path/to/directory/baseFileName_480p.mp4,stream=video,init_segment=/path/to/directory/baseFileName_init_480p.m4s,segment_template=/path/to/directory/baseFileName_chunk_480p_$Number%05d$.m4s \ --enable_raw_key_encryption \ --keys label=:key_id=YOUR_KEY_ID:key=YOUR_CONTENT_KEY \ --mpd_output /path/to/directory/baseFileName.mpd \ --segment_duration 4
JavaScript
복사
이것이 암호화 패키징 단계에서 사용할 명령문인데 shaka-packager \ 이 부분에 아까 설정한 환경변수가 들어가게 되는 것이다.
그리고 이 부분에는 내가 직접 설정한 KeyID와 ContentKey를 설정하여 넣어준다. 이제 암호화 패키징이 되면 해당 KeyID와 ContentKey가 있어야지 영상이 재생이 된다. 이 한 쌍을 이제 라이센스라고 부르겠다. Shaka Packager를 사용할려면 지정된 형태에 맞는 라이센스가 필요하다. 그 지정된 형태란 32자리로 이루어진 문자열이다.
KEY_ID=1234567890abcdef1234567890abcdef CONTENT_KEY=fedcba0987654321fedcba0987654321
JavaScript
복사
이런 형태로 암호화 문자열을 요구하는데, 나는 임의로 그냥 적어 넣은거고 이것의 보안을 놓이려면 해당 문자열을 해시화해서 사용해도 좋을 것이다.

생성된 파일의 형태 확인

이렇게 암호화 패키징을 하면 Shaka Packager가 설정된 프로토콜로 매나페스트 파일과 세그먼트 파일을 생성해준다. 그래서 ffmpeg로도 세그먼트화 할 수 있지만, 암호화까지 사용할려면 ffmpeg는 인코딩만하고 shaka packager가 세그먼트화 할 수 있게 해야된다.
클릭해서 들어가보면 Assets라는 항목에 보면 여러가지 버전이 있는데, 각자의 환경에 맞게 다운받으면 된다. 근데 실행시킬 필요는 없다. prebuilt는 설치된 바이너리를 그대로 가지고 있는거라서, 그대로 사용하는 방식이다. 다운로드를 받는다.