はじめに
こんにちは 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
各項目には以下を入力します。
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 を押すと再生が開始されます。
まとめ
商用利用では DRM サービスプロバイダーなどと契約するケースが多いかと思いますが、今回はサワリとして無料のツールのみで試してみました。
Shaka Packager と Shaka Player を利用しましたが、他にも Bento4 や ExoPlayer などでも無料で遊ぶことができますよ。
尚、今回利用した Widevine のキーは Google 様がテスト用に用意しているものですので、実際に商用利用する場合にはお金かかりますのご注意を〜
参考
https://google.github.io/shaka-packager/html/index.html