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 でインストール。

  1. 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 640x480 -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がセグメント化された各ファイルの先頭に挿入される。
     これをやらないと、暗号化した場合、正常に再生できない。 (暗号化しない場合は、なぜか問題なく再生できる)

  2. 暗号化 キーを作成する
    [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]
20. 再生

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”] [/code]