2017-09-19 45 views
2

我有类的advance()方法提前发送信号的流结束的问题(文件结束之前的方式)。据谷歌引用advance()方法可以使用本地文件时,工作错误(这是我的情况 - filePath ponits到本地文件):MediaExtractor.advance() - 流结束的信号早于预期

在提取本地文件,事先的行为()和 readSampleData(字节缓冲区,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 

}; 


} 

回答

0

在我的样本MediaExtractor当我使用的语句中的另一个建设工作正常。我没有检查EOSextractor.advance()像你一样。试试其他样品如何提供:

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在MediaExtractor的Grafika中安装了MoviePlayer。但它提供解码器没有MediaCodec.Callback

+0

This Works。那么你能告诉我这是什么意思'当提取本地文件时,advance()和readSampleData(ByteBuffer,int)的行为在并发写入同一本地文件时未定义。根据这个参考,你的代码不应该工作,但它确实有效。 – Kristopher

+1

在开发人员指南中阅读时,我也感到困惑。但我试过样品,他们的行为是确定的。所以我只是跳过这个信息:) – Sheikh