Edited at

無料でできる MPEG-DASH + Widevine ストリーミング テスト配信

More than 1 year has passed since last update.


はじめに

こんにちは cloudpack 事業戦略本部 streampack チームの木村です。

動画配信においてあまり需要がないけど、要求されるところではしっかり要求されてしまうDRMについて、無料でテスト配信(ココ重要)を試すまでの手順をまとめてみたいと思います。


用意するもの

MPEG-DASH パッケージャー
shaka-packager

DRM パッケージャー
shaka-packager

メディア プレイヤー
shaka-player

パッケージャーを動かすマシン
Amazon EC2

配信サーバー
Amazon S3

コンテンツ
適当な MP4(H.264/AAC)

配信方式は MPEG-DASH、DRM は Widevine で進めていきます。

パッケージングや配信はローカルでやっても良いのですが、cloudpack の人間なので、当然のごとく AWS 上に環境を構築していきます。


shaka-packager のインストール

Google 謹製のパッケージャーです。 これを利用して MPEG-DASH 化と Widevine DRM 化を一気にやっちゃいます。

今回は Amazon EC2 (Amazon Linux) 上に展開していきます。


インストール前の準備

curl, git, python, gcc-c++ が必要ですが、curl と python は予め Amazon Linux にインストールされているので、git と gcc-c++ をインストールします。


git, gcc-c++ インストール


$ sudo yum install git gcc-c++


depot_tools のインストール

Chromium から depot_tools リポジトリをクローンします。

$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

取得したらPATHを通しておきます。 .bashrc 等に以下を環境に合わせて追記します。

export PATH="$PATH:/path/to/depot_tools"


shaka-packager の取得

shaka_packager ディレクトリーを作成します。

$ mkdir shaka_packager && cd shaka_packager

depot_tools の glient を使ってコードと依存性をチェックします。

$ gclient config https://www.github.com/google/shaka-packager.git --name=src --unmanaged

sync を実行して暫くほーちします。(数分間)

$ gclient sync

完了したら src ディレクトリーに移動して、depot_tools の ninja を使ってコードをビルドします。

$ cd src

$ ninja -C out/Release

終了したら shaka-packager インストール完了です。

packager は以下に作成されるので PATH を通しておいても良いでしょう。

shaka_packager/src/out/Release/packager


MPEG-DASH & Widevine パッケージング

Google さんの方でテスト用のライセンスサーバー、キー、IV を用意してくれてるのでそれを使います。

key_server_url:
https://license.uat.widevine.com/cenc/getcontentkey/widevine_test

signer:
widevine_test

aes_signing_key:
1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9

aes_signing_iv:
d58ce954203b7c9a9a9d467f59839249

あとは DASH 化するコンテンツを用意(ここでは sample.mp4) して、packager で以下のコマンドを実行します。

packager \

in=sample.mp4,stream=audio,output=audio.mp4 \
in=sample.mp4,stream=video,output=video.mp4 \
--mpd_output sample.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

実行すると以下のファイルが生成されます。


  • sample.mpd

  • video.mp4

  • audio.mp4

MP4Box で video.mp4 ファイル情報を見てみると、

# MP4Box -info video.mp4

* Movie Info *
Timescale 15360 - Duration 00:00:00.000
1 track(s)
Fragmented File: yes - duration 00:10:34.633
64 fragments - 1 SegmentIndexes
File suitable for progressive download (moov before mdat)
File Brand isom - version 0
Created: GMT Fri Jan 5 09:27:51 2018
Modified: GMT Fri Jan 5 09:27:51 2018

Moov Meta type: "ID32" - 0 resource item(s)
File has no MPEG4 IOD/OD

Track # 1 Info - TrackID 1 - TimeScale 15360 - Media Duration 00:00:00.000
Media Info: Language "und (und)" - Type "vide:encv" - 0 samples
Fragmented track: 19039 samples - Media Duration 00:10:34.633
Visual Track layout: x=0 y=0 width=512 height=288
MPEG-4 Config: Visual Stream - ObjectTypeIndication 0x21
AVC/H264 Video - Visual Size 512 x 288
AVC Info: 1 SPS - 1 PPS - Profile Baseline @ Level 2.1
NAL Unit length bits: 32
Pixel Aspect Ratio 1:1 - Indicated track size 512 x 288
Self-synchronized

*Encrypted stream - CENC scheme cenc (version 65536)
Initialization Vector size: 64 bits

Encrypted stream - CENC scheme cenc (version 65536)で暗号化されていることが確認できます。

また mpd の中身を見てみると ContentProtection Element が確認できます。


sample.mpd


<?xml version="1.0" encoding="UTF-8"?>
<!--Generated with https://github.com/google/shaka-packager version c88fe54553-release-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT634.633S">
<Period id="0">
<AdaptationSet id="0" contentType="video" width="512" height="288" frameRate="15360/512" subsegmentAlignment="true" par="16:9">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="abba271e-8bcf-552b-bd2e-86a434a9a5d9"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAoHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAIASEKu6Jx6Lz1UrvS6GpDSppdkSEG128lyxf14WuOrva79YLY4SEGR4YzefQVQQg3fnTG7A47gSEP3MPWFu3FzqmyVYWB2c048SEPPF4DYeZlSyj4BJx3iyOUYaDXdpZGV2aW5lX3Rlc3QiD3Rlc3QgY29udGVudCBpZEjj3JWbBg==</cenc:pssh>
</ContentProtection>
<Representation id="0" bandwidth="646006" codecs="avc1.42c015" mimeType="video/mp4" sar="1:1">
<BaseURL>video.mp4</BaseURL>
<SegmentBase indexRange="1192-1991" timescale="15360">
<Initialization range="0-1191"/>
</SegmentBase>
</Representation>
</AdaptationSet>
<AdaptationSet id="1" contentType="audio" subsegmentAlignment="true">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="f3c5e036-1e66-54b2-8f80-49c778b23946"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAoHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAIASEKu6Jx6Lz1UrvS6GpDSppdkSEG128lyxf14WuOrva79YLY4SEGR4YzefQVQQg3fnTG7A47gSEP3MPWFu3FzqmyVYWB2c048SEPPF4DYeZlSyj4BJx3iyOUYaDXdpZGV2aW5lX3Rlc3QiD3Rlc3QgY29udGVudCBpZEjj3JWbBg==</cenc:pssh>
</ContentProtection>
<Representation id="1" bandwidth="100806" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<BaseURL>audio.mp4</BaseURL>
<SegmentBase indexRange="1074-1873" timescale="48000">
<Initialization range="0-1073"/>
</SegmentBase>
</Representation>
</AdaptationSet>
</Period>
</MPD>

そしてこれらのファイルを S3 のてきとーな場所に配置して公開します。

hogehoge バケットの shaka ディレクトリー配下にアップした例

$ aws s3 ls s3://hogehoge/shaka/

2018-01-05 09:31:42 0
2018-01-05 09:37:22 7990901 audio.mp4
2018-01-05 09:37:43 2499 sample.mpd
2018-01-05 09:37:33 51247089 video.mp4


再生確認

再生にはこれまた Google 謹製 Shaka Player を使います。

取り敢えず Web で公開されている誰でも使えるバージョンで。

https://shaka-player-demo.appspot.com

スクリーンショット 2018-01-05 18.51.18.png

各項目には以下を入力します。

Asset:
custom asset

Custom Manifest:
mpd の URL (例: https://s3-ap-northeast-1.amazonaws.com/hogehoge/shaka/sample.mpd)

Custom License Server:
https://widevine-proxy.appspot.com/proxy

Custom License certificate URL:
N/A

Load を押すと再生が開始されます。

スクリーンショット 2018-01-05 18.58.26.png

(c) copyright 2008, Blender Foundation / www.bigbuckbunny.org


まとめ

商用利用では DRM サービスプロバイダーなどと契約するケースが多いかと思いますが、今回はサワリとして無料のツールのみで試してみました。

Shaka Packager と Shaka Player を利用しましたが、他にも Bento4 や ExoPlayer などでも無料で遊ぶことができますよ。

尚、今回利用した Widevine のキーは Google 様がテスト用に用意しているものですので、実際に商用利用する場合にはお金かかりますのご注意を〜


参考

https://google.github.io/shaka-packager/html/index.html