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の開始位置を決定します。
その存在により、デコードはストリーム内のどこからでも開始できます。任意のフレームをデコードできます。 - ID:MPEGバージョン: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チャンネルステレオを表します

- 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] プレーンビュー コピー
- / **
- * ADTSヘッダーを追加
- *
- * @ paramパケット
- * @param packetLen
- * /
- 民間 ボイドaddADTStoPacket(バイト[]パケット、intpacketLen){
- intプロファイル=二 // AAC LC
- intfreqIdx =4 // 44.1KHz
- intchanCfg =二 // CPE
- // ADTSデータを入力します
- パケット[0] =(バイト)。0xFF
- パケット[1] =(バイト)。0xF9
- パケット[二] =(バイト)(((プロファイル-1)。<< 6)+(freqIdx<< 二)+(chanCfg >>二))
- パケット[3] =(バイト)(((chanCfg&3)。<< 6)+(packetLen >>十一))
- パケット[4] =(バイト)((packetLen&0x7FF)>>3)。
- パケット[5] =(バイト)(((packetLen&7)。<< 5)+0x1F)。
- パケット[6] =(バイト)。0xFC
- }
これが呼び出しです:(彼らのニーズに応じて、AudioBufFrameはクラス内の独自のプロジェクトであり、実際にはパッケージByteBufferクラスです) [java] プレーンビュー コピー
- AudioBufFrame audioBufFrame =(AudioBufFrame)o
- intoutBufferSize = audioBufFrame.buf.limit()+7
- バイト[] aacBytes =新着 バイト[outBufferSize]
- 試してみてください{{
- もし(!書く) {
- エラー=新着FileOutputStream(MyConfiguration.VIDEO_PATH +'/audio.aac')。
- 書き込み=true
- }
- addADTStoPacket(aacBytes、outBufferSize)
- audioBufFrame.buf.get(aacBytes、7、audioBufFrame.buf.limit())
- fout.write(aacBytes)
- }キャッチ(IOException e){
- e.printStackTrace()
- }
以下は、参照用に追加された参照FFMPEG CADTSヘッダーコードです。 [java] プレーンビュー コピー
- intff_adts_write_frame_header(ADTSContext * ctx、
- uint8_t * buf、intサイズ、intpce_size)
- {{
- PutBitContext pb
- init_put_bits(&pb、buf、ADTS_HEADER_SIZE)
- / * adts_fixed_header * /
- put_bits(&pb、12、0xfff)。/ *シンクワード* /
- put_bits(&pb、1、0)。/ * ID * /
- put_bits(&pb、二、0)。/ *レイヤー* /
- put_bits(&pb、1、1)。/ * protected_absent * /
- put_bits(&pb、二、ctx-> objecttype)/ * profile_objecttype * /
- put_bits(&pb、4、ctx-> sample_rate_index)
- put_bits(&pb、1、0)。/ * private_bit * /
- put_bits(&pb、3、ctx-> channel_conf)/ * channel_configuration * /
- put_bits(&pb、1、0)。/ * original_copy * /
- put_bits(&pb、1、0)。/ *家* /
- / * adts_variable_header * /
- put_bits(&pb、1、0)。/ * copyright_identification_bit * /
- put_bits(&pb、1、0)。/ * copyright_identification_start * /
- put_bits(&pb、13、ADTS_HEADER_SIZE +サイズ+ pce_size)/ * aac_frame_length * /
- put_bits(&pb、十一、0x7ff)。/ * adts_buffer_fullness * /
- put_bits(&pb、二、0)。/ * number_of_raw_data_blocks_in_frame * /
- flush_put_bits(&pb)
- 戻る 0
- }