Микширование видео и аудио из 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);
почему это происходит? Я делаю что-то неправильно?