2012年6月18日月曜日

jpegmp3ストリーミングについて考えてみた。

jpegmp3のストリーミングをつくって、iPhoneなのに、フルスクリーンではない再生をやってみたいと思っています。
というわけでいろいろ考えてみた。

いまのところわかっていること。
・mp3のストリームはm3u8準拠でできるみたいなので、この再生positionをベースに画像を入れ替えていこうと思う。
・画像は1枚ずつ別の画像にしてしまうと、転送データが大きくなりすぎる懸念があるので、1枚の画像に複数のシーンを書き込んだ画像を準備しようと思う。(160x120の画像を縦に10個、1秒分描くみたいな感じ。)
・mp3のストリームはtsやtakみたいに間近の2、3パケットだけ送ればよいというわけにはいかないみたい。(再生時間がはじめてからの時間になってしまい、jpegとの同期がとれないみたい。)

というわけで現時点での案は次のような感じ。
・mp3の18375000パケットごとにセグメントをループさせる。(ちょうど1分の長さ)
要は1分20秒の画像と3分20秒の画像のindexは同じになる。
・jpeg用のインデックス定義ファイルはjplという拡張子にしておく。jpegListファイル内容は次のとおり。
#JPL-X-MEDIA-SEQUENCE:xx
冒頭の情報が何番目のセグメントであるか定義する。
#JPLINF:1111001111:[jpegファイルへのURL]という形で各要素は定義しておく。
1はフレームが存在する。0はフレームが存在しない(jpegの形式だと黒になる。)
1フレームがちょうど0.1秒分になるので、あとはjavascriptで画像をいれかえていけばOK

例としてはこんな感じ
index.jplの内容例
#JPL-X-MEDIA-SEQUENCE:120
#JPLINF:1110110111:http://49.212.39.17/stest/jpeg/test/120.jpg
#JPLINF:1111111101:http://49.212.39.17/stest/jpeg/test/121.jpg
#JPLINF:1111111111:http://49.212.39.17/stest/jpeg/test/122.jpg
#JPLINF:1011111111:http://49.212.39.17/stest/jpeg/test/123.jpg
#JPLINF:1111100111:http://49.212.39.17/stest/jpeg/test/124.jpg
#JPLINF:0111110111:http://49.212.39.17/stest/jpeg/test/125.jpg

こんなもんで構築できるかな

実際にプログラムをつくったら利用するファイルは以下
m3u8(mp3のストリーム定義)
mp3(mp3のデータ本体)
jpl(jpegのストリーム定義)
jpg(jpegのデータ本体)

mp3のストリームの再生位置を取得しつつjpegデータをcanvasにjavascriptで描きまくるみたいな動作になる予定

また帰宅後にぼちぼちプログラムをしていこうと思う。


おまけ、HttpTakStreamingの今回つくったファイル、ftl fth ftmファイルについて
■ftlファイル(FlvTakListファイル)
#FTH:[fthファイルのアドレス]

ヘッダファイルの定義


#FTM-X-MEDIA-SEQUENCE:xx
開始場所が何番目のシーケンスかの定義
xxは数値この数値と内容リストから、ファイルの結合順を導きだす。

#FTMINF:[ftmファイルのアドレス]
メディアファイルのデータ

■fthファイル(FlvTakHeaderファイル)
バイナリファイルで内容はflvの冒頭定義 + 映像の先頭パケット(AVCのみ) + 音声の先頭パケット(AACのみ)で構築されたファイル

■ftmファイル(FlvTakMediaファイル)
バイナリファイルで内容はflvの各メディアパケット(ただしタイムスタンプに細工あり)

ぶっちゃけると、先頭からファイルを入手すればcat結合でFLVファイルに復元することが可能。

$ cat index.fth > data.flv

$ cat 0.ftm >> data.flv
$ cat 1.ftm >> data.flv
$ cat 2.ftm >> data.flv
$ cat 3.ftm >> data.flv
$ cat 4.ftm >> data.flv
$ cat 5.ftm >> data.flv
$ cat 6.ftm >> data.flv
...
でdata.flvがちゃんとしたflvファイルになる。
これをnetStream.appendByteにむかってやってるのが、HttpTakStreamingになります。

ちなみに転送媒体をファイルではなくrtmfpのノード間通信にしたのが過去の記事のやつです。(p2pで高画質配信したいというやつ。)netGroupでは無理でしたが、netStreamでの転送なら動作可能です。

では、本日の由なしごとでした。

0 件のコメント:

コメントを投稿