2017-09-26 15 views
0

onOutputBufferAvailable()コールバックメソッド内にoutputBufferの問題があります。このコールバックメソッドが呼び出されるたびにoutputBuffer.hasRemainingメソッドを使用してoutputBufferをチェックします。これは常にfalseを返します。MediaCodec outputBufferは常に空です

 codec.setCallback(new MediaCodec.Callback() { 

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

       ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId); 
       int rounds = extractor.readSampleData(inputBuffer,0); 

       if(rounds > 0) { 
        long currentT = extractor.getSampleTime(); 
        Log.i("CurrentT", String.valueOf(currentT/(1000*1000))); 
        codec.queueInputBuffer(inputBufferId, 0, rounds, 0, 0); 
        extractor.advance(); 


       } else { 
        // EOS 
        codec.queueInputBuffer(inputBufferId, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); 
        Log.i("EOS","=-1"); 


       } 


      } 

      @Override 
      public void onError(@NonNull MediaCodec mediaCodec, @NonNull MediaCodec.CodecException e) { 
       Log.i("error", "e"); 
      } 
      @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
      @Override 
      public void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, MediaCodec.BufferInfo info) { 
       ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId); 

       Log.i("has", String.valueOf(outputBuffer.hasRemaining())); 
       if (outputBuffer.hasRemaining()) { 

        b = outputBuffer.get(); 
        Log.i("i", String.valueOf(b)); 
        BAOS.write(b); 
        outputBuffer.clear(); 

       } else { 

        array= BAOS.toByteArray(); 
        codec.stop(); 
        codec.release(); 

       } 
       codec.releaseOutputBuffer(outputBufferId, false); 

      } 


      @Override 
      public void onOutputFormatChanged(MediaCodec mc, MediaFormat format) { 
       // Subsequent data will conform to new format. 
       // Can ignore if using getOutputFormat(outputBufferId) 
       // mOutputFormat = format; // option B 
      } 
     }); 

答えて

0

問題の主な理由は、間違っていたMediaCodecモードです。 MediaCodec.createByCodecName(...)であり、codec = MediaCodec.createDecoderByType("audio/mpeg")である必要があります。私は最終的にget(byte[] dst)メソッドで終わったget()を使用してバイトを取得しようとして失敗した後。以下の作業コード。

  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
      @Override 
      public void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, MediaCodec.BufferInfo info) { 
       ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId); 

        byte[] b = new byte[outputBuffer.remaining()]; 
        outputBuffer.get(b); 

        for(i=0;i< b.length;i++) { 
         BAOS.write(b[i]); 
        } 
        outputBuffer.clear(); 

       codec.releaseOutputBuffer(outputBufferId, false); 

       if (info.flags == MediaCodec.BUFFER_FLAG_END_OF_STREAM) { 
        array=BAOS.toByteArray(); 
        Log.i("array", String.valueOf(array.length)); 
        FileTools fl = new FileTools(); 
        fl.WriteFile(array); 
        codec.stop(); 
        codec.release(); 
       } 
      } 
1

位置/たByteBufferの制限マーカーはMediaCodecによって更新されていない、あなたは実際のペイロードデータの位置や長さを知るようになったMediaCodec.BufferInfoオブジェクトをチェックする必要があります。

+0

実際の位置を取得するには 'presentationTimeUs()'を使用しますか? – Kristopher

+0

いいえ、私はMediaCodec.BufferInfoの 'offset'と' size'フィールドを読むことを意味しました。しかし、 'getOutputBuffer()'のドキュメントは、すでに自動的に設定されていることを記録しているようです: "返されたバッファの位置と限界は有効な出力データに設定されています" – mstorsjo

+0

私の理由はわかりません。オフセットは常に0です。 'info.size'は4608です。 – Kristopher

関連する問題