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

  3. 暗号化
  4. キーを作成する
    [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]

  5. 再生
  6. 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]

おすすめ記事