我的问题是流的结尾比advance()类的MediaExtractor方法早于预期(文件结束之前)发出了信号。根据Google参考,使用本地文件时advance()方法可能会出错(这是我的情况-filePath对本地文件的响应):


  提取本地文件时,Advance()和
  在存在以下条件时未定义readSampleData(ByteBuffer,int)
  并发写入同一本地文件:


不幸的是,没有MediaExtractor方法使用advance()并没有一个词。如何移至下一个样本?如果没有办法做到,那么我想知道如何在不使用inputBuffer的情况下喂MediaExtractor

我的代码片段如下:

 if(Build.VERSION.SDK_INT >= 21 ) {

        try {
            codec = MediaCodec.createByCodecName("OMX.google.mp3.decoder");

        } catch (IOException e) {
            e.printStackTrace();
        }

        final MediaExtractor extractor = new MediaExtractor();
        try {
            extractor.setDataSource(filePath);     //local file
            Log.i("filePath", String.valueOf(filePath));
            extractor.selectTrack(0);
        } catch (IOException e) {
            e.printStackTrace();
        }


        codec.setCallback(new MediaCodec.Callback() {

            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {

                ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);
                // fill inputBuffer with valid data
                int sampleSize = extractor.readSampleData(inputBuffer,0);

                if(extractor.advance) {

                    codec.queueInputBuffer(inputBufferId, 0, sampleSize, 0, 0);


                } else {
                        // EOS
                    codec.queueInputBuffer(inputBufferId, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
                    codec.stop();
                    codec.release();
                }


            }
// more callbacks

};


}

最佳答案

在我的示例中,当我使用另一种语句构造时,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();
    }


顺便说一句,MediaExtractor的指南介绍了这种用法。
Fadden在Grafika中具有MediaExtractor的MoviePlayer。但是它提供了没有MediaCodec.Callback的解码器。

10-08 17:34