MediaExtractor / MediaCodec
Android (ターゲット API レベル >= 16) でコンボを使用して、オーディオ ストリームをデコードします。MPEG-4 HE-AAC オーディオ データを含む mp4/m4a コンテナを再生するときに微妙な問題が発生しました。
トラックのクエリMediaFormat
を実行するMediaFormat.KEY_SAMPLE_RATE
と、実際には予想されるサイズの半分しか得られません。たとえば、44100 の再生サンプル レートが必要なトラックの場合、 22050 がMediaFormat
返されます。HE-AAC に関するドキュメントをいくつか読んだ後、これはそのコーデックの仕組み。
それでも、AudioTrack
インスタンスでオーディオ トラックを再生するには、22050 ではなく 44100 の正しい (再生) サンプルレートで構成する必要があります。
したがって、オーディオが API ターゲット レベル >= 16 でエンコードされた HE-AAC であることを確実に知る方法を探しているのでAudioTrack
、報告されたサンプル レートの 2 倍にサンプル レートを設定できます。
編集:私はMediaFormat
when MediaCodec
return with をチェックしMediaCodec.INFO_OUTPUT_FORMAT_CHANGED
ます。フォーマットは次のようになります。
max-input-size=946,
aac-profile=2,
mime=audio/mp4a-latm,
durationUs=158499410,
csd-0=java.nio.ByteArrayBuffer[position=0,limit=5,capacity=5],
channel-count=2,
sample-rate=22050
で適切な再生を行うAudioTrack
には、サンプル レートを 2 * サンプル レート = 44100 に設定する必要があります。
csd-0
プロファイル/フォーマットなどを推測するための詳細情報が含まれているのだろうか. 上記の例では、csd-0
バッファからの 5 バイトは次のようになります。
0x13 0xffffff90 0x56 0xffffffe5 0xffffffa0
今、私はこの「コーデック固有のデータ」の具体的な構造について疑問に思っています