2013年1月30日水曜日

flvのmetaデータについてちょっと調査しておく。

flvにはmetaデータというのがあります。0x12からはじまるタグですね。
だいたいは次のような形式になっています。

1バイト データタイプ 0x12固定
3バイト タグサイズ
4バイト timestamp
3バイト トラック番号(0固定)
以降タグデータ
4バイト 終端データ
という形になっています。

で、タグデータの内容ですが、どうやら以下のようになっているみたいですね。

数値
[00] [8バイト] 8バイトのデータの部分はDoubleで書き込むみたいです。
JavaでやるならDoublteToLongBits(数値)で取り出せてlong(javaでは8バイト)で書き込めばOK

Boolean値
[01] [1バイト] 0x01でtrue 0x00でfalse

String値
[02] [2バイト] [データ] 2バイトの部分がshortの形での文字列長、データは単に文字列
日本語が扱えるかは不明

Object型
[03] [文字列の内容データ] [別の要素データ] [文字列の内容データ] [別の要素データ]...
最後は00 00 09でおわる。
という形[文字列の内容データ]という部分は[2バイト] [データ]の塊のこと。

NULL型
[05] これだけ

UNDEFINED型
[06]が予約されている不明

MAP型
[08] [4バイト] [文字列の内容データ] [別の要素データ] の繰り返し Object型の中身と同じ
終わりが00 00 09でおわるところも同じ
始めの4バイトは数値要素数がはいっているのだろうか?Flazrでは0でうめているみたい。


ARRAY型
[0A] [4バイト] [別の要素のデータ]... 4バイトの部分は要素数

DATE型
[0B] [8バイト] [2バイト] 8バイトの部分はunixミリ秒をDoubleのbyte配列にしたもの。
うしろの2バイトは0でうめるみたい。(後ろ2バイトはtimezone?)

LONG_STRING
[0C] [4バイト] [データ] stringと同じだが、長さ指定が4バイトになってる。

UNSUPPORTED
[0D] 不明

で、実際の構成は以下みたいです。
まずonMetaDataという文字列が入ります。
そこに続いてMap型が挿入されます。Map型の中身は上記のデータに従います。
たとえばdurationなら
「00 08 64 75 72 61 74 69 6F 6E」 8バイトでdurationという文字列(key)が入り
「00 40 60 74 39 58 10 62 4E」先頭に0x00があるのでNumber型 うしろの8バイトより131.632という数値であることがわかります。

こんな感じでかかれているみたいですね。

機会があったらCuePointとかKeyFramesついても調査しておきたいところですね。
http://www.buraks.com/captionate/helpfile/e05.html
http://ismano.com/media/documentation/flvmdi.html
この2つがkeyframesの参考になるかな?
どうやら先頭に余計なメッセージをいれることで、シーク可能にするみたいですね。

たしかs3って指定した場所からのデータダウンロードをサポートしているので、keyframe情報をきちんといれておけば
s3からflvの先頭をDL、その後必要なrangeのデータをDLして中途再生とかできそうな予感です。

では、metaデータはこのくらいにして、takStreamingの続きをやるとしよう。

0 件のコメント:

コメントを投稿