
Encrypted Http Live Streaming
自社サイトでiPhone向け動画を配信するにあたり、採用した手法です。
- 参考
HTTP Live Streaming(Encrypt)
ここが詳しいですが、暗号化するとうまく再生できないのでアレンジしています。
iPhone, iPad, iPod – HTTP Live Streaming (HLS) with free tools on Windows
エンコードのオプション等が参考になります。
- 方針
元動画
↓
mpeg2ts
↓
分割
↓
暗号化
↓
再生
- プラットフォーム
Ubuntu 12.04
ffmpeg は apt-get でインストール。
- mpeg2ts化して分割
- 暗号化
- 再生
[code light=”true”] ffmpeg -i ./hoge.3gp -f segment -segment_time 10 -segment_list
hoge.m3u8 -segment_format mpegts -vcodec libx264 -vbsf h264_mp4toannexb -flags
-global_header -r 30 -s 640×480 -qmax 51 -b 300k -g 150 -qcomp 0.7 -qmin 10 -qdiff 4
-subq 6 -me_range 16 -i_qfactor 0.714286 -acodec libmp3lame -ar 48000 -ab 64k -g 30
hoge%05d.ts [/code]
ポイント
-g に フレームレートと同じ値(整数)を指定する。これにより、IDR-Frameがセグメント化された各ファイルの先頭に挿入される。
これをやらないと、暗号化した場合、正常に再生できない。 (暗号化しない場合は、なぜか問題なく再生できる)
キーを作成する
[code lang=”shell” light=”true”]
#/bin/sh
keyFile="key.txt"
openssl rand 16 > $keyFile
[/code]
暗号化する
crypt.sh
[code lang=”shell” light=”true”]
#/bin/sh
hexKey=$(cat $4 | hexdump -e ’16/1 "%02x"’)
hexIV=printf '%032x' $3
openssl aes-128-cbc -e -in $1 -out $2 -p -nosalt -iv ${hexIV} -K ${hexKey}
[/code]
crypt.sh [対象ファイル] [出力先] [連番] [鍵]
ポイント
iv に連番を指定しないとiPhone側での復号がうまくいかず、正常に再生されない。
プレイリスト(m3u8)を作成
[code light=”true”]
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-KEY:METHOD=AES-128,URI="https://[鍵の格納場所]"
#EXTINF:10,
http://[tsファイルの格納場所]
#EXTINF:10,
http://[tsファイルの格納場所]
.
.
#EXT-X-ENDLIST
[/code]
Apache設定
Apacheのmime.types に追加
[code light=”true”]
application/x-mpegURL m3u8
video/MP2T ts
[/code]
confに追加
[code light=”true”]
AddType application/x-mpegURL .m3u8
AddType video/MP2T .ts
[/code]
再生ページ
videoタグで配信
[code lang=”html” light=”true”]
<video src=”http://[プレイリストの格納先]” controls>play</video>
[/code]