Learn how to use the Shaka Packager to package your media for Studio DRM.
The Shaka Packager is a media packaging and development framework for VOD and Live DASH and HLS applications, supporting Common Encryption for Widevine and other DRM Systems.
Implementing Studio DRM with the Shaka Packager
- Pull and run the Shaka Packager.
docker pull google/shaka-packager
docker run -v /<file_path_to_content>/:/media -it --rm google/shaka-packager
- Test the packager setup.
packager input=/media/<name_of_content>.mp4 --dump_stream_info
File "/media/test.mp4":
Found 1 stream(s).
Stream [0] type: Video
codec_string: avc1.640028
time_scale: 12288
duration: 17078784 (1389.9 seconds)
is_encrypted: false
codec: H264
width: 1920
height: 810
pixel_aspect_ratio: 1:1
trick_play_factor: 0
nalu_length_size: 4
Packaging completed successfully.
- Retrieve a CPIX document for necessary DRM providers. The CPIX document gives the Shaka Packager the necessary information to encrypt your media.
curl -X GET https://cpix.vudrm.tech/v1/cpix/{client}/{content_id} \
-H 'API-KEY: {api_key}'
<?xml version="1.0" encoding="UTF-8"?>
<cpix:CPIX xmlns:pskc="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:xsi="urn:ietf:params:xml:ns:keyprov:pskc" xmlns:cpix="urn:dashif:org:cpix" xsi:schemaLocation="urn:dashif:org:cpix cpix.xsd">
<cpix:ContentKeyList>
<cpix:ContentKey kid="11111111-1111-1111-1111-111111111111" explicitIV="MjlkMzNlYzVjYWIyZmRmZg==" commonEncryptionScheme="cenc">
<cpix:Data>
<pskc:Secret>
<pskc:PlainValue>3wFFjPspsydY/t2uSPeE6w==</pskc:PlainValue>
</pskc:Secret>
</cpix:Data>
</cpix:ContentKey>
</cpix:ContentKeyList>
<cpix:DRMSystemList>
<cpix:DRMSystem kid="11111111-1111-1111-1111-111111111111" systemId="9a04f079-9840-4286-ab92-e65be0885f95">
<cpix:PSSH><PlayReady_PSSH></cpix:PSSH>
</cpix:DRMSystem>
<cpix:DRMSystem kid="22222222-2222-2222-22222-22222222222" systemId="edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cpix:PSSH><Widevine_PSSH></cpix:PSSH>
</cpix:DRMSystem>
<cpix:DRMSystem kid="33333333-3333-3333-33333-33333333333" systemId="94ce86fb-07ff-4f43-adb8-93d2fa968ca2">
<cpix:URIExtXKey><FairPlay_URIExtXKey</cpix:URIExtXKey>
<cpix:HLSSignalingData playlist="master"><master_playlist_value></cpix:HLSSignalingData>
<cpix:HLSSignalingData playlist="media"><media_playlist_value></cpix:HLSSignalingData>
</cpix:DRMSystem>
</cpix:DRMSystemList>
<cpix:ContentKeyUsageRuleList></cpix:ContentKeyUsageRuleList>
</cpix:CPIX>
- Send a request to Shaka Packager to encrypt and package your content. The values returned in the CPIX document must be in the request sent to Shaka Packager.
(Widevine) Shaka Packager requires the pssh to be in Hex format. To convert the
Widevine_PSSH
from the CPIX document from Base64 format to Hex format, run the following command:echo '<Widevine_PSSH>' | od -A n -t x1 | sed 's/ *//g'
.
packager \
in=media/<name-of-content>.mp4,stream=audio,output=media/<name-of-output-content>.mp4,drm_label=AUDIO \
in=media/<name-of-content>.mp4,stream=video,output=media/<name-of-output-content>.mp4,drm_label=VIDEO \
--protection_scheme cbcs \
--enable_raw_key_encryption \
--keys label=AUDIO:key_id=<key_id_hex_value>:key=<content_key_hex_value>,label=VIDEO:key_id=<key_id_hex_value>:key=<content_key_hex_value> \
--protection_systems FairPlay \
--iv <iv_hex_value> \
--hls_master_playlist_output media/<name-of-manifest>.m3u8 \
--hls_key_uri <fairplay_laurl_value>
packager \
in=/media/<name-of-content>.mp4,stream=audio,output=/media/<name-of-output-content>.mp4,drm_label=AUDIO \
in=/media/<name-of-content>.mp4,stream=video,output=/media/<name-of-output-content>.mp4,drm_label=VIDEO \
--enable_raw_key_encryption \
--keys label=AUDIO:key_id=<key_id_hex_value>:key=<content_key_hex_value>,label=VIDEO:key_id=<key_id_hex_value>:key=<content_key_hex_value> \
--pssh <Widevine_PSSH> \
--protection_systems Widevine,PlayReady \
--mpd_output /media/<name-of-manifest>.mpd
If you upload your packaged files and manifest to AWS S3 or an equivalent hosting service, you can test your packaged content with this stream tester.
Stream Tester
Validate your Studio DRM-protected stream in web environments using the JWP Stream Tester.