FLVファイルをテキストにダンプして内容を可視化する
2017/09/22
「大量にいじるからビット立てツールのGUI版クレや!」と言われてGUI版を作成しました。
2017/02/26 作成
「2つの動画ファイル、どちらもVLC media playerで動画再生できるのに、編集ツールに取り込むと片方がAudio Onlyになるんだけど…」 と持ち込まれた FLV形式のムービーファイル構造を見易くするためにとりあえず作ったやっつけツールです。
http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf の資料を基に作成しました。
ダウンロード
FlvDumper.exe 2017-03-02版 .NET Framework 4.5.2で作成。.NET Framework 4.6 でも動くと思う
VideoTag存在bitを立てるツール .NET Framework 4.5.2で作成。.NET Framework 4.6 でも動くと思う
VideoTag存在bitを立てるツールGUI版 .NET Framework 4.5.2で作成。.NET Framework 4.6 でも動くと思う。D&Dでファイルを登録して使う。
flvdumper.exe は引数無しで実行するとヘルプが出ます。
注意
暗号化されたFLV形式ファイルには対応できていません。Encription TAG を考慮していないので、このツールに喰わせると途中でおかしな表示になります。
使い方
FlvDumper
アーカイブを解凍して C:\work フォルダに FlvDumper.exe をコピーしたのであれば以下のコマンドラインでFLVファイル hoge.flv の内容をテキストファイルにダンプします。
C:\work> FlvDumper hoge.flv
ダンプした結果はテキストファイル hoge.flv.txt に出力されます。ログが hoge.flv.time.txt に出力されます。既に同名のファイルがあれば上書きされるので注意してください。
ダンプ結果が出力された hoge.flv.txt はこんな感じになります。
0000000000000000 46 4C 56 -> FLV 0000000000000003 01 -> version 1 0000000000000004 05 -> Audio tags are present,Video tags are present 0000000000000005 00 00 00 09 -> DataOffset 9 ================ =============================================================================================== 0000000000000009 00 00 00 00 -> PreviousTagSize 0 000000000000000D 12 -> ScriptData tag,No pre-processing required 000000000000000E 00 01 EE -> DataSize 494 0000000000000011 00 00 00 -> TimeStamp 00:00:00 0000000000000014 00 -> TimeStampExtended (00:00:00) 0000000000000015 00 00 00 -> StreamId 0 0000000000000018 -> onMetaData : ECMA Array [0] 000000000000002A -> duration : Number 2743.099 000000000000003D -> moovPosition : Number 36 0000000000000054 -> width : Number 832 0000000000000064 -> height : Number 468 0000000000000075 -> videocodecid : String "avc1" 000000000000008A -> audiocodecid : String "mp4a" 000000000000009F -> avcprofile : Number 77 00000000000000B4 -> avclevel : Number 31 00000000000000C7 -> aacaot : Number 2 00000000000000D8 -> videoframerate : Number 29.969753187909 00000000000000F1 -> audiosamplerate : Number 44100 000000000000010B -> audiochannels : Number 2 0000000000000123 -> trackinfo : STRICT Array [2] 0000000000000133 -> Object 0000000000000134 -> length : Number 2743099 0000000000000145 -> timescale : Number 1000 0000000000000159 -> language : String "eng" 0000000000000169 -> sampledescription : STRICT Array [1] 0000000000000181 -> Object 0000000000000182 -> sampletype : String "avc1" 0000000000000195 -> [object end marker] 0000000000000198 -> [object end marker] 000000000000019B -> Object 000000000000019C -> length : Number 2743070 00000000000001AD -> timescale : Number 1000 00000000000001C1 -> language : String "eng" 00000000000001D1 -> sampledescription : STRICT Array [1] 00000000000001E9 -> Object 00000000000001EA -> sampletype : String "mp4a" 00000000000001FD -> [object end marker] 0000000000000200 -> [object end marker] 0000000000000203 -> [object end marker] ================ =============================================================================================== 0000000000000206 00 00 01 F9 -> PreviousTagSize 505 000000000000020A 09 -> Video tag,No pre-processing required 000000000000020B 00 00 2C -> DataSize 44 000000000000020E 00 00 00 -> TimeStamp 00:00:00 0000000000000211 00 -> TimeStampExtended (00:00:00) 0000000000000212 00 00 00 -> StreamId 0 0000000000000215 17 -> AVC,key frame AVC(seekable frame) 0000000000000216 00 -> AVC sequence header 0000000000000217 00 00 00 -> CompositionTime 00:00:00 000000000000021A 01 4D 40 1F FF E1 00 18 67 4D 40 1F EC A0 68 1E FC F8 08 80 00 00 03 00 80 00 0B B5 07 8C 18 CB 000000000000023A 01 00 04 68 EF BC 80 ================ =============================================================================================== 0000000000000241 00 00 00 37 -> PreviousTagSize 55 0000000000000245 09 -> Video tag,No pre-processing required 0000000000000246 00 06 F7 -> DataSize 1783 0000000000000249 00 00 00 -> TimeStamp 00:00:00 000000000000024C 00 -> TimeStampExtended (00:00:00) 000000000000024D 00 00 00 -> StreamId 0 0000000000000250 17 -> AVC,key frame AVC(seekable frame) 0000000000000251 01 -> AVC NALU 0000000000000252 00 00 21 -> CompositionTime 00:00:00.0330000 0000000000000255 00 00 06 EE 65 88 82 00 06 BF FA 7F C2 55 FF 02 8E FE 56 3D F5 9B E4 DB DF 58 BC E3 2D 46 F2 09 0000000000000275 3B 80 42 51 7D A0 01 61 21 DD 47 8D A7 59 CB 5E 48 09 0D D4 73 5A D1 67 28 58 F8 9B B8 60 AB 07 0000000000000295 38 57 11 B6 DF 67 A8 79 77 BF E1 93 0A 54 E3 53 0F AC 4D BE F9 C1 2A FF 57 6F 50 FD D3 7C 6A B3 00000000000002B5 47 1A 4D AD 8D 2A 83 E3 BC 0B CC BB 68 DA B9 02 00 01 66 DC D4 6C 80 AC 1D DC 46 F2 47 4D 0A B8 00000000000002D5 8C CA EF 47 4B D5 8E 93 73 37 55 54 5E EC 1F 3B 80 9D BF F3 6B ED 48 A2 66 61 6D 77 F0 FC 5F 61 00000000000002F5 B9 C8 57 8C 82 48 F1 91 B5 41 4D 38 29 FD 57 48 B6 AC FD 7D F7 9D D7 B8 E3 F9 73 E2 82 4B 5B 9C 0000000000000315 92 3E FF 21 D3 BE 93 3E 4B 2C 2A 89 00 4D F0 ED FE E1 BA 74 17 0E 32 EE 42 88 01 7B B6 F9 1B 65 0000000000000335 E4 BC 44 9B D0 10 D0 59 37 B5 57 18 CC A2 95 3A 82 C6 1D 6A 4D 8C 02 B2 D5 8D C9 9A 32 67 81 A1 0000000000000355 D4 88 CF 10 AE DE 09 79 0E 7D 83 10 12 DB C7 39 7F B4 FF E5 A7 51 BA 1A 4B A1 CC 40 3C 7C 8E F7 0000000000000375 34 E0 AF F2 FA C1 0F C8 DA D2 66 09 D3 2C 01 7A 68 46 1B BB E6 1E 23 45 6F 36 9A 89 38 11 5D F3 0000000000000395 86 1D 55 B3 50 99 6B 99 A6 8D 9F B4 59 33 53 1B 4E 32 CF 19 7F 59 04 A8 EB CF C2 C0 81 CA 57 CD : : ================ =============================================================================================== 00000000110BF9B6 00 00 01 E1 -> PreviousTagSize 481 00000000110BF9BA 08 -> Audio tag,No pre-processing required 00000000110BF9BB 00 00 08 -> DataSize 8 00000000110BF9BE 29 DB 07 -> TimeStamp 00:45:43.0470000 00000000110BF9C1 00 -> TimeStampExtended (00:45:43.0470000) 00000000110BF9C2 00 00 00 -> StreamId 0 00000000110BF9C5 AF -> AAC,44 kHz,16bit samples,Stereo sound 00000000110BF9C6 01 -> AAC raw 00000000110BF9C7 27 00 03 20 64 1C ================ =============================================================================================== 00000000110BF9CD 00 00 00 13 -> PreviousTagSize 19 00000000110BF9D1 08 -> Audio tag,No pre-processing required 00000000110BF9D2 00 00 00 -> DataSize 0 00000000110BF9D5 29 DB 07 -> TimeStamp 00:45:43.0470000 00000000110BF9D8 00 -> TimeStampExtended (00:45:43.0470000) 00000000110BF9D9 00 00 00 -> StreamId 0 ================ =============================================================================================== 00000000110BF9DC 00 00 00 0B -> PreviousTagSize 11 00000000110BF9E0 09 -> Video tag,No pre-processing required 00000000110BF9E1 00 00 C4 -> DataSize 196 00000000110BF9E4 29 DB 1A -> TimeStamp 00:45:43.0660000 00000000110BF9E7 00 -> TimeStampExtended (00:45:43.0660000) 00000000110BF9E8 00 00 00 -> StreamId 0 00000000110BF9EB 27 -> AVC,inter frame AVC(non-seekable frame) 00000000110BF9EC 01 -> AVC NALU 00000000110BF9ED 00 00 00 -> CompositionTime 00:00:00 00000000110BF9F0 00 00 00 BB 01 9E 61 44 1A FF FE FF 5E 84 7C C0 AF 04 8E 69 82 17 FB B4 0C 4C EE 32 8F 02 25 55 00000000110BFA10 3D 5D 70 B9 E8 D6 6C 73 00 17 40 88 DA 0E 27 C9 53 AA 0B D1 C4 D2 1F DE 2B 65 23 F2 32 BB CB AC 00000000110BFA30 52 6C 1F 8A C6 9A 52 9B 0A 1D 35 5C E4 8D 8F A3 64 C7 A2 28 FB 93 68 4D 7A 3B 10 28 CE 77 49 4A 00000000110BFA50 9F F2 5B 73 B6 C1 BA F0 FC 01 4A A5 C4 01 53 27 2E 9B 7B 00 D2 80 9C 8B 48 C6 53 39 64 86 3E FE 00000000110BFA70 DD E2 C1 A9 02 A7 7D BE 87 B2 8E 71 EB 40 F9 AF 0F 7F 93 B5 08 DC 6C A2 62 AE C0 87 1A B8 50 B9 00000000110BFA90 45 5D 38 F4 CA 9C BF 5F BC 34 38 9A F0 58 93 C1 50 13 79 0E 4F 4A 23 D4 8E A0 33 2A DF C3 68 ================ =============================================================================================== 00000000110BFAAF 00 00 00 CF -> PreviousTagSize 207 00000000110BFAB3 09 -> Video tag,No pre-processing required 00000000110BFAB4 00 00 05 -> DataSize 5 00000000110BFAB7 29 DB 1A -> TimeStamp 00:45:43.0660000 00000000110BFABA 00 -> TimeStampExtended (00:45:43.0660000) 00000000110BFABB 00 00 00 -> StreamId 0 00000000110BFABE 17 -> AVC,key frame AVC(seekable frame) 00000000110BFABF 02 -> AVC end of sequence 00000000110BFAC0 00 00 00 -> CompositionTime 00:00:00 ================ =============================================================================================== 00000000110BFAC3 00 00 00 10 -> PreviousTagSize 16
ScriptData tagに動画の情報が入っています。また、Audio tag、Video tag が入り混じっていて、各々のタグの格納データを抜き出せば映像と音声を分離できそうだなーというのもわかります。
「ffmpegとかで確認できそうじゃね?」とかいうあなた、駄目だったからこんなツール作ってんですよ。
ちなみに、持ち込まれたデータはffmpeg判定では壊れているファイルと判定され、満足な情報は表示されませんでした。
余談
最初に相談された件についてはたぶん原因がわかりました。
動画と判定されるファイルを in01.flv(in01.flv.txt)、音声のみと判定されるファイルをin02.flv(on02.flv.txt)とします。
最初の3行目に注目。
|
|
in02.flvの方は、Audioのみ、とヘッダにあります。これをあてにして動作するソフトウエアは…そりゃそうなりますわな。
in02u.flv は in02.flv のコピーをバイナリエディタで開いて先頭から5バイト目にVideoがあるよフラグを立てた(04→05に変更した)もので、こちらは動画ファイルと認識してますね。
VLC media player がどれだけFLVファイルで苦しめられてきたのかわかる気がする。
Videoタグビット立てツール
Audio onlyになるFLVファイルのVideoタグビットを立てるツール SetFlvVideoTagBit、SetFlvVideoTagBitWin を公開しておきます。
使い方はこんな感じ。
F:\mergestore>SetFlvVideoTagBit in02c.flv set videoTag bit : in02c.flv F:\mergestore>SetFlvVideoTagBit in20c.flv.txt not flv format : in20c.flv.txt F:\mergestore>
先頭3バイトが 'F' 'L' 'V' かどうか見てるだけなので、FLVファイル以外に適用しないように。
GUI版の SetFlvVideoTagBitWin.exe は、処理対象ファイルをGUIの白い枠(リスト)へドラッグ&ドロップしてから、処理開始ボタンを押します。
処理終了後もチェックが外れなかったファイルは処理が行われなかったファイルです。
※プログラムにより壊れているFLVファイル、もしくはFLVファイルではないかもしれないファイルと判断されました。
その他
最初に見つかるscriptdata tagだけほしい場合は
C:\work>FlvDumper hoge.flv -mix:script:metaonly
としてください。scriptdata tagが複数ある場合(があるのかどうかはわかりませんが)は、諦めて全部出しましょう。
ScriptData tag の部分のデータもダンプしたいときは、
C:\work>FlvDumper hoge.flv -mix:mix
もしくは
C:\work>FlvDumper hoge.flv -mix:separate
としてみてください。
おまけなので詳しい説明はしません。
C:\work>flvdumper usage: FlvDumper flvfile [-opt1[:opt2[:opt3]]] example FlvDumper moviefile.flv -mix:script -> create moviefile.flv.txt options opt1 Audio, Video Tag dump mix : HexDump and information displayed on a same line *DEFAULT separate : HexDump and information displayed on a separate line script : Display information only opt2 ScriptData Tag dump mix : HexDump and information displayed on a same line separate : HexDump and information displayed on a separate line script : Display information only *DEFAULT opt3 Tag dump filter all : no filter *DEFAULT metaonly : ScriptData Tag only audio : Audio Tag only video : Video Tag only other : other Tags C:\work>