MPEG2 トランスポート (.ts) ファイルから取得したオーディオを再生しようとしています。MediaExtractor 経由でオーディオ ストリームを取得し、readSampleData を使用してサンプルを MediaCodec 入力バッファーにコピーし、MediaCodec 出力バッファーを AudioTrack に書き込みます。MediaExtractor は、オーディオ MIME タイプを「audio/mp4a-latm」として示します。
これらすべてが、Nexus 7 2013 タブレットで見事に機能します。
しかし、安価な Neutab x7 タブレットではまったく機能しません。問題は、いくつかのサンプルの後、dequeueInputBuffer が繰り返し -1 を返すことです。AudioTrack.write() への呼び出しをコメントアウトしてもその事実は変わらないため、問題は MediaCodec の操作にあります。
コードは次のようになります (ログ、一部のエラー処理は省略):
audioInputBufferIndex = audioCodec.dequeueInputBuffer(TIMEOUT);
if (audioInputBufferIndex >= 0) {
audioInputBuffers[audioInputBufferIndex].clear();
sampleSize = audioExtractor.readSampleData(audioInputBuffers[audioInputBufferIndex], 0);
audioPresentationTimeUs = audioExtractor.getSampleTime();
audioCodec.queueInputBuffer(audioInputBufferIndex,0,sampleSize,audioPresentationTimeUs,0);
audioOutputBufferIndex = audioCodec.dequeueOutputBuffer(audioBufferInfo, TIMEOUT);
if (audioOutputBufferIndex >= 0) {
ByteBuffer buffer = audioOutputBuffers[audioOutputBufferIndex];
byte[] chunk = new byte[audioBufferInfo.size];
buffer.get(chunk);
buffer.clear();
if (audioTrack != null & chunk.length > 0) {
audioTrack.write(chunk, 0, chunk.length);
audioExtractor.advance();
}
audioCodec.releaseOutputBuffer(audioOutputBufferIndex,false);
はaudioCodec
、 から取得した MediaFormat で構成されaudioExtractor
ます。TIMEOUT を大きな値に増やしてみましたが、喜びはありません。
これら 2 つのデバイスでこのコードの動作が異なるのはなぜですか? 回すノブはありますか?
Neutab には、このファイルを問題なく再生する「Videos」アプリがあります。logcat に Omx* エントリが表示されるので、libstagefright を直接使用している可能性があります。