2018-02-10 23:37:42 +00:00
2017-09-20 02:35:05 +00:00
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" / >
2018-08-16 00:35:22 +00:00
< title > Using Widevine Key Server — Shaka Packager documentation< / title >
2017-09-20 02:35:05 +00:00
< link rel = "stylesheet" href = "../_static/sphinxdoc_new.css" type = "text/css" / >
< link rel = "stylesheet" href = "../_static/pygments.css" type = "text/css" / >
< link rel = "stylesheet" href = "../_static/table_styling.css" type = "text/css" / >
< script type = "text/javascript" >
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
VERSION: '',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
< / script >
< script type = "text/javascript" src = "../_static/jquery.js" > < / script >
< script type = "text/javascript" src = "../_static/underscore.js" > < / script >
< script type = "text/javascript" src = "../_static/doctools.js" > < / script >
2018-02-10 23:37:42 +00:00
< script type = "text/javascript" src = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML" > < / script >
2017-09-20 02:35:05 +00:00
< link rel = "index" title = "Index" href = "../genindex.html" / >
< link rel = "search" title = "Search" href = "../search.html" / >
2018-08-16 00:35:22 +00:00
< link rel = "next" title = "Using PlayReady Key Server" href = "playready.html" / >
< link rel = "prev" title = "Using Raw Key" href = "raw_key.html" / >
2017-09-20 02:35:05 +00:00
< / head >
2018-02-10 23:37:42 +00:00
< body >
2017-09-20 02:35:05 +00:00
< div class = "related" role = "navigation" aria-label = "related navigation" >
< h3 > Navigation< / h3 >
< ul >
< li class = "right" style = "margin-right: 10px" >
< a href = "../genindex.html" title = "General Index"
accesskey="I">index< / a > < / li >
< li class = "right" >
2018-08-16 00:35:22 +00:00
< a href = "playready.html" title = "Using PlayReady Key Server"
2017-09-20 02:35:05 +00:00
accesskey="N">next< / a > |< / li >
< li class = "right" >
2018-08-16 00:35:22 +00:00
< a href = "raw_key.html" title = "Using Raw Key"
2017-09-20 02:35:05 +00:00
accesskey="P">previous< / a > |< / li >
< li class = "nav-item nav-item-0" > < a href = "../index.html" > Shaka Packager documentation< / a > » < / li >
< li class = "nav-item nav-item-1" > < a href = "tutorials.html" > Tutorials< / a > » < / li >
< li class = "nav-item nav-item-2" > < a href = "drm.html" accesskey = "U" > DRM< / a > » < / li >
< / ul >
< / div >
< div class = "sphinxsidebar" role = "navigation" aria-label = "main navigation" >
< div class = "sphinxsidebarwrapper" >
< h3 > < a href = "../index.html" > Table Of Contents< / a > < / h3 >
< ul >
2018-08-16 00:35:22 +00:00
< li > < a class = "reference internal" href = "#" > Using Widevine Key Server< / a > < ul >
2017-09-20 02:35:05 +00:00
< li > < a class = "reference internal" href = "#synopsis" > Synopsis< / a > < / li >
< li > < a class = "reference internal" href = "#examples" > Examples< / a > < / li >
< li > < a class = "reference internal" href = "#widevine-test-credential" > Widevine test credential< / a > < ul >
2018-02-10 23:37:42 +00:00
< li > < a class = "reference internal" href = "#drm-related-stream-descriptor-fields" > DRM related Stream descriptor fields< / a > < / li >
< li > < a class = "reference internal" href = "#general-encryption-options" > General encryption options< / a > < / li >
2017-09-20 02:35:05 +00:00
< li > < a class = "reference internal" href = "#widevine-encryption-options" > Widevine encryption options< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< / ul >
< h4 > Previous topic< / h4 >
< p class = "topless" > < a href = "raw_key.html"
2018-08-16 00:35:22 +00:00
title="previous chapter">Using Raw Key< / a > < / p >
2017-09-20 02:35:05 +00:00
< h4 > Next topic< / h4 >
< p class = "topless" > < a href = "playready.html"
2018-08-16 00:35:22 +00:00
title="next chapter">Using PlayReady Key Server< / a > < / p >
2017-09-20 02:35:05 +00:00
< div role = "note" aria-label = "source link" >
< h3 > This Page< / h3 >
< ul class = "this-page-menu" >
< li > < a href = "../_sources/tutorials/widevine.rst.txt"
rel="nofollow">Show Source< / a > < / li >
< / ul >
< / div >
< div id = "searchbox" style = "display: none" role = "search" >
< h3 > Quick search< / h3 >
< form class = "search" action = "../search.html" method = "get" >
< div > < input type = "text" name = "q" / > < / div >
< div > < input type = "submit" value = "Go" / > < / div >
< input type = "hidden" name = "check_keywords" value = "yes" / >
< input type = "hidden" name = "area" value = "default" / >
< / form >
< / div >
< script type = "text/javascript" > $ ( '#searchbox' ) . show ( 0 ) ; < / script >
< / div >
< / div >
< div class = "document" >
< div class = "documentwrapper" >
< div class = "bodywrapper" >
< div class = "body" role = "main" >
2018-08-16 00:35:22 +00:00
< div class = "section" id = "using-widevine-key-server" >
< h1 > Using Widevine Key Server< a class = "headerlink" href = "#using-widevine-key-server" title = "Permalink to this headline" > ¶< / a > < / h1 >
< p > The easiest way to generate Widevine protected content is to use Widevine Cloud
Service.< / p >
< p > Shaka Packager can talk to Widevine Cloud Service or any key server that
implements < a class = "reference external" href = "http://bit.ly/2vTG4oo" > Common Encryption API for Widevine DRM< / a > to
fetch encryption keys.< / p >
2017-09-20 02:35:05 +00:00
< div class = "section" id = "synopsis" >
< h2 > Synopsis< a class = "headerlink" href = "#synopsis" title = "Permalink to this headline" > ¶< / a > < / h2 >
2018-08-16 00:35:22 +00:00
< p > Widevine Common Encryption API supports request validation using either AES or
RSA.< / p >
2017-09-20 02:35:05 +00:00
< p > AES signing:< / p >
2018-05-23 23:12:00 +00:00
< div class = "highlight-default" > < div class = "highlight" > < pre > < span > < / span > $ packager < stream_descriptor> ... \
2017-09-20 02:35:05 +00:00
--enable_widevine_encryption \
--key_server_url < key_server_url> \
--content_id < content_id> \
--signer < signer> --aes_signing_key < aes_signing_key> \
--aes_signing_iv < aes_signing_iv> \
[Other options, e.g. DASH options, HLS options]
< / pre > < / div >
< / div >
< p > RSA signing:< / p >
2018-05-23 23:12:00 +00:00
< div class = "highlight-default" > < div class = "highlight" > < pre > < span > < / span > $ packager < stream_descriptor> ... \
2017-09-20 02:35:05 +00:00
--enable_widevine_encryption \
--key_server_url < key_server_url> \
--content_id < content_id> \
--signer < signer> --rsa_signing_key_path < rsa_signing_key_path> \
[Other options, e.g. DASH options, HLS options]
< / pre > < / div >
< / div >
< / div >
< div class = "section" id = "examples" >
< h2 > Examples< a class = "headerlink" href = "#examples" title = "Permalink to this headline" > ¶< / a > < / h2 >
2018-08-16 00:35:22 +00:00
< p > The examples below use the H264 streams created in < a class = "reference internal" href = "encoding.html" > < span class = "doc" > Media Encoding< / span > < / a > .< / p >
2018-02-10 23:37:42 +00:00
< ul >
2018-08-16 00:35:22 +00:00
< li > < p class = "first" > Example with both DASH and HLS output:< / p >
2017-09-20 02:35:05 +00:00
< div class = "highlight-default" > < div class = "highlight" > < pre > < span > < / span > $ packager \
in=h264_baseline_360p_600.mp4,stream=audio,output=audio.mp4 \
in=h264_baseline_360p_600.mp4,stream=video,output=h264_360p.mp4 \
in=h264_main_480p_1000.mp4,stream=video,output=h264_480p.mp4 \
in=h264_main_720p_3000.mp4,stream=video,output=h264_720p.mp4 \
in=h264_high_1080p_6000.mp4,stream=video,output=h264_1080p.mp4 \
--enable_widevine_encryption \
--key_server_url https://license.uat.widevine.com/cenc/getcontentkey/widevine_test \
--content_id 7465737420636f6e74656e74206964 \
--signer widevine_test \
--aes_signing_key 1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9 \
2018-08-16 00:35:22 +00:00
--aes_signing_iv d58ce954203b7c9a9a9d467f59839249 \
--mpd_output h264.mpd \
--hls_master_playlist_output h264_master.m3u8
2017-09-20 02:35:05 +00:00
< / pre > < / div >
< / div >
2018-02-10 23:37:42 +00:00
< / li >
< li > < p class = "first" > Another example using ‘ cbcs’ protection scheme:< / p >
< div class = "highlight-default" > < div class = "highlight" > < pre > < span > < / span > $ packager \
in=h264_baseline_360p_600.mp4,stream=audio,output=audio.mp4 \
in=h264_baseline_360p_600.mp4,stream=video,output=h264_360p.mp4 \
in=h264_main_480p_1000.mp4,stream=video,output=h264_480p.mp4 \
in=h264_main_720p_3000.mp4,stream=video,output=h264_720p.mp4 \
in=h264_high_1080p_6000.mp4,stream=video,output=h264_1080p.mp4 \
--protection_scheme cbcs \
--enable_widevine_encryption \
--key_server_url https://license.uat.widevine.com/cenc/getcontentkey/widevine_test \
--content_id 7465737420636f6e74656e74206964 \
--signer widevine_test \
--aes_signing_key 1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9 \
2018-08-16 00:35:22 +00:00
--aes_signing_iv d58ce954203b7c9a9a9d467f59839249 \
--mpd_output h264.mpd \
--hls_master_playlist_output h264_master.m3u8
< / pre > < / div >
< / div >
< / li >
< / ul >
< p > The examples above generate Widevine protection system by default. It can be
extended to support multi-drm with – protection_systems flag.< / p >
< ul >
< li > < p class = "first" > Example with multi-drm (Widevine and PlayReady):< / p >
< div class = "highlight-default" > < div class = "highlight" > < pre > < span > < / span > $ packager \
in=h264_baseline_360p_600.mp4,stream=audio,output=audio.mp4 \
in=h264_baseline_360p_600.mp4,stream=video,output=h264_360p.mp4 \
in=h264_main_480p_1000.mp4,stream=video,output=h264_480p.mp4 \
in=h264_main_720p_3000.mp4,stream=video,output=h264_720p.mp4 \
in=h264_high_1080p_6000.mp4,stream=video,output=h264_1080p.mp4 \
--enable_widevine_encryption \
--key_server_url https://license.uat.widevine.com/cenc/getcontentkey/widevine_test \
--content_id 7465737420636f6e74656e74206964 \
--signer widevine_test \
--aes_signing_key 1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9 \
--aes_signing_iv d58ce954203b7c9a9a9d467f59839249 \
--protection_systems Widevine,PlayReady
--mpd_output h264.mpd
2018-02-10 23:37:42 +00:00
< / pre > < / div >
< / div >
< / li >
< / ul >
2018-08-16 00:35:22 +00:00
< div class = "admonition note" >
< p class = "first admonition-title" > Note< / p >
< p class = "last" > Users are responsible for setting up the license servers and managing keys
there unless they are using a cloud service provided by the DRM provider or
third_parties.< / p >
< / div >
2017-09-20 02:35:05 +00:00
< p > Refer to
< a class = "reference external" href = "https://shaka-player-demo.appspot.com/docs/api/tutorial-drm-config.html" > player setup< / a >
on how to config the DRM in Shaka Player.< / p >
< / div >
< div class = "section" id = "widevine-test-credential" >
< h2 > Widevine test credential< a class = "headerlink" href = "#widevine-test-credential" title = "Permalink to this headline" > ¶< / a > < / h2 >
< p > Here is the test crendential used in this tutorial.< / p >
2017-10-24 22:51:02 +00:00
< table class = "docutils field-list" frame = "void" rules = "none" >
< col class = "field-name" / >
< col class = "field-body" / >
< tbody valign = "top" >
< tr class = "field-odd field" > < th class = "field-name" > key_server_url:< / th > < td class = "field-body" > < a class = "reference external" href = "https://license.uat.widevine.com/cenc/getcontentkey/widevine_test" > https://license.uat.widevine.com/cenc/getcontentkey/widevine_test< / a > < / td >
< / tr >
< tr class = "field-even field" > < th class = "field-name" > signer:< / th > < td class = "field-body" > widevine_test< / td >
< / tr >
< tr class = "field-odd field" > < th class = "field-name" colspan = "2" > aes_signing_key:< / th > < / tr >
< tr class = "field-odd field" > < td >   < / td > < td class = "field-body" > 1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9< / td >
< / tr >
< tr class = "field-even field" > < th class = "field-name" > aes_signing_iv:< / th > < td class = "field-body" > d58ce954203b7c9a9a9d467f59839249< / td >
< / tr >
< / tbody >
< / table >
2017-09-20 02:35:05 +00:00
< div class = "admonition note" >
< p class = "first admonition-title" > Note< / p >
< p class = "last" > The test credential is only meant for development. Please reach out to
< a class = "reference external" href = "https://support.google.com/widevine/troubleshooter/6027072" > Widevine< / a > if
you need something for production use.< / p >
< / div >
2018-02-10 23:37:42 +00:00
< div class = "section" id = "drm-related-stream-descriptor-fields" >
< h3 > DRM related Stream descriptor fields< a class = "headerlink" href = "#drm-related-stream-descriptor-fields" title = "Permalink to this headline" > ¶< / a > < / h3 >
< table class = "docutils field-list" frame = "void" rules = "none" >
< col class = "field-name" / >
< col class = "field-body" / >
< tbody valign = "top" >
< tr class = "field-odd field" > < th class = "field-name" colspan = "2" > skip_encryption=0|1:< / th > < / tr >
< tr class = "field-odd field" > < td >   < / td > < td class = "field-body" > Optional. Defaults to 0 if not specified. If it is set to 1, no encryption
of the stream will be made.< / td >
< / tr >
< tr class = "field-even field" > < th class = "field-name" > drm_label:< / th > < td class = "field-body" > Optional value for custom DRM label, which defines the encryption key
applied to the stream. Typically values include AUDIO, SD, HD, UHD1, UHD2.
For raw key, it should be a label defined in – keys. If not provided, the
DRM label is derived from stream type (video, audio), resolutions, etc.
Note that it is case sensitive.< / td >
< / tr >
< / tbody >
< / table >
< / div >
< div class = "section" id = "general-encryption-options" >
< h3 > General encryption options< a class = "headerlink" href = "#general-encryption-options" title = "Permalink to this headline" > ¶< / a > < / h3 >
< table class = "docutils option-list" frame = "void" rules = "none" >
< col class = "option" / >
< col class = "description" / >
< tbody valign = "top" >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --protection_scheme < var > < scheme> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Specify a protection scheme, ‘ cenc’ or ‘ cbc1’ or pattern-based protection
schemes ‘ cens’ or ‘ cbcs’ .< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --vp9_subsample_encryption< / span > , < span class = "option" > --novp9_subsample_encryption< / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Enable / disable VP9 subsample encryption. Enabled by default.< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --clear_lead < var > < seconds> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Clear lead in seconds if encryption is enabled.< / td > < / tr >
2018-08-16 00:35:22 +00:00
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --protection_systems< / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Protection systems to be generated. Supported protection systems include
Widevine, PlayReady, FairPlay, and CommonSystem (< a class = "reference external" href = "https://goo.gl/s8RIhr" > https://goo.gl/s8RIhr< / a > ).< / td > < / tr >
2018-02-10 23:37:42 +00:00
< / tbody >
< / table >
< / div >
2017-09-20 02:35:05 +00:00
< div class = "section" id = "widevine-encryption-options" >
< h3 > Widevine encryption options< a class = "headerlink" href = "#widevine-encryption-options" title = "Permalink to this headline" > ¶< / a > < / h3 >
< table class = "docutils option-list" frame = "void" rules = "none" >
< col class = "option" / >
< col class = "description" / >
< tbody valign = "top" >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --enable_widevine_encryption< / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Enable encryption with Widevine key server. User should provide either
2018-02-10 23:37:42 +00:00
AES signing key (– aes_signing_key, – aes_signing_iv) or RSA signing key
2018-08-16 00:35:22 +00:00
(– rsa_signing_key_path). This generates Widevine protection system if
– protection_systems is not specified. Use – protection_systems to generate
multiple protection systems.< / td > < / tr >
2017-09-20 02:35:05 +00:00
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --enable_widevine_decryption< / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Enable decryption with Widevine key server. User should provide either
2018-02-10 23:37:42 +00:00
AES signing key (– aes_signing_key, – aes_signing_iv) or RSA signing key
(– rsa_signing_key_path).< / td > < / tr >
2017-09-20 02:35:05 +00:00
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --key_server_url < var > < url> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Key server url. Required for Widevine encryption and decryption.< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --content_id < var > < hex> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Content identifier that uniquely identifies the content.< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --policy < var > < policy> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > The name of a stored policy, which specifies DRM content rights.< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --max_sd_pixels < var > < pixels> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > The video track is considered SD if its max pixels per frame is no higher
than < em > max_sd_pixels< / em > . Default: 442368 (768 x 576).< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --max_hd_pixels < var > < pixels> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > The video track is considered HD if its max pixels per frame is higher than
< em > max_sd_pixels< / em > , but no higher than < em > max_hd_pixels< / em > . Default: 2073600
(1920 x 1080).< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --max_uhd1_pixels < var > < pixels> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > The video track is considered UHD1 if its max pixels per frame is higher
than < em > max_hd_pixels< / em > , but no higher than < em > max_uhd1_pixels< / em > . Otherwise it is
UHD2. Default: 8847360 (4096 x 2160).< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --signer < var > < signer> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > The name of the signer.< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --aes_signing_key < var > < hex> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > AES signing key in hex string. < em > aes_signing_iv< / em > is required if
< em > aes_signing_key< / em > is specified. This option is exclusive with
< em > rsa_signing_key_path< / em > .< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --aes_signing_iv < var > < hex> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > AES signing iv in hex string.< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --rsa_signing_key_path < var > < file path> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Path to the file containing PKCS#1 RSA private key for request signing.
This option is exclusive with < em > aes_signing_key< / em > .< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --crypto_period_duration < var > < seconds> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Defines how often key rotates. If it is non-zero, key rotation is enabled.< / td > < / tr >
< tr > < td class = "option-group" colspan = "2" >
< kbd > < span class = "option" > --group_id < var > < hex> < / var > < / span > < / kbd > < / td >
< / tr >
< tr > < td >   < / td > < td > Identifier for a group of licenses.< / td > < / tr >
< / tbody >
< / table >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "clearer" > < / div >
< / div >
< div class = "related" role = "navigation" aria-label = "related navigation" >
< h3 > Navigation< / h3 >
< ul >
< li class = "right" style = "margin-right: 10px" >
< a href = "../genindex.html" title = "General Index"
>index< / a > < / li >
< li class = "right" >
2018-08-16 00:35:22 +00:00
< a href = "playready.html" title = "Using PlayReady Key Server"
2017-09-20 02:35:05 +00:00
>next< / a > |< / li >
< li class = "right" >
2018-08-16 00:35:22 +00:00
< a href = "raw_key.html" title = "Using Raw Key"
2017-09-20 02:35:05 +00:00
>previous< / a > |< / li >
< li class = "nav-item nav-item-0" > < a href = "../index.html" > Shaka Packager documentation< / a > » < / li >
< li class = "nav-item nav-item-1" > < a href = "tutorials.html" > Tutorials< / a > » < / li >
< li class = "nav-item nav-item-2" > < a href = "drm.html" > DRM< / a > » < / li >
< / ul >
< / div >
< div class = "footer" role = "contentinfo" >
© Copyright 2017, Google.
2018-02-10 23:37:42 +00:00
Created using < a href = "http://sphinx-doc.org/" > Sphinx< / a > 1.6.7.
2017-09-20 02:35:05 +00:00
< / div >
< / body >
< / html >