AWS Elastic TranscoderとKey Management Serviceを使って素敵にHTTP Live Streaming
HTTP Live Streamingとは
HTTP Live Streaming(HLS)というのがあります。
https://developer.apple.com/streaming/
Apple神が作った映像や音声のストリーミングプロトコルです。
ざっくり言うと、音声ファイルを短く分割したリソースファイル(.ts)と、分割したファイルを管理するプレイリストファイル(.m3u8)の2つを使って、HTTPプロトコルにのっとってダウンロードしつつ再生すればいいじゃん、的なやつです。
既存のプロトコルベースだし実装が単純なので色んな所で使われています。
最近だとAbemaTVとか。
これが便利なのは、リソースの暗号化と、回線に応じたリソースファイルの出し分けが規定されているのです。
https://tools.ietf.org/html/draft-pantos-http-live-streaming-20#section-4.3.2.4
https://tools.ietf.org/html/draft-pantos-http-live-streaming-20#section-4.3.4.2
この規定にのっとって、複数のビットレートのリソースファイルと暗号化キーを用意しておけば、あとは何も考えずに対応するプレイヤーにぶち込めが勝手にいい感じに再生してくれる、と。
あら便利。
というわけで、コイツをAWSのElastic Transcoderと、暗号化キーを管理するKey Management Serviceを使って、リソースファイルと暗号化を自動化できないかなー、と思ってやってみたらできたのでメモ。
作り方
- Identity and Access Management(IAM)のページのメニューにある、Encryption keys(日本語だと暗号化キー)の項目からKey Management Serviceに飛ぶ。(わかるかこんなの)
- KMSでで暗号化キーを作る。キモはTranscoderで使うS3のバケットと同じリージョンで作ることと、キー管理者とキーユーザーに”Elastic_Transcoder_Default_Role”を指定すること。これをやらないと何度やってもエンコードエラーになる。
- TranscoderでPipelineを作る。ここではEncryptionの項目に、先程KMSで設定したマスターキーのARNの設定をすること。
- TranscoderのJobを作る。出力するビットレート毎にOutput Detailsを作り、Playlistの項目は一つだけでOutputs in Master Playlistの項目に、Output Detailsで設定したOutputをすべて追加する。
- おもむろにCreate New Jobを押して出来上がりを待つ
確認
ファイルの確認
今回エンコードされたファイルはこんな感じ。
Test001 ├── 160k │ ├── track.key │ ├── track.m3u8 │ ├── track00000.ts │ ├── track00001.ts │ ├── track00002.ts │ ├... │ └── track00064.ts ├── 64k │ ├── track.key │ ├── track.m3u8 │ ├── track00000.ts │ ├── track00001.ts │ ├── track00002.ts │ ├... │ └── track00064.ts └── Test001.m3u8
マスタープレイリストのTest001.m3u8の中身はこんな。
#EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=189000,CODECS="mp4a.40.2" 160k/track.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=89000,CODECS="mp4a.40.5" 64k/track.m3u8
それぞれのリソースのプレイリストはこんな感じ。
#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:11 #EXT-X-KEY:METHOD=AES-128,URI="track.key",IV=0x420473ab30beeaabfe1aa878fda4b312 #EXTINF:10.007800, track00000.ts #EXTINF:10.007789, track00001.ts #EXTINF:9.984567, track00002.ts ... #EXTINF:0.116089, track00064.ts #EXT-X-ENDLIST
問題なさげ。
再生テスト
Test001ディレクトリー以下を全部ダウンロードしてきて、マスタープレイリストをVLCメディアプレイヤーにつっこんだらちゃんと再生できるか確認。
あと、
http://dev.classmethod.jp/smartphone/iphone/network-link-conditioner/
にあるNetwork Link Conditionerを使って回線速度を制限して、ちゃんと64kbpsのファイルがダウンロードされるかどうかを串刺して確認。
できた。