簡単な紹介
FLV(フラッシュビデオ)今非常に人気のストリーミングメディアフォーマットで、ビデオファイル、そのコンパクトなサイズに、パッケージングは、ネットワーク上のアプリケーションに適して、簡単な機能を果たし、現在主流のビデオサイトは、例外なく、FLV形式を使用しました。また、Flash Playerのと密接に現在のブラウザと同じように、そう簡単にウェブプレーヤーのFLV動画ということは、理由の人気のFLVの一つです。
FLVは、我々は、バイナリデータのバイトストリームを見ることができるメディアパッケージフォーマットを、ストリーミング。全体として、ファイルヘッダ(ファイルヘッダ)及びファイルボディ(ファイルボディ)は、2つの部分を含むFLVは、一つのファイルは、タグとタグサイズ対の直列で構成されています。
FLV形式の解析
ジェイ( -最初のマップに、これは「イーストウィンドブレーク」でダウンロード)MVビデオの。私はバイナリビューアビューアのバイナリを使用しています。
1.png
ヘッダ
いくつかの部品のヘッド部分
署名(3バイト)+バージョン( 1バイト)+フラグ(1 Bypte)+ DataOffset(4バイト)
- 署名バイト3は、
示されているようにFLV 3文字固定しました。あなたは彼がFLV FLVファイルであると考えるとき、一般的には、その最初の3つの文字を見つけました。 - バージョン1バイトの
FLVのバージョンがマーク。ここでは、されている参照の1 - フラグ1バイトの
コンテンツラベル。ビット0と第二ビット、それぞれ、ビデオおよびオーディオ。の存在(1存在を示し、0は不在を示します)。市参照スクリーンショット0x05
で、00000101
ビデオ、およびオーディオの両方に代わってを。 - DataOffset 4つのバイトは、
FLVヘッダの長さを示します。ここでは、固定の9を見ることができます
体
FLV本体部分は、バックポインタ+タグ構成のシリーズで構成されています
- バックポインタは4バイト、タグサイズの前部に固定されています。
- タグ三種類、ビデオ、オーディオ、スクリプト。
タグ組成
tag type
+ tag data size
+ Timestamp
+ TimestampExtended
+ stream id
+tag data
- 1バイトを入力します。8オーディオ、ビデオに9、スクリプトの18
- タグデータサイズ3バイト。これは、タグデータの長さを表します。streamd IDから数えます。
- Timestreamp 3はバイト。タイムスタンプ
- 1つのバイトをTimestampExtended。タイムスタンプの拡張フィールド
- ストリームID 3がバイト。常に0
- データタグデータ部分
のは、例を分析してみましょう:
最初のタグを参照
のタイプ=の0x12
= 18。スクリプトがあるはずです。
=サイズ0x000125
= 293。長さ293。=
timestreamp 0x000000
。ここではスクリプトがあるので、0である
TimestampExtended =が0x00
。
ストリームID = 0x000000
私たちは、データタグの部分を見てみましょう。
3.png
タグ部門
赤い領域2のバックポインタが、私は、4バイトでマークされています。センターでは、最初のタグです。それはそれを計算する方法は?私たちは、この例でなければなりません。
- まず、最初のバックポインタである
0x00000000
バックは最初のタグであるため、それは、。そこで彼は、0です。 - その後、我々は、我々の以前の形式に基づいてサイズを取得します
0x000125
。これは、ストリームIDを加えた最初のタグの終わりまでに293バイトの背後から言うことです、私たちはどのような数を見てください。24バイト(11 + 9 + 4)の合計前にストリームID。次いで、TAGの一端に、タグ位置の次の開始は、293 + 24 = 137 =です0x13D
。 - 我々は見つける次
0x13D
のアドレスは、それがツールから見つけるのは簡単です、それだけで赤い下線の前にあります。赤色の部分0x00000130
TAGの大きさを表す= 304。 - 最後に、我々は、タグデータ部に293バイト、フロント型、ストリームID及び他のフィールドは、11バイトを占めている、計算します。正確に一致します。
私たちの上に、すでに各タグを分割取る方法を知っています。その後、我々は、タグの具体的な内容を見て
タグの内容
すでに述べたように、タグの3種類を述べました。私たちは一つ一つを見ます
脚本
通常、一つだけのスクリプトタグ、タグは、そのような期間、audiodatarate、クリエイター、幅などとして、店舗情報を使用し、FLV、FLVの最初のです。
まず、スクリプトのデータ型で導入しました。すべてのデータがデータ種別+(データ長)+データ形式がデータ型が存在するかどうかを確認するために1バイトのデータ型、データ長を占め、発生に基づいて、データが帰ってきました。
一般的に、構造体は、2つのAMFタグデータパケットを含みます。AMF(Action Message Format形式)を説明するための均一な形式の異なるタイプのデータは、簡単な言葉で、多くの製品でアドビアプリケーションで、AMF共通のデザインアドビデータのカプセル化形式です。AMFの「onMetaDataを」フラグをロードするために使用されるデータ列の最初のタイプを、カプセル化パケット、およびフラグAdobeはない滞留ここでは、いくつかのAPI呼び出しを持っています。AMF第2のパケット配列型パッケージは、アレイは、オーディオおよびビデオ情報項目の名前と値が含まれています。次のように指定され、それが画像上のデータを参照して理解することができます。
値 | タイプ | 説明 |
---|---|---|
0 | Number型 | 8 Bypteダブル |
1 | ブールタイプ | 1 Bypte BOOL |
2 | 文字列型 | バック長2つのバイト |
3 | オブジェクトタイプ | |
4 | ムービークリップタイプ | |
5 | ヌルタイプ | |
6 | 未定義のタイプ | |
7 | 参照タイプ | |
8 | ECMAの配列型 | 地図に似た配列、 |
10 | 厳格な配列型 | |
11 | 日付タイプ | |
12 | 長い文字列型 | 後ろバイト4の長さ |
4.png
最初の写真は、パッケージAMFを示し
- タイプ=
0x02
対応する文字列 - サイズ=
0A
= 10 -
値= onMetaDataを正確に10バイト。
5.png
二AMF上の写真は
- タイプ=
0x08
对应ECMAアレイタイプ。
地図に似た配列。4は、配列番号後ろバイト。次いで、キーと値のペア、最初は、結合、2バイトの長さです。具体的な内容が続きます。次に、3バイトのタイプ値は、タイプと長さに応じて決定します。
我々は判断できフィギュア、13ペアの合計。
長さの最初の8つのバイトは、持続時間です。値型は、0x004073
最初のバイトが00である、それは、8バイト二重です、。
第2の長さは5バイト幅です。値は、8バイトdouble型です。
ターンで行くことを決意し...
どこでも、我々はすでに、スクリプト内のデータタグのFLVを解釈する方法を知っています。
ビデオ
6.png
=タイプ0x09
= 9。ビデオがあるはずです。
=サイズ0x000030
= 48。48の長さ。=
timestreamp 0x000000
。
= TimestampExtended 0x00
。
ストリームID = 0x000000
:我々は、データセクションを参照
映像+データを
ビデオ情報、1バイト。
図4は、フロントフレームタイプのフレームタイプであります
値 | タイプ |
---|---|
1 | キーフレームのキーフレーム(AVC、シーク可能フレーム用) |
2 | インターフレーム(AVCため、非シークフレーム) |
3 | 使い捨てのフレーム間(H.263のみ) |
4 | 生成されたキーフレーム(サーバーの使用のために予約のみ) |
5 | 映像情報/コマンドフレーム |
エンコードID(CodecIDを)4つの後
値 | タイプ |
---|---|
1 | JPEG(現在未使用) |
2 | ソレンソンH.263 |
3 | 画面の動画 |
4 | On2 VP6 |
5 | アルファチャンネル付きのOn2 VP6 |
6 | 画面のビデオ版2 |
7 | AVC |
特別な事情
ビデオフォーマット(CodecIDをは)AVC(H.264)であり、次いで、VideoTagHeader情報、AVCPacketTypeとCompositionTime以上の4つのバイトであろう。
- AVCPacketType 1つのバイト
値 | タイプ |
---|---|
0 | AVCDecoderConfigurationRecord(AVCシーケンスヘッダ) |
1 | AVC NALU |
2 | 配列のAVC端部(下部レベルNALU配列エンダは必須またはサポートされていません) |
AVCDecoderConfigurationRecord.包含着是H.264解码相关比较重要的sps和pps信息,再给AVC解码器送数据流之前一定要把sps和pps信息送出,否则的话解码器不能正常解码。而且在解码器stop之后再次start之前,如seek、快进快退状态切换等,都需要重新送一遍sps和pps的信息.AVCDecoderConfigurationRecord在FLV文件中一般情况也是出现1次,也就是第一个video tag.
- CompositionTime 占3个字节
条件 | 值 |
---|---|
AVCPacketType ==1 | Composition time offset |
AVCPacketType !=1 | 0 |
我们看第一个video tag,也就是前面那张图。我们看到AVCPacketType =0。而后面三个字节也是0。说明这个tag记录的是AVCDecoderConfigurationRecord。包含sps和pps数据。
再看到第二个video tag
8.png
我们看到 AVCPacketType =1,而后面三个字节为000043
。这是一个视频帧数据。
解析到的数据完全符合上面的理论。
sps pps
前面我们提到第一个video 一般存放的是sps和pps。这里我们具体解析下sps和pps内容。先看下存储的格式(图6):0x01
+sps[1]
+sps[2]
+sps[3]
+0xFF
+0xE1
+sps size
+sps
+01
+pps size
+pps
我们看到图 。
sps[1]=0x64
sps[2]=00
sps[3]=0D
sps size=0x001B
=27
跳过27个字节后,是0x01
pps size=0x0005
=5
跳过5个字节,就到了back-pointers。
视频帧数据
解析出sps和pps tag后,后面的video tag就是真正的视频数据内容了
9.png
这是第二个video tag其实和图8一样,只是我圈出来关键信息。先看下格式
frametype=0x17
=00010111
AVCPacketType =1
Composition Time=0x000043
后面就是NALU DATA
Audio
与视频格式类似
前4位为音频格式
值 | 类型 |
---|---|
0 | Linear PCM, platform endian |
1 | ADPCM |
2 | MP3 |
3 | Linear PCM, little endian |
4 | Nellymoser 16-kHz mono |
5 | Nellymoser 8-kHz mono |
6 | Nellymoser |
7 | G.711 A-law logarithmic PCM |
8 | G.711 mu-law logarithmic PCM |
9 | reserved |
10 | AAC |
11 | Speex |
14 | MP3 8-Khz |
15 | Device-specific sound |
接着2位为采样率
值 | 类型 |
---|---|
0 | 5.5-kHz |
1 | 11-kHz |
2 | 22-kHz |
3 | 44-kHz |
对于AAC总是3
接着1位为采样的长度
值 | 类型 |
---|---|
0 | snd8Bit |
1 | snd16Bit |
压缩过的音频都是16bit
接着1位为音频类型
值 | 类型 |
---|---|
0 | sndMono |
1 | sndStereo |
对于AAC总是1
我们看到第三个TAG
7.png
这个留给大家自己来解析吧。