2017-01-09 18 views
3

私はAudioRecordオブジェクトから生データを取得し、MediaMuxerとMediaCodecを使用してファイルに保存しようとしています。Android MediaCodec dequeueInputBufferは常に-1を返します

私はコーデックを開始し、マルチプレクサを起動し、入力バッファにデータをロードします。そのような運はありません。

デバッグの調査から、dequeueInputBuffer()への呼び出しで問題が発生していることがわかりました。データの最初の数チャンクは成功したようですが、最終的にdequeueInputBuffer()はちょうど-1を返します。

紛失していることが明らかですか?これは、入力バッファをいっぱいにしているのですが、コーデックによって決して解放されていないようです。

関連するコードのスニペット:

int numChunks = input.length/CHUNKSIZE; 
mAudioEncoder.start(); 
    for (int chunk = 0; chunk <= numChunks; chunk++) { 
     byte[] passMe = new byte[CHUNKSIZE]; 
     int inputBufferIndex = -1; 
     Log.d("offerAudioEncoder","printing chunk #" + chunk + "of " + numChunks); 
     //Copy the data into the chunk array 
     if (chunk < input.length/CHUNKSIZE) 
      for (int i = 0; i < CHUNKSIZE; i++) 
       passMe[i] = input[chunk * CHUNKSIZE + i]; 
     else { 
      eosReceived = true; 
      for (int i = 0; chunk * CHUNKSIZE + i < input.length; i++) 
       passMe[i] = input[chunk * CHUNKSIZE + i]; 
     } 

     //Get the input buffer 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { 
      while(inputBufferIndex < 0)//justk keep trying. 
       inputBufferIndex = mAudioEncoder.dequeueInputBuffer(100); 
      inputBuffer = mAudioEncoder.getInputBuffer(inputBufferIndex); 
     } else { 
      //backwards compatibility. 
      ByteBuffer[] inputBuffers = mAudioEncoder.getInputBuffers(); 
      inputBufferIndex = mAudioEncoder.dequeueInputBuffer(-1); 
      if (inputBufferIndex >= 0) 
       inputBuffer = inputBuffers[inputBufferIndex]; 
     } 

     //Plop the data into the input buffer 
     if (inputBuffer != null) { 
      inputBuffer.clear(); 
      inputBuffer.put(passMe); 
     } 
     long presentationTimeUs = chunk * 10000000; //each encoded chunk represents one second of audio 
     //this is what the frame should be labeled as 
     mAudioEncoder.queueInputBuffer(inputBufferIndex, 0, passMe.length, presentationTimeUs, 0); 

     //Pull the output buffer. 
     int encoderStatus = -1; 
     while(encoderStatus < 0) //Like, seriously, WAIT forever. 
      encoderStatus = mAudioEncoder.dequeueOutputBuffer(mAudioBufferInfo, -1);//wait forever, why not? 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) 
      outputBuffer = mAudioEncoder.getOutputBuffer(encoderStatus); 
     else { 
      ByteBuffer[] encoderOutputBuffers = mAudioEncoder.getOutputBuffers(); 
      outputBuffer = encoderOutputBuffers[encoderStatus]; 
     } 

     if(encoderStatus >= 0) { 
      if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) 
       mMuxer.writeSampleData(audioTrackIndex, outputBuffer, mAudioBufferInfo); 

      //Done with the output buffer, release it. 
      mAudioEncoder.releaseOutputBuffer(encoderStatus, false); 
     }//TODO: Add cases for what to do when the output format changes 

答えて

0

わかりました、私はそれを考え出しました。最終的には、チャンクロジックをダンプし、設定によって入力バッファのサイズを増やしただけです。

audioFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE、14000000);

MediaCodecのconfigureメソッドに渡されるMediaFormatオブジェクトの場合。

また、16ビットのオーディオエンコーディングを使用し、Shortを吐き出しているAudioRecord.readメソッドを使用するようにしてください。バイトはねじれた音声を生成するようです(AudioRecordは16ビットで動作したいからでしょう)。

関連する問題