MediaExtractor.advance() - 流的结束比预期更早发出信号

时间:2017-09-19 13:11:19

标签: android mp3 mediacodec mediaextractor

我通过latency = sampler.getLatency(); if (latency >2000) { log.info("Save to file " + vars.get("workerId")); } 类的advance()方法在比预期更早的信号流结束时遇到问题(文件结束前的方式)。根据Google的参考,advance()方法在使用本地文件时可能会出错(这是我的情况 - MediaExtractor对本地文件的影响):

  

提取本地文件时,advance()和。的行为   readSampleData(ByteBuffer,int)在存在时未定义   并发写入同一本地文件:

不幸的是,没有filePath方法使用MediaExtractor没有一句话。如何转到下一个样本?如果没有办法,那么我想知道如何在不使用advance()的情况下提供inputBuffer

我的代码片段如下:

MediaExtractor

1 个答案:

答案 0 :(得分:1)

在我的示例中,当我使用另一种语句构造时,MediaExtractor正常工作。我没有像你一样用 extractor.advance()检查 EOS 。尝试其他样品提供的方式:

   int chunkSize = extractor.readSampleData(inputBuffer, 0);
   if (chunkSize < 0) {
        // End of stream -- send empty frame with EOS flag set.
        codec.queueInputBuffer(inputBufferId, 0, 0, 0L,
                MediaCodec.BUFFER_FLAG_END_OF_STREAM);
    } else {
        // No EOS -- continue
        long presentationTimeUs = extractor.getSampleTime();
        codec.queueInputBuffer(inputBufferId, 0, chunkSize,
                presentationTimeUs, 0 /*flags*/);
        extractor.advance();
    }

BTW,MediaExtractor的指南讲述了这种用法。 Fadden在Grafika中使用MediaExtractor设置了MoviePlayer。但它在没有 MediaCodec.Callback 的情况下为解码器提供信息。