Tutorials for Sphinxdoc
Change-Id: I3d43205b81d168c60f7ab2b7f246bd8a07e68e43
This commit is contained in:
parent
16eff80497
commit
6e2b4a28e1
|
@ -0,0 +1,61 @@
|
|||
# Basic Usage
|
||||
|
||||
## Getting help
|
||||
|
||||
```shell
|
||||
$ packager --help
|
||||
```
|
||||
|
||||
## Media file analysis
|
||||
|
||||
Shaka Packager can be used to inspect the content of a media file and dump basic
|
||||
stream information.
|
||||
|
||||
```shell
|
||||
$ packager input=some_content.mp4 --dump_stream_info
|
||||
```
|
||||
|
||||
The output looks like:
|
||||
|
||||
```shell
|
||||
File "some_content.mp4":
|
||||
Found 2 stream(s).
|
||||
Stream [0] type: Video
|
||||
codec_string: avc1.4d001e
|
||||
time_scale: 24000
|
||||
duration: 3002000 (125.1 seconds)
|
||||
is_encrypted: false
|
||||
codec: H264
|
||||
width: 720
|
||||
height: 360
|
||||
pixel_aspect_ratio: 8:9
|
||||
trick_play_factor: 0
|
||||
nalu_length_size: 4
|
||||
|
||||
Stream [1] type: Audio
|
||||
codec_string: mp4a.40.2
|
||||
time_scale: 44100
|
||||
duration: 5517311 (125.1 seconds)
|
||||
is_encrypted: false
|
||||
codec: AAC
|
||||
sample_bits: 16
|
||||
num_channels: 2
|
||||
sampling_frequency: 44100
|
||||
language: eng
|
||||
```
|
||||
|
||||
## Basic transmuxing
|
||||
|
||||
Shaka Packager can be used to extract streams, optionally transmuxes the streams
|
||||
from one container format to another container format.
|
||||
|
||||
Here is a simple command that extracts video and audio from the input file:
|
||||
|
||||
```shell
|
||||
$ packager in=some_content.mp4,stream=video,out=video.mp4 \
|
||||
in=some_content.mp4,stream=audio,out=audio.mp4
|
||||
```
|
||||
|
||||
Shaka Packager is also capable of more complex tasks, such as applying
|
||||
encryption, packaging contents to DASH or HLS formats, etc. Refer
|
||||
:doc:`tutorials`.
|
|
@ -0,0 +1,63 @@
|
|||
DASH
|
||||
====
|
||||
|
||||
Dynamic Adaptive Streaming over HTTP (DASH) is an adaptive bitrate streaming
|
||||
technique that enables high quality streaming of media content over HTTP.
|
||||
|
||||
Shaka Packager supports DASH content packaging. This tutorial covers DASH
|
||||
packaging of VOD content without encryption. For live content packaging, see
|
||||
:doc:`live`; for content encryption, see :doc:`drm`.
|
||||
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
::
|
||||
|
||||
$ packager {stream_descriptor} [stream_descriptor] ... \
|
||||
--mpd_output {manifest output path} \
|
||||
[Other DASH options] \
|
||||
[Other options, e.g. DRM options, HLS options]
|
||||
|
||||
See `DASH options`_ for the available DASH related options.
|
||||
|
||||
.. note::
|
||||
|
||||
DASH and HLS options can both be specified to output DASH and HLS manifests
|
||||
at the same time. Note that it works only for MP4 outputs.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
The examples below uses the H264 streams created in :doc:`encoding`. It can be
|
||||
applied to VP9 in the same way.
|
||||
|
||||
* on-demand::
|
||||
|
||||
$ 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 \
|
||||
--mpd_output h264.mpd
|
||||
|
||||
The above packaging command creates five single track fragmented mp4 streams
|
||||
(4 video, 1 audio) and a manifest, which describes the streams.
|
||||
|
||||
* static-live::
|
||||
|
||||
$ packager \
|
||||
'in=h264_baseline_360p_600.mp4,stream=audio,init_segment=audio_init.mp4,segment_template=audio_$Number$.m4s' \
|
||||
'in=h264_baseline_360p_600.mp4,stream=video,init_segment=h264_360p_init.mp4,segment_template=h264_360p_$Number$.m4s' \
|
||||
'in=h264_main_480p_1000.mp4,stream=video,init_segment=h264_480p_init.mp4,segment_template=h264_480p_$Number$.m4s' \
|
||||
'in=h264_main_720p_3000.mp4,stream=video,init_segment=h264_720p_init.mp4,segment_template=h264_720p_$Number$.m4s' \
|
||||
'in=h264_main_1080p_6000.mp4,stream=video,init_segment=h264_1080p_init.mp4,segment_template=h264_1080p_$Number$.m4s' \
|
||||
--generate_static_mpd --mpd_output h264.mpd
|
||||
|
||||
The above packaging command creates five groups of segments (each with an init
|
||||
segment and a series of media segments) for the five streams and a manifest,
|
||||
which describes the streams.
|
||||
|
||||
.. include:: /options/dash_options.rst
|
||||
|
||||
.. include:: /options/segment_template_formatting.rst
|
|
@ -0,0 +1,9 @@
|
|||
DRM
|
||||
===
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
/tutorials/raw_key.rst
|
||||
/tutorials/widevine.rst
|
||||
/tutorials/playready.rst
|
|
@ -0,0 +1,124 @@
|
|||
Media Encoding
|
||||
--------------
|
||||
|
||||
Shaka Packager does not do transcoding internally. The contents need to be
|
||||
pre-encoded before passing to Shaka Packager.
|
||||
|
||||
General guidelines of how contents should be encoded
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
- Encode multiple bitrates or resolutions of the same content. Shaka Packager
|
||||
can then package the content into DASH / HLS formats, allowing different
|
||||
bitrates of the content to be served for different network conditions,
|
||||
achieving adaptive bitrate streaming.
|
||||
- Not a must, but the multibirate content is recommended to have aligned GOPs
|
||||
across the different bitrate streams. This makes bitrate switching easier and
|
||||
smoother.
|
||||
- We recommend setting GOP size to 5s or less. The streams are usually
|
||||
switchable only at GOP boundaries. A smaller GOP size results in faster
|
||||
switching when network condition changes.
|
||||
- In the same stream, the bitrate should be more or less the same in the
|
||||
inter-GOP level.
|
||||
|
||||
Sample commands to generate multi-bitrate content
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Let us say we have a 1080p original content `original.mp4` containing an audio
|
||||
track in `AAC` and a video track in `H264`. The frame rate is 24. We want to
|
||||
encode the contents into four resolutions: 360p, 480p, 720p and 1080p with GOP
|
||||
size 72, i.e. 3 seconds.
|
||||
|
||||
We use `ffmpeg <https://www.ffmpeg.org/>`_ here, which is a common tool used for
|
||||
transcoding.
|
||||
|
||||
H264 encoding
|
||||
"""""""""""""
|
||||
|
||||
* 360p::
|
||||
|
||||
$ ffmpeg -i original.mp4 -c:a copy \
|
||||
-vf "scale=-2:360" \
|
||||
-c:v libx264 -profile:v baseline -level:v 3.0 \
|
||||
-x264opts scenecut=0:open_gop=0:min-keyint=72:keyint=72 \
|
||||
-minrate 600k -maxrate 600k -bufsize 600k -b:v 600k \
|
||||
-y h264_baseline_360p_600.mp4
|
||||
|
||||
* 480p::
|
||||
|
||||
$ ffmpeg -i original.mp4 -c:a copy \
|
||||
-vf "scale=-2:480" \
|
||||
-c:v libx264 -profile:v main -level:v 3.1 \
|
||||
-x264opts scenecut=0:open_gop=0:min-keyint=72:keyint=72 \
|
||||
-minrate 1000k -maxrate 1000k -bufsize 1000k -b:v 1000k \
|
||||
-y h264_main_480p_1000.mp4
|
||||
|
||||
* 720p::
|
||||
|
||||
$ ffmpeg -i original.mp4 -c:a copy \
|
||||
-vf "scale=-2:720" \
|
||||
-c:v libx264 -profile:v main -level:v 4.0 \
|
||||
-x264opts scenecut=0:open_gop=0:min-keyint=72:keyint=72 \
|
||||
-minrate 3000k -maxrate 3000k -bufsize 3000k -b:v 3000k \
|
||||
-y h264_main_720p_3000.mp4
|
||||
|
||||
* 1080p::
|
||||
|
||||
$ ffmpeg -i original.mp4 -c:a copy \
|
||||
-vf "scale=-2:1080" \
|
||||
-c:v libx264 -profile:v main -level:v 4.2 \
|
||||
-x264opts scenecut=0:open_gop=0:min-keyint=72:keyint=72 \
|
||||
-minrate 6000k -maxrate 6000k -bufsize 6000k -b:v 6000k \
|
||||
-y h264_main_1080p_6000.mp4
|
||||
|
||||
VP9 encoding
|
||||
""""""""""""
|
||||
|
||||
The audio is encoded into `opus`.
|
||||
|
||||
* 360p::
|
||||
|
||||
$ ffmpeg -i original.mp4 \
|
||||
-strict -2 -c:a opus \
|
||||
-vf "scale=-2:360" \
|
||||
-c:v libvpx-vp9 -profile:v 0 \
|
||||
-keyint_min 72 -g 72 \
|
||||
-tile-columns 4 -frame-parallel 1 -speed 1 \
|
||||
-auto-alt-ref 1 -lag-in-frames 25 \
|
||||
-b:v 300k \
|
||||
-y vp9_360p_300.webm
|
||||
|
||||
* 480p::
|
||||
|
||||
$ ffmpeg -i original.mp4 \
|
||||
-strict -2 -c:a opus \
|
||||
-vf "scale=-2:480" \
|
||||
-c:v libvpx-vp9 -profile:v 0 \
|
||||
-keyint_min 72 -g 72 \
|
||||
-tile-columns 4 -frame-parallel 1 -speed 1 \
|
||||
-auto-alt-ref 1 -lag-in-frames 25 \
|
||||
-b:v 500k \
|
||||
-y vp9_480p_500.webm
|
||||
|
||||
* 720p::
|
||||
|
||||
$ ffmpeg -i original.mp4 \
|
||||
-strict -2 -c:a opus \
|
||||
-vf "scale=-2:720" \
|
||||
-c:v libvpx-vp9 -profile:v 0 \
|
||||
-keyint_min 72 -g 72 \
|
||||
-tile-columns 4 -frame-parallel 1 -speed 1 \
|
||||
-auto-alt-ref 1 -lag-in-frames 25 \
|
||||
-b:v 1500k \
|
||||
-y vp9_720p_1500.webm
|
||||
|
||||
* 1080p::
|
||||
|
||||
$ ffmpeg -i original.mp4 \
|
||||
-strict -2 -c:a opus \
|
||||
-vf "scale=-2:1080" \
|
||||
-c:v libvpx-vp9 -profile:v 0 \
|
||||
-keyint_min 72 -g 72 \
|
||||
-tile-columns 4 -frame-parallel 1 -speed 1 \
|
||||
-auto-alt-ref 1 -lag-in-frames 25 \
|
||||
-b:v 3000k \
|
||||
-y vp9_1080p_3000.webm
|
|
@ -0,0 +1,56 @@
|
|||
ffmpeg piping
|
||||
=============
|
||||
|
||||
We can use *ffmpeg* to redirect / pipe input not supported by *packager*
|
||||
to *packager*, for example, input from webcam devices. The example below uses
|
||||
webcam input device. The concept depicted here can be applied to
|
||||
other *ffmpeg* supported capture device.
|
||||
|
||||
ffmpeg camera capture
|
||||
---------------------
|
||||
|
||||
Refer to `ffmpeg Capture/Webcam <https://trac.ffmpeg.org/wiki/Capture/Webcam>`_
|
||||
on how to use *ffmpeg* to capture webmcam inputs.
|
||||
|
||||
The examples below assumes Mac OS X 10.7 (Lion) or later. It is similar on
|
||||
other platforms. Refer to the above link for details.
|
||||
|
||||
Create pipe
|
||||
-----------
|
||||
|
||||
We use pipe to connect *ffmpeg* and *packager*::
|
||||
|
||||
$ mkfifo pipe1
|
||||
|
||||
Encoding / capture command
|
||||
--------------------------
|
||||
|
||||
The below command captures from the default audio / video devices on the
|
||||
machine::
|
||||
|
||||
$ ffmpeg -f avfoundation -i "default" -f mpegts pipe: > pipe1
|
||||
|
||||
The command starts only after packager starts.
|
||||
|
||||
.. note::
|
||||
|
||||
After encoding starts, monitor encoding speed carefully. It should always be
|
||||
1x and above. If not, adjust the encoding parameters to recude it.
|
||||
|
||||
Packaging command (DASH)
|
||||
------------------------
|
||||
|
||||
::
|
||||
|
||||
$ packager \
|
||||
'in=pipe1,stream=audio,init_segment=live_cam_audio.mp4,segment_template=live_cam_audio_$Number$.m4s' \
|
||||
'in=pipe1,stream=video,init_segment=live_cam_video.mp4,segment_template=live_cam_video_$Number$.m4s' \
|
||||
--mpd_output live_cam.mpd \
|
||||
--io_block_size 65536
|
||||
|
||||
.. note::
|
||||
|
||||
Option -io_block_size 65536 tells packager to use an io_block_size of 65K
|
||||
for threaded io file. This is necessary as reading from pipe blocks until
|
||||
the specified number of bytes, which is specified in io_block_size for
|
||||
threaded io file, thus the value of io_block_size cannot be too large.
|
|
@ -0,0 +1,87 @@
|
|||
HLS
|
||||
===
|
||||
|
||||
HTTP Live Streaming (also known as HLS) is an HTTP-based media streaming
|
||||
communications protocol implemented by Apple Inc. as part of its QuickTime,
|
||||
Safari, OS X, and iOS software. It resembles MPEG-DASH in that it works by
|
||||
breaking the overall stream into a sequence of small HTTP-based file downloads,
|
||||
each download loading one short chunk of an overall potentially unbounded
|
||||
transport stream. As the stream is played, the client may select from a number
|
||||
of different alternate streams containing the same material encoded at a variety
|
||||
of data rates, allowing the streaming session to adapt to the available data
|
||||
rate. At the start of the streaming session, HLS downloads an extended M3U
|
||||
playlist containing the metadata for the various sub-streams which are
|
||||
available.
|
||||
|
||||
Shaka Packager supports HLS content packaging. This tutorial covers HLS
|
||||
packaging of VOD content without encryption. For live content packaging, see
|
||||
:doc:`live`; for content encryption, see :doc:`drm`.
|
||||
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
::
|
||||
|
||||
$ packager {stream_descriptor with HLS specific descriptors} \
|
||||
[stream_descriptor with HLS specific descriptors] ... \
|
||||
--hls_master_playlist_output {master playlist output path} \
|
||||
[Other HLS options] \
|
||||
[Other options, e.g. DRM options, DASH options]
|
||||
|
||||
See `HLS specific stream descriptor fields`_ for the available HLS specific
|
||||
stream descriptor fields.
|
||||
|
||||
See `HLS options`_ for the available HLS related options.
|
||||
|
||||
.. note::
|
||||
|
||||
DASH and HLS options can both be specified to output DASH and HLS manifests
|
||||
at the same time. Note that it works only for MP4 outputs.
|
||||
|
||||
Examples
|
||||
---------
|
||||
|
||||
The examples below uses the H264 streams created in :doc:`encoding`.
|
||||
|
||||
* TS output::
|
||||
|
||||
$ packager \
|
||||
'in=h264_baseline_360p_600.mp4,stream=audio,output=audio_$Number$.ts,playlist_name=audio.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
|
||||
'in=h264_baseline_360p_600.mp4,stream=video,output=h264_360p_$Number$.ts,playlist_name=h264_360p.m3u8' \
|
||||
'in=h264_main_480p_1000.mp4,stream=video,output=h264_480p_$Number$.ts,playlist_name=h264_480p.m3u8' \
|
||||
'in=h264_main_720p_3000.mp4,stream=video,output=h264_720p_$Number$.ts,playlist_name=h264_720p.m3u8' \
|
||||
'in=h264_high_1080p_6000.mp4,stream=video,output=h264_1080p_$Number$.ts,playlist_name=h264_1080p.m3u8' \
|
||||
--hls_master_playlist_output h264_master.m3u8
|
||||
|
||||
The above packaging command creates five single track TS streams
|
||||
(4 video, 1 audio) and a manifest, which describes the streams.
|
||||
|
||||
* MP4 output is also supported::
|
||||
|
||||
$ packager \
|
||||
'in=h264_baseline_360p_600.mp4,stream=audio,init_segment=audio_init.mp4,segment_template=audio_$Number$.m4s,playlist_name=audio.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
|
||||
'in=h264_baseline_360p_600.mp4,stream=video,init_segment=h264_360p_init.mp4,segment_template=h264_360p_$Number$.m4s,playlist_name=h264_360p.m3u8' \
|
||||
'in=h264_main_480p_1000.mp4,stream=video,init_segment=h264_480p_init.mp4,segment_template=h264_480p_$Number$.m4s,playlist_name=h264_480p.m3u8' \
|
||||
'in=h264_main_720p_3000.mp4,stream=video,init_segment=h264_720p_init.mp4,segment_template=h264_720p_$Number$.m4s,playlist_name=h264_720p.m3u8' \
|
||||
'in=h264_main_1080p_6000.mp4,stream=video,init_segment=h264_1080p_init.mp4,segment_template=h264_1080p_$Number$.m4s,playlist_name=h264_1080p.m3u8' \
|
||||
--hls_master_playlist_output h264_master.m3u8
|
||||
|
||||
* Single file MP4 output is also supported::
|
||||
|
||||
$ packager \
|
||||
in=h264_baseline_360p_600.mp4,stream=audio,output=audio.mp4,playlist_name=audio.m3u8,hls_group_id=audio,hls_name=ENGLISH \
|
||||
in=h264_baseline_360p_600.mp4,stream=video,output=h264_360p.mp4,playlist_name=h264_360p.m3u8 \
|
||||
in=h264_main_480p_1000.mp4,stream=video,output=h264_480p.mp4,playlist_name=h264_480p.m3u8 \
|
||||
in=h264_main_720p_3000.mp4,stream=video,output=h264_720p.mp4,playlist_name=h264_720p.m3u8 \
|
||||
in=h264_high_1080p_6000.mp4,stream=video,output=h264_1080p.mp4,playlist_name=h264_1080p.m3u8 \
|
||||
--hls_master_playlist_output h264_master.m3u8
|
||||
|
||||
The above packaging command creates five groups of streams (each with an init
|
||||
segment and a series of media segments) and a manifest, which describes the
|
||||
streams.
|
||||
|
||||
.. include:: /options/hls_stream_descriptors.rst
|
||||
|
||||
.. include:: /options/hls_options.rst
|
||||
|
||||
.. include:: /options/segment_template_formatting.rst
|
|
@ -0,0 +1,46 @@
|
|||
Live
|
||||
====
|
||||
|
||||
A typical live source is UDP multicast, which is the only live protocol
|
||||
packager supports directly right now.
|
||||
|
||||
.. include:: /options/udp_file_options.rst
|
||||
|
||||
Pipe through FFmpeg
|
||||
-------------------
|
||||
|
||||
For other unsupported protocols, you can use FFmpeg to pipe the input.
|
||||
See :doc:`ffmpeg_piping` for details.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
The command is similar to the on-demand, see :doc:`dash` and :doc:`hls`.
|
||||
|
||||
Here are some examples.
|
||||
|
||||
* DASH::
|
||||
|
||||
$ packager \
|
||||
'in=udp://225.1.1.8:8001?interface=172.29.46.122,stream=audio,init_segment=audio_init.mp4,segment_template=audio_$Number$.m4s' \
|
||||
'in=udp://225.1.1.8:8001?interface=172.29.46.122,stream=video,init_segment=h264_360p_init.mp4,segment_template=h264_360p_$Number$.m4s' \
|
||||
'in=udp://225.1.1.8:8002?interface=172.29.46.122,stream=video,init_segment=h264_480p_init.mp4,segment_template=h264_480p_$Number$.m4s' \
|
||||
'in=udp://225.1.1.8:8003?interface=172.29.46.122,stream=video,init_segment=h264_720p_init.mp4,segment_template=h264_720p_$Number$.m4s' \
|
||||
'in=udp://225.1.1.8:8004?interface=172.29.46.122,stream=video,init_segment=h264_1080p_init.mp4,segment_template=h264_1080p_$Number$.m4s' \
|
||||
--mpd_output h264.mpd
|
||||
|
||||
|
||||
* HLS::
|
||||
|
||||
$ packager \
|
||||
'in=udp://225.1.1.8:8001?interface=172.29.46.122,stream=audio,init_segment=audio_init.mp4,segment_template=audio_$Number$.m4s,playlist_name=audio.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
|
||||
'in=udp://225.1.1.8:8001?interface=172.29.46.122,stream=video,init_segment=h264_360p_init.mp4,segment_template=h264_360p_$Number$.m4s,playlist_name=h264_360p.m3u8' \
|
||||
'in=udp://225.1.1.8:8002?interface=172.29.46.122,stream=video,init_segment=h264_480p_init.mp4,segment_template=h264_480p_$Number$.m4s,playlist_name=h264_480p.m3u8' \
|
||||
'in=udp://225.1.1.8:8003?interface=172.29.46.122,stream=video,init_segment=h264_720p_init.mp4,segment_template=h264_720p_$Number$.m4s,playlist_name=h264_720p.m3u8' \
|
||||
'in=udp://225.1.1.8:8004?interface=172.29.46.122,stream=video,init_segment=h264_1080p_init.mp4,segment_template=h264_1080p_$Number$.m4s,playlist_name=h264_1080p.m3u8' \
|
||||
--hls_master_playlist_output h264_master.m3u8
|
||||
|
||||
.. note::
|
||||
|
||||
Packager does not support removing old segments internally. The user is
|
||||
resposible for setting up a cron job to do so.
|
|
@ -0,0 +1,4 @@
|
|||
Playready
|
||||
=========
|
||||
|
||||
To be completed.
|
|
@ -0,0 +1,86 @@
|
|||
Raw key
|
||||
=======
|
||||
|
||||
*Packager* allows encrypting contents with raw key.
|
||||
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
::
|
||||
|
||||
$ packager {stream_descriptor} [stream_descriptor] ... \
|
||||
--enable_fixed_key_encryption \
|
||||
--key_id <key_id> --key <key> \
|
||||
[--pssh <concatenated PSSHs>] \
|
||||
[Other options, e.g. DASH options, HLS options]
|
||||
|
||||
Custom PSSH(s) can be provided in *--pssh*. If absent,
|
||||
`v1 common PSSH box <https://goo.gl/s8RIhr>`_ is generated.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
The examples below uses the H264 streams created in :doc:`encoding`. Here are examples with DASH. It can be applied to HLS in a similar way.
|
||||
|
||||
Common PSSH::
|
||||
|
||||
$ 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_fixed_key_encryption \
|
||||
--key_id abba271e8bcf552bbd2e86a434a9a5d9 \
|
||||
--key 69eaa802a6763af979e8d1940fb88392 \
|
||||
--mpd_output h264.mpd
|
||||
|
||||
Widevine PSSH::
|
||||
|
||||
$ 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_fixed_key_encryption \
|
||||
--key_id abba271e8bcf552bbd2e86a434a9a5d9 \
|
||||
--key 69eaa802a6763af979e8d1940fb88392 \
|
||||
--pssh 000000407073736800000000edef8ba979d64acea3c827dcd51d21ed000000201a0d7769646576696e655f74657374220f7465737420636f6e74656e74206964 \
|
||||
--mpd_output h264.mpd
|
||||
|
||||
Refer to
|
||||
`player setup <https://shaka-player-demo.appspot.com/docs/api/tutorial-drm-config.html>`_
|
||||
on how to config the DRM in Shaka Player.
|
||||
|
||||
Test vectors used in this tutorial
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Key ID
|
||||
|
||||
abba271e8bcf552bbd2e86a434a9a5d9
|
||||
|
||||
Key ID must be 16 bytes or 32 digits in HEX.
|
||||
|
||||
Key
|
||||
|
||||
69eaa802a6763af979e8d1940fb88392
|
||||
|
||||
Key must be 16 bytes or 32 digits in HEX.
|
||||
|
||||
Widevine PSSH
|
||||
|
||||
000000407073736800000000edef8ba979d64acea3c827dcd51d21ed000000201a0d7769646576696e655f74657374220f7465737420636f6e74656e74206964
|
||||
|
||||
The PSSH is generated using
|
||||
`pssh-box script <https://github.com/google/shaka-packager/tree/master/packager/tools/pssh>`_::
|
||||
|
||||
$ pssh-box.py --widevine-system-id \
|
||||
--content-id 7465737420636f6e74656e74206964 --provider widevine_test
|
||||
|
||||
.. include:: /options/raw_key_encryption_options.rst
|
||||
|
||||
pssh-box (Utility to generate PSSH boxes)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
https://github.com/google/shaka-packager/tree/master/packager/tools/pssh
|
|
@ -0,0 +1,11 @@
|
|||
Tutorials
|
||||
====================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
basic_usage.md
|
||||
dash.rst
|
||||
hls.md
|
||||
live.md
|
||||
drm.rst
|
|
@ -0,0 +1,87 @@
|
|||
Widevine
|
||||
========
|
||||
|
||||
There are two options to package a Widevine DRM encrypted content:
|
||||
|
||||
1. If you know the encryption keys and have the associated Widevine PSSH at
|
||||
hand, you can provide them in clear text to *packager* directly. Refer to
|
||||
:doc:`/tutorials/raw_key` for details.
|
||||
|
||||
2. Provide *key_server_url* and associated credentials to *packager*.
|
||||
*Packager* will fetch encryption keys from Widevine key server.
|
||||
|
||||
Synopsis
|
||||
--------
|
||||
|
||||
AES signing::
|
||||
|
||||
$ packager {stream_descriptor} [stream_descriptor] ... \
|
||||
--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]
|
||||
|
||||
RSA signing::
|
||||
|
||||
$ packager {stream_descriptor} [stream_descriptor] ... \
|
||||
--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]
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
The examples below uses the H264 streams created in :doc:`encoding`.
|
||||
|
||||
Here is an example with DASH. It can be applied to HLS in a similar way::
|
||||
|
||||
$ 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 \
|
||||
--mpd_output h264.mpd \
|
||||
--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
|
||||
|
||||
Refer to
|
||||
`player setup <https://shaka-player-demo.appspot.com/docs/api/tutorial-drm-config.html>`_
|
||||
on how to config the DRM in Shaka Player.
|
||||
|
||||
Widevine test credential
|
||||
------------------------
|
||||
|
||||
Here is the test crendential used in this tutorial.
|
||||
|
||||
key_server_url
|
||||
|
||||
https://license.uat.widevine.com/cenc/getcontentkey/widevine_test
|
||||
|
||||
signer
|
||||
|
||||
widevine_test
|
||||
|
||||
aes_signing_key
|
||||
|
||||
1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9
|
||||
|
||||
aes_signing_iv
|
||||
|
||||
d58ce954203b7c9a9a9d467f59839249
|
||||
|
||||
.. note::
|
||||
|
||||
The test credential is only meant for development. Please reach out to
|
||||
`Widevine <https://support.google.com/widevine/troubleshooter/6027072>`_ if
|
||||
you need something for production use.
|
||||
|
||||
.. include:: /options/widevine_encryption_options.rst
|
Loading…
Reference in New Issue