2013年4月16日火曜日

HttpLiveStreamingとmp4の動作の違いについて

youtubeの動画をiphoneでみると、mp4のデータが視聴できます。

今回はこのmp4と僕が好きなmpegtsベースのHttpLiveStreamingという形式の違いについてです。

まずはmp4
mp4はxmlみたいなタグ+データの形式のコンテナです。webmのmatroskaも似た感じです。
たいていのデータは詰め込むことができますが、一番メジャーなのは、h.264 + aacの組み合わせです。3gpというちょっと前の携帯電話で扱える動画なんかも基本mp4だし、adobeが出しているhttpDynamicStreamingやf4vもベースはmp4です。

データの中身は大きくわけでmoovとmdatに分かれます。moovは本でいうところの目次にあたる部分で、シークしたりするときにどこにデータがあるかという情報が書かれています。mdatはメディアデータの実データ部分になります。
ffmpegでコンバートした場合、mdatの後にmoovが出力されますが、moovが先頭にある方が、シーク等に有利なので通常はMP4Boxあたりを利用して、入れ替えます。
例:Flashで再生させるとき、moovが後にあると、全部読み込まないと再生が始まりませんが、moovが前にある場合はすぐに再生が始まります。

iPhoneでmp4にアクセスした場合は、はじめにmoovのデータをダウンロードしようとします。それが完了すると、再生がはじまります。なお、3Gの状態でこのmoovの部分が基底時間以内にDLできない場合timeoutになります。サーバーが原因のtimeoutかクライアントが原因のtimeoutかはまだわかっていません。


続いてHttpLiveStreaming(略してHLS)
こちらはmpegをベースにしたストリーミング規格です。内部データとしては、mp3やmpegtsが対応しています。以前mp4でつくろうとしたことがありますが、mp4では残念ながら無理でした。
こちらはmpegデータを複数のファイルに分割し、それを順番にDLしては再生させることで動作します。また、その複数ファイルを管理するindexファイルが必要になります。

index用のファイルがm3u8ファイル、実データは*.tsもしくは*.mp3となります。
appleの公式ではたしか、30秒ごとに区切ったデータがよいみたいなことが書いてあったかと思うのですが、別に1秒で区切ってもOKです。
ライブストリームを配信する場合にはなるべく短くした方がよりリアルタイムになりますが、逆にデータの複合に失敗しやすくなるという問題もあります。(僕がつくったjsegmenterとかの分割プログラムでは、keyFrameに注意してそのあたり対処してあります。)

mp4のmoovと違い、m3u8ファイルは非常にサイズが小さいので、再生開始時のオーバーヘッドが小さく、3Gでもさくさくっと再生開始ができるという利点があります。


で、どの両者の違いについて・・・特にmusicTubeをやっているのでaudioの場合の違いについて。です。
1:Flashでの再生
mp4は再生できて、hlsは再生できない。
単に対応していないだけです。ただし、iOSアプリをAirから起こした場合は再生可能になります。
2:iPhoneでの再生
aacベースのmp4は普通に再生できます。aacのmpegtsベースのhlsは再生できません。
mp3ベースのhlsは再生できました。もちろんaudio扱いになるので、両者とも、別のアプリに移動しても流しっぱなしにできます。
前は確かaacのmpegtsベースのhls再生可能だったはずです。動画のBGM再生つぶされたときについでにつぶされたのかもしれません。
確認したブラウザはchrome Mercury Sleipnir Safariについて調べてあります。operaはたぶん、safariで再生させられることになると思います。
3:androidでの再生
nexus7のchrome, opera, firefoxで調べてみました。
まずmp4
chrome、OK
opera、DLになる。
firefox、OK
続いてHLS
chrome、OKだが、accのmpegtsベースのみ、かつ再生中に別のアプリには移動できない。mp3ベースはエラーになる。
operaとfirefoxはm3u8ファイルのDLになる。
4:3G状態での再生について(iPhone)
 mp4は始めのmoovのDLがきついときがある、ただし、それがDLできてしまえばメモリー上に乗るので、その後はメディアデータに専念できる。
よって、wifi状態でmoovだけ落としてからでかければ比較的快適に視聴できる。
HLSより先読みがしっかりされるので、地下鉄とか乗っていてもつっかかりにくい感じがする。
 HLSは開始時の動作がスムーズ。ただし、内部の分割データにも余計な情報が乗っているのであとで落とすデータが少々大きめ。(あまり違いないけど。)
ファイルベースで先読みするのでmp4より先読みは弱め。(mp4は細かくDL、hlsは大雑把にDL)よって地下鉄等でDLがとまると、つっかかることあり。

youtubeにiphoneでアクセスするとmp4で落ちてくるのでmusicTubeのサーバーサイドアプリでは、iphoneとyoutubeの間に入ってproxyサーバーとしてデータの転送をしつつmp4から映像データを取り去ることで、audioデータとして動作し、bgmとして再生できるようにしています。
で、いま最大の不満は外出中の3Gの状態でトラック遷移がうまくいかなかったり、長いデータの再生ができないことがある・・・ということです。
hlsにすると再生のオーバーヘッドが減りますからね。一度試してみたいんですが調査した結果mp3onlyになってしまったのでちょっと難しい話になってきました。
どうするかなぁ・・・

0 件のコメント:

コメントを投稿