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を使って、リソースファイルと暗号化を自動化できないかなー、と思ってやってみたらできたのでメモ。

作り方

  1. Identity and Access Management(IAM)のページのメニューにある、Encryption keys(日本語だと暗号化キー)の項目からKey Management Serviceに飛ぶ。(わかるかこんなの)
  2. KMSでで暗号化キーを作る。キモはTranscoderで使うS3のバケットと同じリージョンで作ることと、キー管理者とキーユーザーに”Elastic_Transcoder_Default_Role”を指定すること。これをやらないと何度やってもエンコードエラーになる。
  3. TranscoderでPipelineを作る。ここではEncryptionの項目に、先程KMSで設定したマスターキーのARNの設定をすること。

  1. TranscoderのJobを作る。出力するビットレート毎にOutput Detailsを作り、Playlistの項目は一つだけでOutputs in Master Playlistの項目に、Output Detailsで設定したOutputをすべて追加する。

  1. おもむろに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のファイルがダウンロードされるかどうかを串刺して確認。

できた。

Pocket

shun

iOSアプリ作ってます。 元宇宙工学エンジニア。 なんでもやるよ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です