0

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 を直接使用している可能性があります。

4

1 に答える 1

4

あなたのコードを読む限り、1 つの入力バッファーをキューに入れるたびに、出力バッファーを 1 回だけデキューしようとします。

デコーダーは非同期で実行され、入力バッファーと出力バッファーの数が限られていることに注意してください。デコーダーが入力バッファーをデコードしたとしても、出力が出力バッファーですぐに利用できない場合があります。この場合、TIMEOUT 値を増やすと改善される可能性がありますが、保証はされません。

2 つの if ステートメントを分割してみてください。これにより、バッファーが返されなかったdequeueOutputBuffer場合でも、ループ内で毎回呼び出すことができます。dequeueInputBuffer

于 2015-03-06T07:28:18.123 に答える