努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


サイドバー

メニュー

インデックス

documents:other:other-050

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行目に注目。

in01.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]
in02.flv.txt
0000000000000000 46 4C 56 -> FLV
0000000000000003 01 -> version 1
0000000000000004 04 -> Audio 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 2976.201
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.9700467752088
00000000000000F1 ->     audiosamplerate : Number 44100
000000000000010B ->     audiochannels : Number 2
0000000000000123 ->     trackinfo : STRICT Array [2]
0000000000000133 ->         Object
0000000000000134 ->             length : Number 2976201
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 2976168
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]

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>
documents/other/other-050.txt · 最終更新: 2017/09/25 12:18 by k896951

ページ用ツール