オーディオとビデオのFLVフォーマット分析

フォーマットの紹介

概要概要

FLVはストリーミングメディアのカプセル化形式であり、そのデータをバイナリバイトストリームと見なすことができます。

一般的に、FLVには、ファイルヘッダーとファイル本文の2つの部分があります。ファイル本文は、一連のタグとタグサイズのペアで構成されます。FLVファイル形式

  • 以下に示すように、UltraEditでFLVファイルを開きます
    バイナリーファイル

1.ファイルヘッダー

FLVヘッダー

46 4C 56 01 05 00 00 00 09
ヘッダー部分は、Signature(3バイト)+ Version(1バイト)+ Flags(1バイト)+ DataOffset(4バイト)の部分で構成されます。

  • 署名:3バイトを占有し、FLVをマークとして3文字固定します。
    通常、最初の3文字がFLVであることが判明した場合、それはflvファイルと見なされます。
    この図では、0x46 0x4C0x56はFLVを表します。
  • バージョン:FLVのバージョン番号を示すために1バイトを占有します。ここでは1であることがわかります。
  • フラグ:1バイトのコンテンツフラグ。
    0番目と2番目のビットは、それぞれビデオとオーディオの存在を示します(1は存在を意味し、0は存在しないことを意味します)。
    スクリーンショットは0x05を示しています。これは00000101であり、ビデオとオーディオの両方があることを意味します。
  • DataOffset:
    4バイトはFLVヘッダーの長さを表します。ここでは、固定値が9であることがわかります。

2.ファイル本文

FLVファイル形式
FLVのボディ部分は、一連のバックポインターとタグで構成されています

  • バックポインタは
    4バイトに固定されており、前のタグのサイズを表します。最初のバックポインタデータは0です。

  • タグ
    タグはflv_tag_header + video_header / audio_header +データに分割されているオーディオおよびビデオデータは、。詳細は、以下のタグの詳細な説明のセクションを参照してください。ファイル本体

3.タグの詳細

タグのデータ構造

タグは次のように分けられます:
flv_tag_header + video_header / audio_header + data;
flv_tag_headerは11バイト、video_headerは5バイト、audio_headerは2バイトを占め、残りはH264データです。

flv_tag_headerは次のとおりです。

長さ11バイト、タイプ+タグデータサイズ+タイムスタンプ+タイムスタンプ拡張+ストリームID +タグデータ

  • 1バイトを入力します。
    タグには次の3つのタイプがあります。
    スクリプト0x1218
    オーディオ0x088
    ビデオ0x099

  • タグデータサイズ3バイト。
    タグデータの長さを示します。ストリーミングIDからカウントされます。

  • Timestreamp3バイト。
    タイムスタンプ

  • TimestampExtended1バイト。
    タイムスタンプ拡張フィールド

  • ストリームIDは3バイトです。
    常に0

video_header / audio_header

  • video_header、長さ5バイト
    4ビットフレームタイプ、フレームタイプ
    4ビットCodecID、ビデオエンコーディングタイプ
    8ビットAVCPacketType、シーケンスヘッダー(0)またはNALU(1)
    24ビットCompositionTime、NALUの場合は時間間隔、それ以外の場合は時間間隔は0です

  • audio_header、長さは2バイト、
    4ビットはオーディオ形式を表します。5
    番目と6番目のビットはサンプリングレートを表します。7番目のビット
    使用される長さを
    表し
    ます。8番目のビットはオーディオタイプを表します。8ビットAVCPacketType、それはAACシーケンスヘッダーです( 0)またはAAC raw(1)

データ部分

H264エンコード後のフレームデータ

スクリプトタグ、スクリプトタグ、18、0x12

通常、スクリプトタグは1つだけです。これは、flvの最初のタグであり、duration、audiodatarate、creator、widthなどのflv情報を格納するために使用されます。

  • 一般的に、タグデータ構造には2つのAMFパケットが含まれます。
    AMF(Action Message Format)は、アドビが設計したユニバーサルデータカプセル化フォーマットであり、多くのアドビ製品で使用されています。つまり、AMFはさまざまな種類のデータを統一されたフォーマットで記述します。

    • 最初のAMFパッケージは文字列型データをカプセル化します
      。最初のバイトはAMFパッケージ型を表し、通常は文字列を表す0x02です。その他の値については、ドキュメントを参照してください。
      最初の2〜3バイトはUI16タイプの値であり、文字列の長さ、通常は0x000A(「onMetaData」の長さ)を表します。
      次のバイトは文字列データで、通常は「onMetaData」です。

    • 2番目のAMFパッケージは、オーディオおよびビデオ情報アイテムの名前と値を含む配列タイプをカプセル化します。
      最初のバイトはAMFパケットタイプを示し、通常は0x08で、配列を示します。
      最初の2〜5バイトはUI32タイプの値であり、配列要素の数を示します。
      以下は、要素名と値のペアである各配列要素のカプセル化です。表現方法は次のとおりです。
      最初の1〜2バイトは要素名の長さを表し、Lであると仮定します。
      その後に長さLの文字列が続きます。
      L + 3バイトは、要素値のタイプを表します。
      対応する値が後に続く場合、占有されるバイト数は値のタイプによって異なります。

  • スクリプトのデータ型。
    すべてのデータは、データ型+(データ長)+データの形式で表示されます。
    データ型は1バイトを占め、データ長はデータ型が存在するかどうかによって異なり、データが追跡されます。データの種類

ビデオタグ、FLVビデオタグ、9、0x09

FLVビデオタグ
タグヘッダーに従ってVideoDataデータを読み取った後、videoData部分はビデオ情報Video_Header + AVC_Video_Header + dataに分割されます。

  • ビデオ情報、1バイト

    • 最初の4ビットはフレームタイプを示しますフレームタイプ
      ビデオ情報

    • 最後の4桁はコード化されたID(CodecID)です
      CodecID

  • ビデオ形式(CodecID)がAVC(H.264)の場合、VideoTagHeaderにはAVCPacketTypeとCompositionTimeの4バイトの情報が含まれるため、H264エンコーディングの場合のVideoHeaderの長さは5バイトです。

    • AVCPacketType、1バイト
      AVCPacketType

    • AVCDecoderConfigurationRecordに
      は、H.264デコードに関連するより重要なspsおよびpps情報が含まれています。データストリームをAVCデコーダーに送信する前に、spsおよびpps情報を送信する必要があります。送信しないと、デコーダーは正常にデコードできません。
      また、シーク、早送り、早戻しの状態切り替えなど、停止後にデコーダが再起動する前に、spsおよびpps情報を再送信する必要があります。
      AVCDecoderConfigurationRecordは通常、最初のビデオタグであるFLVファイルに1回表示されます。

    • CompositionTime、3バイト
      CompositionTime

  • sps ppsの
    最初のビデオは、通常、spsとppsに保存されます。
    ストレージ形式:0x01+sps[1]+sps[2]+sps[3]+0xFF+0xE1+sps size+sps+01+pps size+pps
    spsサイズとppsサイズはそれぞれ2バイトを占めるため、videoData部分の長さは11バイト+ sps.length + pps.length;プラスvideoHeaderの場合は5バイトです。

オーディオタグ、FLVオーディオタグ、8、0x08

FLVオーディオタグ
タグヘッダーに従ってAudioDataデータを読み取った後、AudioData部分はオーディオ情報Audio_Header + AACPacketType + dataに分割されます。

  • 音声情報、1バイト

    • 最初の4ビットはオーディオフォーマットを示します
      オーディオフォーマット
    • 5番目と6番目のビットはサンプリングレートを表します
      サンプリングレート
    • 7番目のビットは採用された長さを示します
      サンプリング長
    • 8番目のビットはオーディオタイプを示します
      オーディオタイプ
  • その中で、オーディオ形式が10の場合、つまりAAC形式の場合、AudioTagHeaderに追加のバイトAACPacketTypeがあります。このフィールドは、AACAUDIODATAのタイプを示します。0= AACシーケンスヘッダー、1 = AACraw。

    • AACシーケンスヘッダーにはAudioSpecificConfigも含まれています。AudioSpecificConfigにはより詳細なオーディオ情報が含まれています。AudioSpecificConfigの定義はISO14496-3の1.6.2.1AudioSpecificConfigにあるため、ここでは詳しく説明しません。そして、ffmpeg、ff_mpeg4audio_get_config()にAudioSpecificConfigを解析するための関数があり、それを比較して見て、より深く理解することができます。
    • AAC rawには、オーディオペイロードであるオーディオESストリームが含まれます。
      image.png

例えば

flvファイルを見てください

FLVヘッダー

  • 46 4C 56 01 05 00 00 00 09
    オーディオとビデオの両方のFLVヘッダーを表します

  • 0x 00 00 00 00
    最初のバックポインター(前のタグのサイズを表す)。彼の前にタグがないので、0です。

スクリプトタグ

12 00 00 B6 00 00 00 00 00 00 00
0x12これはスクリプトタグであることを意味し、00 00 B63バイトはタグのデータ長が182バイトであることを意味し、Timestreamp、TimestampExtended、およびストリームIDはすべて0です。
次のバックポインタは、タグ全体のサイズ、つまり182 + 11(タグデータの前の長さ)= 193 = 0xc1を示し00 00 00 c1ます。つまり、ツールで検索するだけです。

image.png

  • 02 00 0A 6F 6E 4D 65 65 74 61 44 61 74 61最初のAMFパケットを表します。
    02はタイプが文字列タイプであることを意味し、次の2バイト00 00Aは長さが10で、値がonMetaDataであることを意味します。

  • 03 00 00 00 08
    03はObjectTypeを意味し、ここでは一般的に08である必要があります。これは配列型を意味し、8つのキーと値のペアがあることを意味します。
    次のステップは、キーと値のペアを解析することです。

  • 解析キーと値のペア
    0005は、キーの長さ、77 69 64 74 68幅、00タイプを数値として表し、次の8バイトは値を表します。
    0006はキーの長さを68 65 69 67 68 74示し、高さを00示し、タイプが数値であることを示し、次の8バイトは値を示します。
    最後end marker 00 00 09類推すると、分析は完了です。

最初のvideoTagには、通常、spsとppsが含まれています

09 00 00 25 00 00 00 00 00 00 00
09はビデオタグを表し、
00 0025は0x25 = 37の長さを表します。さらにヘッダーの長さは11で、48です。次のバックポインターは00 00 00 30
Timestreamp、TimestampExtended、ストリームIDはすべて0です。
次はデータ部分です。タグデータ。以下に示すように:
image.png

  • 0x17、つまり、0b00010111
    最初の4ビットはフレームタイプを示し、1はキーフレームを示し、最後の4ビットはコーディングIDを示し、7はAVCを示します。
    ビデオフォーマットがAVC(H.264)タイプの場合、最後の1バイトはAVCPacketTypeを表し、最後の3バイトはCompositionTimeを表します。

  • 00
    AVCPacketTypeは0です。これは、AVCDecoderConfigurationRecordであることを意味します。これは、spsとppsが含まれていることを意味します。このことは最初にデコーダーに送信する必要があります。そうしないと、正常にデコードできません。

  • 00 00 00
    CompositionTimeは0です。次はspsとppsの情報です。

  • 0x01+sps[1]+sps[2]+sps[3]+0xFF+0xE1+sps size+sps+01+pps size+pps
    sps [1] = 42
    sps [2] = 80
    sps [3] = 20
    sps size =バイナリに対して見てください00 11。これは、spsの長さが17で、17バイトのspsデータが読み取られたことを意味します01
    。ppssize=が読み取られます。00 04、これはppsの長さを意味します。4
    です。タグは読み取り後に終了します。次のバックポインタ。

最初のaudioTagには、AACシーケンスヘッダーが含まれています

08 00 00 04 00 00 00 00 00 00 00
08はオーディオを意味し、
00 00 04は長さが4であることを意味し、ヘッダーの長さ11を加えたものは15であり、次のバックポインター00 00 00 0F
はタグデータです。以下に示すように:
image.png

AF、つまり、0b10101111
最初の4バイトは1010、10進数で10であり、オーディオ形式がAACであることを示します。10には、AACAUDIODATAのタイプを示すもう1バイトのAACPacketTypeがあります。
5桁目と6桁目は11、10進数は3、サンプリングレートは44kHz
、7桁目は1、16ビットを採用
、8桁目は1、ステレオ、

00、はAACPacketTypeを意味し、0はタグがAACシーケンスヘッダーであることを意味します。
次の2バイトはAudioSpecificConfigを表し、より詳細なオーディオ情報が含まれています。
タグは読み取り後に終了します。次のバックポインタ。

的的videoTag、videoTag

  • ビデオの
    長さが35525の次のビデオデータのタイムスタンプは23です。
    0x17最後のビットAVCPacketType01はNALUデータを表します。3つのCompositionTimeバイトの後、それはNALUデータです。
    image.png

  • オーディオの
    長さが1538の次のオーディオデータのタイムスタンプは36です。
    0xAF最後の01オーディオデータはAACPacketTypeです。これは、オーディオNALUデータであるACCrawを意味します。
    image.png

総括する

これまでにFLV形式を整理してきましたが、FLVコードの一部をよりよく理解できます。

参照:
FLVビデオパッケージ形式の詳細
flv形式の詳細な説明+分析例
h.264ビデオストリームのflv形式ファイルへのカプセル化
FLV(AAC / AVC)研究ノート

おすすめ

転載: blog.csdn.net/u014099894/article/details/108442904