akiyoko blog

akiyoko の IT技術系ブログです

Amazon Elastic Transcoder を使って mp4動画を HLS形式に変換する

今回は、Amazon Elastic Transcoder を使って、AWSクラウド上で mp4動画を HLS形式に変換してみたいと思います。
 

1. はじめに

1.1. Amazon Elastic Transcoder とは

Amazon Elastic Transcoder とは、様々なデバイスに対応した動画ファイルをトランスコード(フォーマットや解像度などを変換)できるサービスです。


詳細については、公式の Black Beltシリーズのスライドや AWSブログに詳しく書かれています。


AWSブログ(Elastic Transcoder)


AWS ならではの、完全従量課金、フルマネージド、スケーラブルといったメリットがありますが、何と言っても、シンプルでお手軽というのがユーザにとっては非常にありがたいわけです。


以前、自前(Mac環境)で mp4動画ファイルを HLS形式に変換した際の手順をまとめたのですが、調査や環境構築に予想以上に時間がかかってしまいました。その上、各種ソフトウェアのバージョンによってはうまくいかないこともあったりするので、将来的に他の様々な形式への変換も必要になってくると、管理や運用がますます手間になっていくのが容易に想像できます。それを一手にクラウドに引き受けてもらうというのは、ごく自然な流れなのでしょう。



Amazon Elastic Transcoder を使うには、S3 のバケット(入力側と出力側の 2つ)、Elastic Transcoder Pipeline、Pipeline に紐づく Job を作成する必要があります。

簡単なフローにすると、こうなります。

S3 bucket(入力バケット)
   ↓
Elastic Transcoder Pipeline
   ↓
Elastic Transcoder Job
   ↓
S3 bucket(出力バケット)


 

1.2. HLS (HTTP Live Streaming) とは

HLS (HTTP Live Streaming) とは、以下のような特徴を持つ HTTPベースのストリーミング方式です。

HTTP Live Streaming (HLS) は、ストリーミングを最適化するためにメディアフィルをセグメント化するプロトコルです。HLS によって、メディアプレーヤーでは、再生時にネットワーク接続でサポートされている最高品質の解像度でセグメントを再生できます。


HLS のコンテンツ保護 | Amazon Elastic Transcoder 開発者ガイド」より

HLS はセグメント化された H.264 MPEG-2 TS 動画および M3U8 ディスクリプター ファイルを使って、アダプティブ ビットレート ライブやオンデマンド動画を配信します。M3U8 ファイルとはインデックスで、クライアントは特定の時間においてどのストリームやどのセグメントが利用できるかを知ることができます。デバイスは主要なマニフェスト ファイルから、帯域幅と CPU の制約に基づいて最も適切なストリームを自動的に選択し、セグメントをダウンロードし、それを再生バッファに付加します。

HLS はその名の通り HTTP を通してデータを送信します。それにより RTP または RTMP 等従来のストリーミング プロトコルにおいていくつかの点で改善され、それらには以下が含まれます。

  • インフラ コストの削減
  • CDN および他の HTTP キャッシング インフラにおける「キャッシュ可能性」
  • プロキシおよびファイアウォールの制約による脅威が少ない
  • クライアントの経験則からのリアルタイムの最適化(アダプティブ ビットレート)
  • ビルトインされた冗長性
  • 簡単な HTML5 プレーヤー実装


HLS ガイド | Brightcove Zencoder」より


また、少し調べた限りでは、HLS は、ストリーミング配信する際のデータ配信方式として現在のところ最有力ではないかと言われているようです。

f:id:akiyoko:20150613221948p:plain
(「AWS Solutions Architect ブログ: Amazon CloudFrontを利用した動画配信入門」より)


他の参考資料


 

1.3. HLS の推奨解像度

料金 - Amazon Elastic Transcoder (クラウドでのメディア & 動画変換)| アマゾン ウェブ サービス(AWS 日本語)」によると、Amazon Elastic Transcoder の東京リージョンでの料金は、

  • 標準解像度 – SD(720p 未満の解像度) $0.017 /分
  • 高解像度 – HD(720p 以上の解像度) $0.034 /分

となっています。

解像度が 720p 以上かどうかは、HLS のプリセット設定をマネジメントコンソールでチェックするか、以下のスライドのプリセット一覧を見ればよいかと。おそらく、標準解像度と高解像度の境目は、「HLS 1.5M」と「HLS 2M」の間にありそうです。




 

2. mp4のサンプル動画を用意する

Elastic Transcoder で変換する元ファイル(mp4)を用意します。
今回は、NHKクリエイティブ・ライブラリー の動画素材を使ってみます。


NHKクリエイティブ・ライブラリー


ここにある素材は、自由にダウンロードして利用できるだけでなく、編集・加工、アップロード(公衆送信)なども可能です。ただし、商用利用や販売などはできませんので注意が必要です。

(2)著作者名の表示
「NHKクリエイティブ・ライブラリー」の創作用素材であること、または創作用素材を利用して作った作品であることを示すため、自分の作品の中で著作者の名前(※2)を表示しなければなりません。
表示は自分の作品の中で表示するか、容易にわかるように自分の作品と共に表示してください(※3)。
(※2)基本的に創作用素材の著作者は「NHK」です。「NHK」もしくは「NHKクリエイティブ・ライブラリー」と表示してください。
ただし、創作用素材の中で、NHK以外の著作者の表示を求めているものは、それに従った表示をしてください。
(※3)映像素材には、「NHK CREATIVE LIBRARY」のロゴマークが付いています。このロゴマークを消さずに利用すれば、「NHK」の著作者名を省略することができます。


創作用素材の利用規約より抜粋


 
これ以降、でダウンロードした mp4動画ファイル(音声付き 0:53)を使って、検証していきます。





3. Elastic Transcoder を使う

前置きはこのへんにしておいて、実際に Amazon Elastic Transcoder を使っていきます。


S3 の入力バケット/出力バケットのツリー構造は、最終的にはこのようにします。

【入力バケット】

app1-transcoder-in/
 └─MP4/
   ├─D0002021500_00000/sample.mp4
   ├─D0002021501_00000/sample.mp4
   ・
   ・

【出力バケット】

app1-transcoder-out/
 └─HLS/
   └─1M/
     ├─D0002021500_00000/
     │  ├─sample.m3u8
     │  ├─sample00000.ts
     │  ├─sample00001.ts
     │  ├─sample00002.ts
     │  ├─sample00003.ts
     │  ├─sample00004.ts
     │  ├─sample00005.ts
     │  └─playlist.m3u8
     │
     ├─D0002021501_00000/
     ・
     ・

 

3.1. S3バケットを作成

まずは、トランスコードする前に、入力バケットと出力バケット(バケット名は大文字不可)を用意します。

入力バケット: app1-transcoder-in
出力バケット: app1-transcoder-out

f:id:akiyoko:20150613152352p:plain


入力バケットには、変換元となる動画ファイルをアップロードしておきます。

f:id:akiyoko:20150613152416p:plain


出力バケットには、配下のフォルダは作成しておく必要はありません。

f:id:akiyoko:20150613152431p:plain




 

3.2. Pipeline を作成

サービス一覧から、「Elastic Transcoder」を選択します。

f:id:akiyoko:20150613152504p:plain


「Create a new Pipeline」をクリック。
ちなみに、Elastic Transcoder のコンソールは現時点ではまだ日本語化されていません。
f:id:akiyoko:20150613152514p:plain


全般設定

Pipeline Name HLS Transcode Main パイプライン名。任意
Input Bucket app1-transcoder-in 入力バケット
IAM Role Create console default role 「Elastic_Transcoder_Default_Role」という名前のIAMロールが作成される

 
変換後動画保存用のバケット設定

Bucket app1-transcoder-out 変換後の動画の出力バケット
Storage Class Standard 低冗長化ストレージを使うかどうか

 
サムネール画像用のバケット設定

Bucket app1-transcoder-out サムネール画像の出力バケット
Storage Class Standard 低冗長化ストレージを使うかどうか

f:id:akiyoko:20150613152532p:plain


参考


 

3.3. Job を作成

「Create New Job」をクリックして、Job を作成します。
f:id:akiyoko:20150613152556p:plain

全般設定

Pipeline HLS Transcode Main パイプラインを選択
Input Key MP4/D0002021500_00000/sample.mp4 変換するファイル名
Output Key Prefix HLS/1M/D0002021500_00000/ 作成されるファイルの先頭に付けられる名前

Output Details (1 of 1)

Preset System preset: HLS 1M 任意のプリセットを設定
Segment Duration 10 分割されるセグメントの再生時間。1〜60(秒)を指定
Output Key sample 変換結果ファイルとプレイリストの先頭に付けられる名前。拡張子は自動で付与

Playlist (1 of 1)

Master Playlist Name playlist プレイリストファイル名。拡張子(.m3u8)は自動で付与
Playlist Format HLSv3 HLSのバージョン。v3 か v4 を選択
Outputs in Master Playlist sample 「Output Key」を選択

f:id:akiyoko:20150613152611p:plain


Job Status が「Complete」になれば完了です。
エラーの場合はエラーの内容が表示されます。
f:id:akiyoko:20150613152625p:plain


参考


出力バケットに、プレイリストと tsファイルが生成されました。

f:id:akiyoko:20150613152637p:plain



なお、生成された playlist.m3u8, sample.m3u8 は以下のようになりました。

playlist.m3u8

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1132000,RESOLUTION=640x360,CODECS="avc1.4d001f,mp4a.40.2"
sample.m3u8

sample.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:13
#EXTINF:12.078744,
sample00000.ts
#EXTINF:9.009011,
sample00001.ts
#EXTINF:9.009011,
sample00002.ts
#EXTINF:12.012011,
sample00003.ts
#EXTINF:9.009011,
sample00004.ts
#EXTINF:2.068733,
sample00005.ts
#EXT-X-ENDLIST



ちなみに、Playlist を指定しない場合には、m3u8ファイルは、以下の sample.m3u8 のみが生成されます。

sample.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:13
#EXTINF:12.078744,
sample00000.ts
#EXTINF:9.009011,
sample00001.ts
#EXTINF:9.009011,
sample00002.ts
#EXTINF:12.012011,
sample00003.ts
#EXTINF:9.009011,
sample00004.ts
#EXTINF:2.068733,
sample00005.ts
#EXT-X-ENDLIST



 

3.4. Safari で動作確認

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Video Test | akiyoko blog</title>                                                               
</head>
<html>
<body>
  <video width="480" height="270" preload="none" controls src="HLS/1M/D0002021500_00000/playlist.m3u8">
  </video>
</body>
</html>

を app1-transcoder-out バケット直下にアップロードし、以下のバケットポリシーを追加して、Website Hosting 設定を有効化しておきます。

{
	"Version": "2012-10-17",
	"Id": "Policy1434205866635",
	"Statement": [
		{
			"Sid": "Stmt1434205863076",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::app1-transcoder-out/*"
		}
	]
}


Safari (on Mac) で、
http://app1-transcoder-out.s3-website-ap-northeast-1.amazonaws.com/
にアクセスしてみます。

f:id:akiyoko:20150613235412p:plain


問題なく再生することができました。


なお、Chrome (on Mac) は HLS再生に対応していないため、当然ながら動画を再生することができませんでした。

f:id:akiyoko:20150613235633p:plain


 

4. まとめ

mp4形式の動画を HLS形式に変換するのに Amazon Elastic Transcoder を使ってみましたが、自前で環境を構築する必要がないため、とても手軽に使うことができるという印象でした。Amazon S3 と連携しているのも、非常に大きなメリットです。

今回は AWS が用意しているデフォルトのプリセットを使ったのですが、デフォルトのプリセットでは、動画の変換と同時にサムネイル画像を作成する場合には若干ながら不都合(画質が粗い)があります。しかしながら、プリセットも独自にカスタマイズすることができます(1アカウントあたり50個まで)。

使い方に慣れてしまいさえすれば、Amazon Elastic Transcoder は強力な動画変換ツールとして活用することができると思います。

是非お試しあれ。