2012年5月12日土曜日

iPhone用のライブストリーミングの話

iphoneではFlashが利用できません。
なのでrtmpをつかったストリーミングでは対応できません。
最近のFlashMediaServerやWowzaMediaServerでは、m3u8の拡張子でうごくHttpLiveStreamingで一応Flashで放送したデータを視聴できるようにできます。

WowzaMediaServerの場合内部コーデック情報が合致する場合にのみ流せるオプションが一応ありますが、動作の安定性とストリームの詳細コントロール(途中でサーバーから切ったり等)がうまくできません。
今日はこのHttpLiveStreamingの話。

まずはすでに検証ずみな話。
1つ目
HttpLiveStreamingでは、m3u8拡張子のファイル(中身はm3u拡張)、利用する動画はtsファイル形式で動作する。
内部のTSファイルは任意の秒数のファイルのつらなりにしておき、最終であるタグまで、延々と再生しようとする。
最終タグがないm3u8ファイルをうけとった場合はリスト上の未取得なtsファイルデータを取得していき、取得完了したら、m3u8ファイルを再度読み直すという動作をする。(なおこの動作はiOSのバージョンや端末によってまちまちである。)

2つ目
よってtsファイルを細かくしてリアルタイムのデータを順次準備して端末に送り続ければ、完了していない動画データ(要するにライブデータのこと)も多少の遅延で送ることができる。
例えばrtmpの場合
[放送プレーヤー]→[red5]→[rtmpdumpでデータをflvにする]→[ffmpegでtsファイルにコンバートする。]→[segmenterでtsファイルを分割する]→端末にデータを届ける
http://svn.assembla.com/svn/legend/segmenter/
(このプログラムはffmpegのバージョンによっては、少々プログラムを書き換えないと動作しないです。)
という一連の流れをつくってやればiphoneで視聴することができるようになる。

3つ目
実はiPhoneはm3uファイルにも対応している。
m3uファイルというのは、単にメディアファイルを並べただけのものです。
http://www.interq.or.jp/blue/inside/mp3/m3u-streaming.html
ここが一番わかりやすかった。
実際にこのフォーマットで動作させると、順繰りにmp3ファイルが再生されました。
mp3cut等をつかってmp3を小さなファイルに変換し、それをベースにm3uにした場合も動作しましたが、途中できれる部分が目立ちました。

4つ目
では、先ほどつくったファイルをm3u8と同じm3u拡張の定義にしたらどうなるかやってみました。
すると、再生できました。3つ目と同じく、中途がきれている感がでますが、どうにか再生できます。ただし、3つ目とは切れ方が若干違う印象を受けました。

ここで疑問点があります。
もしかしたらm3u8の内部ファイルってtsファイルじゃなくてもいいじゃない?

iPhoneのストリーミングをAudioタグに指定した場合mp3等オーディオデータとmp4等動画データでは若干挙動がかわります。
オーディオデータの場合はアプリを切り替えたり、safariのタブを切り替えても音楽は止まりません。
ですが、mp4やtsファイルをベースにした場合は、切り替え時にいったん切れます。
今回4つ目のやり方をやってみたときに内部データをmp3にしたところ、切り替え時に切れませんでした。
もしradiko等で音声を聴く場合には、mp3ベースのm3u8にした方がいい感じの動作になるかもしれません。

さらにmp4フォーマットでもいけるかもしれません。
tsファイルの動画を利用した場合、字幕を載せるのはフォーマット上では可能なんですが、うまい方法がみつかりませんでした。
ですがmp4形式なら簡単に字幕付き動画がつくれました。
mp4形式のm3u8ストリーミングがもしできるなら、字幕選択でコメントデータのON OFFが制御できるかも・・・という淡い期待が・・・

まぁこんなこと考えるのは、会社でストリーミングサービスのiphone視聴担当してるからなんですけどねw

0 件のコメント:

コメントを投稿