AAC ADTSヘッダー情報は、



Aac Adts Header Information Describes



ADTSはAudioData TransportStreamの略です。


AACオーディオファイルは一般的な送信形式です。 AACでエンコードされたストリームをむき出しにする場合、書き込まれたAACファイルがPCや携帯電話で再生できない場合があります。パッケージ化されたスプライスADTSヘッダーファイルがないため、各フレームのAACファイルが再生されない可能性が高くなります。 ADTSができるヘッダーファイルを追加するだけで済みます。AACの元のデータブロックの長さは可変であり、元のフレームのADTSヘッダーとADTSのパッケージ、ADTSフレームが形成されます。
ADTSヘッダー情報とファイル構造の次の分析:ADTSヘッダーAACオーディオデータと構成によるAACオーディオファイルの各フレーム。


AAC Audio ES Viewerユーティリティを使用して、AACADTSヘッダーを表示できます。

オーディオファイルの各フレームのADTSヘッダーには、サンプルレート、チャネル、フレーム長の情報が含まれているため、デコーダーは読み取りを解析します。

通常の状況でのADTSヘッダー情報は7バイトで、次の2つの部分に分かれています。

adts_fixed_header()



adts_variable_header()

初見:adts_fixed_header()

  • シンクワード常に0xFFF、同期のためにADTSフレームが開始されたことを表します。
    によるデコーダ0xFFF各ADTSの開始位置を決定します。
    その存在により、デコードはストリーム内のどこからでも開始できます。任意のフレームをデコードできます
  • IDMPEGバージョン:MPEG-4の場合は0、MPEG-2の場合は1
  • 常に:「00」
  • protected_absent:警告、CRCがない場合は1に設定し、CRCがある場合は0に設定します
  • プロフィール:01 Low Complexity(LC)などのAACのレベルを示す-AAC LC
    プロファイルの値から1オーディオオブジェクトタイプを引いた値に等しい値。
    プロファイル= MPEG-4オーディオオブジェクトタイプ-1
  • サンプリング周波数インデックス:下付き文字のサンプリングレート
  • channel_configuration:などのチャネル数2チャンネルステレオを表します
次に見てくださいadts_variable_header()
  • aac_frame_length:ADTSフレームは、元のストリームの長さとAACADTSヘッダーで構成されます。フレーム長。この値には、7バイトまたは9バイトのヘッダー長が含まれている必要があります。
    aac_frame_length =(protection_absent == 1?7:9)+ size(AACFrame)

    protected_absent = 0の場合、ヘッダーの長さ= 9バイト
    protected_absent = 1の場合、ヘッダーの長さ= 7バイト
  • adts_buffer_fullness:0x7FFは可変レートコードストリームを記述しました。
  • number_of_raw_data_blocks_in_frame:これは、AAC番号_of_raw_data_blocks_in_frame +1番目の元のフレームがあるADTSフレームを表します。
    したがって、上記のnumber_of_raw_data_blocks_in_frame == 0は、データブロック内のAACADTSフレームを示します。
    (生のAACフレームには、1024サンプルと一定期間のデータが含まれています)

2つのヘッダーがここで停止します。
ここでは、ByteBuffer用にコードAACADTSヘッダーファイルを追加するメソッドの一部としてJAVAとAndroidを紹介しました。
[java] プレーンビュー コピー
  1. / **
  2. * ADTSヘッダーを追加
  3. *
  4. * @ paramパケット
  5. * @param packetLen
  6. * /
  7. 民間 ボイドaddADTStoPacket(バイト[]パケット、intpacketLen){
  8. intプロファイル= // AAC LC
  9. intfreqIdx =4 // 44.1KHz
  10. intchanCfg = // CPE
  11. // ADTSデータを入力します
  12. パケット[0] =(バイト)。0xFF
  13. パケット[1] =(バイト)。0xF9
  14. パケット[] =(バイト)(((プロファイル-1)。<< 6)+(freqIdx<< )+(chanCfg >>))
  15. パケット[3] =(バイト)(((chanCfg&3)。<< 6)+(packetLen >>十一))
  16. パケット[4] =(バイト)((packetLen&0x7FF)>>3)。
  17. パケット[5] =(バイト)(((packetLen&7)。<< 5)+0x1F)。
  18. パケット[6] =(バイト)。0xFC
  19. }

これが呼び出しです:(彼らのニーズに応じて、AudioBufFrameはクラス内の独自のプロジェクトであり、実際にはパッケージByteBufferクラスです) [java] プレーンビュー コピー
  1. AudioBufFrame audioBufFrame =(AudioBufFrame)o
  2. intoutBufferSize = audioBufFrame.buf.limit()+7
  3. バイト[] aacBytes =新着 バイト[outBufferSize]
  4. 試してみてください{{
  5. もし(!書く) {
  6. エラー=新着FileOutputStream(MyConfiguration.VIDEO_PATH +'/audio.aac')。
  7. 書き込み=true
  8. }
  9. addADTStoPacket(aacBytes、outBufferSize)
  10. audioBufFrame.buf.get(aacBytes、7、audioBufFrame.buf.limit())
  11. fout.write(aacBytes)
  12. }キャッチ(IOException e){
  13. e.printStackTrace()
  14. }

以下は、参照用に追加された参照FFMPEG CADTSヘッダーコードです。 [java] プレーンビュー コピー
  1. intff_adts_write_frame_header(ADTSContext * ctx、
  2. uint8_t * buf、intサイズ、intpce_size)
  3. {{
  4. PutBitContext pb
  5. init_put_bits(&pb、buf、ADTS_HEADER_SIZE)
  6. / * adts_fixed_header * /
  7. put_bits(&pb、120xfff)。/ *シンクワード* /
  8. put_bits(&pb、10)。/ * ID * /
  9. put_bits(&pb、0)。/ *レイヤー* /
  10. put_bits(&pb、11)。/ * protected_absent * /
  11. put_bits(&pb、、ctx-> objecttype)/ * profile_objecttype * /
  12. put_bits(&pb、4、ctx-> sample_rate_index)
  13. put_bits(&pb、10)。/ * private_bit * /
  14. put_bits(&pb、3、ctx-> channel_conf)/ * channel_configuration * /
  15. put_bits(&pb、10)。/ * original_copy * /
  16. put_bits(&pb、10)。/ *家* /
  17. / * adts_variable_header * /
  18. put_bits(&pb、10)。/ * copyright_identification_bit * /
  19. put_bits(&pb、10)。/ * copyright_identification_start * /
  20. put_bits(&pb、13、ADTS_HEADER_SIZE +サイズ+ pce_size)/ * aac_frame_length * /
  21. put_bits(&pb、十一0x7ff)。/ * adts_buffer_fullness * /
  22. put_bits(&pb、0)。/ * number_of_raw_data_blocks_in_frame * /
  23. flush_put_bits(&pb)
  24. 戻る 0
  25. }