How to create On-Demand HTTP Stream for iPhone


iPhone対応オンディマンド・ストリームの作成方法ですが、簡単に書くと以下の手順になります。

  1. 手持ちのムービーファイルをMPEG-2 TS形式(映像codec:H.264、音声codec:AAC)に変換する。
  2. 変換済みのMPEG-2 TSファイルをSegmenter(セグメンター:ファイル分割ツール)に通し、プレイリストである.m3u8ファイルと、一定時間(例:10秒間)毎の.tsファイルを作成する
  3. .tsファイル群をwebサーバー上の適切な場所へ、m3u8ファイルをiPhoneがアクセスするページへ設置する

問題は道具(ツール)がないことです。正確には、高額の業務用エンコーダー(Inlet Technologies Spinnaker 7000とか)であれば、MPEG-2 TSでH.264/AACなエンコードができますが、Apple純正で無料のQuickTime Broadcasterでは、そういうエンコードはできません。今回は、オープンソースプログラマーのブログの手順に従って、FedoraCore11上にffmpegをインストールし、ffmpegによりMPEG-2 TSへのエンコードを行いました。
MPEG-2 TSについてはVLCを使えば、わざわざFedoraCore11を使わなくてもOSX上で作成可能に思えますが、実際にやってみると、 QuickTimeで正常に再生できるMPEG-4(H.264/AAC)ファイルの縦横比が完全に崩され、縦長の画面になってしまうため、結局利用できませんでした。
また、Segmenterについては、Apple純正のmediasegmenterがあるのですが(要ディベロッパー登録)、これはファイルからの変換を受け付けず、UDPによるMPEG-2 TSストリームからの変換のみになるという、生中継に特化した使いにくいものであるため、ここでも先ほどのブログの手順に従って、ブログの筆者が提供するオープンソースのファイル変換用SegmenterをFedoraCore11にインストールしてファイル分割を行いました。
OS として、FedoraCore11を使っている理由ですが、単純に作者の環境と一致させるためだけです。自分でOSXでのffmpegを試してみたのですが、MacPortでインストールした場合、Segmenterのコンパイル時にライブラリの利用ができなかったので断念しました。ソースから展開したら、うまくいったかもしれませんが、いろいろ試す時間がなかったので、Parallels上のバーチャルマシンにFedoraCore11をインストールし、その上で、ffmpegをyumとかrpmは使わずソースからインストールしました。yumやrpmを使わなかったのはMacPortの場合と同じ理由で、Segmenterのコンパイル時にライブラリの利用ができなかったためです。(ライブラリへのパスを通すだけとか、解決が簡単な障害だったのかも知れませんが、原因追求する時間がなかったので、作者と同じ環境にすることで乗り切りました)
後から知ったのですが、OSX上でffmpegとオープンソースのSegmenterを使い、生中継とオンディマンド配信を達成している事例もあるようなので、OSX上でコンパイルできると思います(すいません、途中で断念して。どなたかOSX上でやってみて下さい。)
ちなみに、WWDCのHTTP Live Streamingについてのセッションビデオ(このビデオ一本だけ買いたかったのだが、WWDCのiPhone全セッション分まとめ売りなので、高くついた)を見ましたが、Appleは、「ハイエンドな企業用途はアプライアンスを使ってもらい、一般ユーザーは(規格を公開しているから)オープンソースプログラマーがツールを作ればいいさ」という割り切った姿勢なので、当面、AppleからはQuickTime Broadcasterのような、一般ユーザー用アプリケーションは登場しそうにない雰囲気です。
それでは、具体的な手順について、FedoraCore11でffmpegとsegmenterをインストール済みの前提で話をします。
1)元の動画を用意し、FedoraCore11へftpで転送
・前のエントリーの通訳音声デモ映像の場合、320×180というサイズのムービーを用意しました
2)ffmpegでエンコード
・GUIではなく、以下の書式のコマンドラインで変換を指定します。

ffmpeg -i 元のムービー.mp4 -f mpegts -acodec libmp3lame -ar 44100 -ab 128k -ac 2 -s 320X180 -vcodec libx264 -b 300k -r 1 -flags +loop -cmp +chroma -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 300k -maxrate 500k -bufsize 500k -rc_eq ‘blurCplx^(1-qComp)’ -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -g 30 -async 2 分割前のTSムービー.ts

(MPEG-2 TSフォーマット、映像:320×180/300kbps/H.264、音声:ステレオ/128kbps/AAC、その他、Segmenter開発者のブログを真似て特殊なパラメーターを付け加えています)詳しくはffmpegの設定一覧を確認して下さい)
3)segmenterで.tsファイル分割及び、プレイリスト作成
・インストール済みのオープンソースなsegmenterを以下の書式のコマンドラインで操作します。

segmenter 分割前のTSムービー.ts 分割後のムービー1つ当たりの秒数 分割後の.tsファイルの名称 m3u8プレイリストファイルの名称 ムービーファイルの置き場のURL

実際に先の通訳デモ音声のために分割した操作の例は以下のとおりです。

segmenter test_04.ts 20 iphone30 iphone30.m3u8 http://iphone.macwebcaster.com/test_02/

(分割前の.tsムービー=test04.ts、ムービー1つ当たりの秒数=20秒、分割後の.tsファイルの名称=iphone30、m3u8プレイリストの名称=iphone30.m3u8、ムービーファイルの置き場のURL=http://iphone.macwebcaster.com/test_02/)
この操作の結果、分割されたファイルは以下のようになりました。
iphone30-00001.ts
iphone30-00002.ts
.
.
.
iphone30-00159.ts
また、iphone30.m3u8というプレイリストが作成され、内容は以下のとおりとなっています。
#EXTM3U
#EXT-X-TARGETDURATION:20
#EXTINF:20,

http://iphone.macwebcaster.com/test_02/iphone30-00001.ts

#EXTINF:20,

http://iphone.macwebcaster.com/test_02/iphone30-00002.ts

#EXTINF:20,
.
.
.
#EXTINF:20,

http://iphone.macwebcaster.com/test_02/iphone30-00159.ts

#EXT-X-ENDLIST
4)以上のファイルをwebサーバーにアップロード
・ここで気をつけることは当然ながら、.tsファイル分割時に指定したURLでアクセスできるようにすることです。.m3u8ファイルの場所はユーザーがiPhoneからアクセスできる限り、特段の指定はありません。
・なお、webサーバー側はmime.typesに以下の設定を付け加えて下さい。

.m3u8 application/x-mpegURL
.ts video/MP2T

・Apacheをお使いの場合(私もFedoraCore上のApacheです)、http.confに以下の設定を付け加えて下さい。

AddType application/x-mpegURL .m3u8
AddType video/MP2T .ts

もの凄く簡略化した、手順の紹介(本来なら、帯域別のムービー分岐とか他にも機能があるのですが、都合により割愛)になってしまい、特にツール部分はLinuxが運用できることが前提になっており、申し訳ありません。ただ、本来ならAppleとか、せめてSorensonあたりが、GUIベースで容易にファイル変換できるSegmenterを出して欲しいところです。
ちなみに生中継も実験したのですが、FedoraCore11を生中継用Segmenterとして使う部分がうまくいかず、頓挫しているので、途中まで(ちなみに映像なしの音声のみの生中継ならできてます)で良ければ、また書きたいと思います。