2017-09-19 7 views
2

クラスのadvance()メソッドで予期されたより早く(ファイルの終わりの前に)通知されたストリームの終了に問題があります。 Googleのリファレンスによると、ローカルファイルを使用している場合advance()方法が間違って仕事ができる(これは私の場合です - filePathローカルファイルへのponits):MediaExtractor.advance() - ストリームの終わりが予期されたよりも早く到着しました

ローカルファイルを抽出し、事前の行動()と readSampleData(のByteBuffer、int)が同じローカルファイルへ 同時書き込みの存在下で定義されていません:

残念ながらadvance()方法なしMediaExtractorの使用についての単一の単語がありません。どのように次のサンプルに移動するには?それを行う方法がない場合は、MediaExtractorを使用せずに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

私のサンプルでは。私はチェックしなかった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のMoviePlayerがGrafikaにあります。しかし、それはMediaCodec.Callbackなしでデコーダを供給します。

+0

これは機能します。ローカルファイルを抽出するとき、advance()とreadSampleData(ByteBuffer、int)の振る舞いは、同じローカルファイルへの同時書き込みの存在下では定義されていません。このリファレンスによれば、コードは機能しませんが、実際には動作します。 – Kristopher

+1

これを読んだら、私は開発者ガイドでも混乱しました。しかし、私はサンプルを試して、彼らの行動はOKだった。だから私はちょうどこの情報をスキップ:) – Sheikh

関連する問題