5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[MPEG-DASH] Bento4でDRMパッケージを行う

Last updated at Posted at 2020-05-24

はじめに

Bento4を使って、アダプティブストリーミングのメディアファイルを作成するまでを紹介します。

Bento4

Bento4は、MP4の結合やMPEG-DASH/HLSの作成が行えるフリーソフトウェアです。

動作環境
Bento4: 1.5.1.629

DRMなし

Profile:Live

入力はMP4ファイルです。mp4fragmentFragmented MP4を生成します。--fragment-duration 2000 --timescale 1000を指定すると2秒間隔のフラグメントが生成されます。
mp4dashでMPEG-DASHのセグメントファイルとマニフェストファイルを作成します。--profiles=liveを指定するとライブ配信向けになります。

Profile-Live
mp4fragment --fragment-duration 2000 --timescale 1000 Bullfinch.mp4 Bullfinch.frag.mp4
mp4dash --profiles=live --use-segment-template-number-padding --use-segment-timeline --mpd-name=Bullfinch.mpd --o out Bullfinch.frag.mp4

Profile:On-Demand

--profiles=on-demandを指定するとオンデマンド配信向けになります。

Profile-On-Demand
mp4fragment --fragment-duration 2000 --timescale 1000 Bullfinch.mp4 Bullfinch.frag.mp4
mp4dash --profiles=on-demand --mpd-name=Bullfinch.mpd --o out Bullfinch.frag.mp4

マルチビットレート

マルチビットレートのセグメントファイルを作成するためには、入力のMP4を映像の解像度毎に分ける必要があります。FFmpegというソフトウェアを使用して、映像と音声の分割、解像度のエンコードを行います。

Multi-Bitrate
ffmpeg -i Bullfinch.mp4 -c:v copy -an Bullfinch.video.mp4
ffmpeg -i Bullfinch.mp4 -c:a copy -vn Bullfinch.audio.mp4
ffmpeg -i Bullfinch.video.mp4 -c:v libx264 -filter_complex "scale=1920:1080" -b:v 4800k Bullfinch.video.1080p.mp4
ffmpeg -i Bullfinch.video.mp4 -c:v libx264 -filter_complex "scale=1280:720" -b:v 2400k Bullfinch.video.720p.mp4
ffmpeg -i Bullfinch.video.mp4 -c:v libx264 -filter_complex "scale=640:360" -b:v 800k Bullfinch.video.360p.mp4
mp4fragment --fragment-duration 2000 --timescale 1000 Bullfinch.1080p.video.mp4 Bullfinch.video.1080p.frag.mp4
mp4fragment --fragment-duration 2000 --timescale 1000 Bullfinch.720p.video.mp4 Bullfinch.video.720p.frag.mp4
mp4fragment --fragment-duration 2000 --timescale 1000 Bullfinch.360p.video.mp4 Bullfinch.video.360p.frag.mp4
mp4fragment --fragment-duration 2000 --timescale 1000 Bullfinch.audio.mp4 Bullfinch.audio.frag.mp4
mp4dash --profiles=live --use-segment-template-number-padding --use-segment-timeline --mpd-name=Bullfinch.mpd --o out Bullfinch.video.1080p.frag.mp4 Bullfinch.video.720p.frag.mp4 Bullfinch.video.360p.frag.mp4 Bullfinch.audio.frag.mp4

DRMあり

DRMパッケージを行う際に、KeyIDとKeyを指定する必要があります。md5sumで16進数の32桁のハッシュ文字列を生成できますので、これをKeyIDとKeyとします。

ハッシュ文字列
date | md5sum

ClearKey

ClearKeyでは、mp4dash--encryption-key=【KeyID】:【Key】でKeyIDとKeyを指定します。--encryption-args="--global-option mpeg-cenc.eme-pssh:true"を付与します。

mp4dash --profiles=live --use-segment-template-number-padding --use-segment-timeline --encryption-key=38261f9e22d691854040d5c3c1aa9479:8df51ed781a87c9870d52c34c9d7b679 --encryption-args="--global-option mpeg-cenc.eme-pssh:true" --mpd-name=Bullfinch.mpd --o out Bullfinch.video.1080p.frag.mp4 Bullfinch.video.720p.frag.mp4 Bullfinch.video.360p.frag.mp4 Bullfinch.audio.frag.mp4

Widevine

Widevineでは、WEB APIをリクエストしてテスト用のライセンスサーバーのキーを取得する必要があります。下記はそのリクエストのPythonスクリプトになります。

テスト用のライセンスサーバーのキー取得
import base64
import json
import requests
import textwrap

print("create key [start]")

signature = "kwVLL4xVh9mnlZlPqiEWN0E+FsvG0y+/oy451XXeIMo="
contentId = "fkj3ljaSdfalkr3j"

contentIdB64 = base64.b64encode(contentId.encode('utf-8'))
reqObjStr = textwrap.dedent('''{{
  "content_id": "{contentId}",
  "tracks": [
    {{ "type": "SD" }},
    {{ "type": "HD" }},
    {{ "type": "AUDIO" }}
  ],
  "drm_types": [ "WIDEVINE" ],
  "policy": ""
}}
''').format(contentId=contentIdB64.decode("ascii"))

reqObjB64 = base64.b64encode(reqObjStr.encode('utf-8'))
reqBodyObjStr = textwrap.dedent('''{{
  "request": "{request}",
  "signature": "{signature}",
  "signer": "widevine_test" 
}}
''').format(request=reqObjB64.decode("ascii"), signature=signature)

url = "http://license.uat.widevine.com/cenc/getcontentkey/widevine_test"
headers = {"content-type": "application/json"}
res = requests.post(url, data=reqBodyObjStr, headers=headers)

resObj = json.loads(res.text)
resResStr = base64.b64decode(resObj["response"])
print(resResStr)
resResObj = json.loads(resResStr)
keyId = base64.b64decode(resResObj["tracks"][0]["key_id"]).encode('hex')
key = base64.b64decode(resResObj["tracks"][0]["key"]).encode('hex')

print("keyId = " + keyId)
print("key   = " + key)

mp4dashwidevine-header=provider:widevine_test#content_id:【Key】#kid:【KeyID】を指定します。

mp4dash --profiles=live --use-segment-template-number-padding --use-segment-timeline --encryption-key=0294b9599d755de2bbf0fdca3fa5eab7:3bda2f40344c7def614227b9c0f03e26  --widevine-header=provider:widevine_test#content_id:666b6a336c6a61536466616c6b72336a#kid:0294b9599d755de2bbf0fdca3fa5eab7 --mpd-name=Bullfinch.mpd --o out Bullfinch.video.1080p.frag.mp4 Bullfinch.video.720p.frag.mp4 Bullfinch.video.360p.frag.mp4 Bullfinch.audio.frag.mp4

PlayReady

PlayReadyでは、mp4dash--playreadyを指定します。

mp4dash --profiles=live --use-segment-template-number-padding --use-segment-timeline --encryption-key=38261f9e22d691854040d5c3c1aa9479:8df51ed781a87c9870d52c34c9d7b679 --playready --mpd-name=Bullfinch.mpd --o out Bullfinch.video.1080p.frag.mp4 Bullfinch.video.720p.frag.mp4 Bullfinch.video.360p.frag.mp4 Bullfinch.audio.frag.mp4

PlayReadyでは、テスト用のライセンスサーバーでは、キーをBase64文字列を使用します。下記のコマンドを実行すると生成できます。

Base64
echo 【ハッシュ文字列】 | xxd -r -p | base64

マルチDRM(Widevine+PlayReady)

mp4dash --profiles=live --use-segment-template-number-padding --use-segment-timeline --encryption-key=0294b9599d755de2bbf0fdca3fa5eab7:3bda2f40344c7def614227b9c0f03e26  --widevine-header=provider:widevine_test#content_id:666b6a336c6a61536466616c6b72336a#kid:0294b9599d755de2bbf0fdca3fa5eab7 --widevine --playready --mpd-name=Bullfinch.mpd --o out Bullfinch.video.1080p.frag.mp4 Bullfinch.video.720p.frag.mp4 Bullfinch.video.360p.frag.mp4 Bullfinch.audio.frag.mp4

おわりに

今回、DRMパッケージについて纏めました。
メディアファイルの再生方法は別の投稿で紹介していますので
是非ご覧ください。ありがとうございました。

関連リンク

参考リンク

以上です。

5
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?