というわけでいろいろ考えてみた。
いまのところわかっていること。
・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 件のコメント:
コメントを投稿