2

MediaExtractor / MediaCodecAndroid (ターゲット 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 倍にサンプル レートを設定できます。

編集:私はMediaFormatwhen MediaCodecreturn 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

今、私はこの「コーデック固有のデータ」の具体的な構造について疑問に思っています

4

1 に答える 1

1

MediaFormat返された byMediaExtractorはヒントとしてのみ扱う必要があります。MediaCodecで返されるものを確認する必要がありますINFO_OUTPUT_FORMAT_CHANGED。これは実際のサンプルレートを返すはずです。AudioTrackこれは、コンテンツのデコードが開始された後にのみ構成できることを意味します。

于 2015-11-09T13:40:17.417 に答える