Микширование видео и аудио из Audio Record дает (ошибка неверного индекса буфера)

Я пытаюсь смешать сырое видео (h.264) со звуком из AudioRecord, у меня есть:

1) видеокодер с его форматом.

2) аудио кодер со своим форматом.

3) Аудио запись объекта.

4) обработчик с задержкой 10 мс.

Код:

private AudioRecord recorder;
private Mediacodec videoEncoder;
private MediaCodec audioEncoder;
private MediaCodec.BufferInfo info;
private MediaMuxer muxer;
private Handler handler = new Handler(Looper.getMainLooper());
private Runnable runnable = new Runnable(){
@Override
public void run(){

drainEncoder();
}
}


private void Record(){
 //buffer info
 info = new MediaCodec.BufferInfo();

 //set video encoder
 prepareVideoEncoder();

 //set audio encoder
 prepareAudioEncoder();

 //start audio record

  startAudioRecord();


  try{
  //initialize media muxer

  muxer = new MediaMuxer(path , MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

 }catch(IOException e){

 }

  drainEncoder();

   }



private void startAudioRecord(){

  int audio_buffer_size=AudioRecord.getMinBufferSize(8000,..,...);
  recorder=new AudioRecord(MIC,..,..);
  recorder.startRecording();

}

Вышеуказанное устанавливает видеокодер и аудиокодер, запускает AudioRecord и дает им формат.

Ниже приведен сливной кодер, в котором они должны смешиваться (видео и аудио):

private int video_index=-1;
private int audio_index=-1;



private boolean DrainEncoder(){

byte[] bytes = new byte[8000/10];

while(true){

int v_index = videoEncoder.dequeOutputBuffer(info , 0);
int a_index = recorder.read(buffer , 0 , buffer.length);



if(v_index == MediaCodec.INFO_TRY_AGAIN_LATER){
//nothing yet
break;
}

else if(v_index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED){

if(track_index >=0 ){
//throw exception
}

video_index = muxer.addTrack(videoEncoder.getOutputFormat());

if(!muxer_started && video_index>=0){
muxer.start();
muxer_started=true;
}
}

}

else{

ByteBuffer bytebuffer = videoEncoder.getOutputBuffer(v_index);

if(info.size != 0){

  if (muxer_started) {

bytebuffer.position(info.offset);
bytebuffer.limit(info.offset + info.size);
muxer.writeSampleData(video_index, bytebuffer, info);

} else {
// muxer not started
}

 videoEncoder.releaseOutputBuffer(v_index , false);
}


}



if(a_index == MediaCodec.INFO_TRY_AGAIN_LATER){
//nothing yet
break;
}

else if(a_index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED){

if(audio_index >=0 ){
//throw exception
}

audio_index = muxer.addTrack(audioEncoder.getOutputFormat());

if(!muxer_started && audio_index>=0){
muxer.start();
muxer_started=true;
}
}

}

else{

ByteBuffer bytebuffer = audioEncoder.getOutputBuffer(a_index);

if(info.size != 0){

  if (muxer_started) {

bytebuffer.position(info.offset);
bytebuffer.limit(info.offset + info.size);
muxer.writeSampleData(audio_index, bytebuffer, info);

} else {
// muxer not started
}

 audioEncoder.releaseOutputBuffer(a_index , false);
}


}

handler.postDelayed(runnable , 10);

return false;
}

проблема

Проблема в том, что я получаю ошибку индекса буфера в этой строке:

   ByteBuffer bytebuffer = audioEncoder.getOutputBuffer(a_index);

почему это происходит? Я делаю что-то неправильно?

0 ответов

Другие вопросы по тегам