2017-09-19 351 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