2014-12-18 6 views
1

Я пытаюсь добавить аудио в видео, созданное под открытым исходным кодом проектомAndroid, добавив аудио трека Muxer

Специально для https://github.com/madisp/trails/blob/master/app/src/main/java/com/madisp/trails/CaptureService.java

Мне нужно, чтобы получить аудио с микрофона и записать его в кодировке файла в качестве аудио трек. В настоящий момент файл, закодированный с помощью Muxer, имеет только видеодорожку.

я могу получить аудио с MIC без каких-либо проблем, ниже

int nChannels = 1; 
int minBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT) * 2; 
AudioRecord aRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize); 

short[] buffer = new short[44100 * nChannels]; 
aRecorder.startRecording(); 
int readSize = 0; 

while (recording) { 
    readSize = aRecorder.read(buffer, 0, minBufferSize); 
    if (readSize < 0) { 
     break; 
    } else if (readSize > 0) { 
     // do stuff with buffer 
    } 
} 
aRecorder.stop(); 
aRecorder.release(); 

, но я не уверен, как включить его, чтобы (https://github.com/madisp/trails/blob/master/app/src/main/java/com/madisp/trails/CaptureService.java)

while (running) { 
    int index = avc.dequeueOutputBuffer(info, 10000); 
    if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { 
     if (track != -1) { 
      throw new RuntimeException("format changed twice"); 
     } 
     track = muxer.addTrack(avc.getOutputFormat()); 
     muxer.start(); 
    } else if (index >= 0) { 
     if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) { 
      // ignore codec config 
      info.size = 0; 
     } 
     if (track != -1) { 
      ByteBuffer out = avc.getOutputBuffer(index); 
      out.position(info.offset); 
      out.limit(info.offset + info.size); 
      muxer.writeSampleData(track, out, info); 
      avc.releaseOutputBuffer(index, false); 
     } 
    } 
} 

И да, понимаю я буквально просить для вас, чтобы написать код, но я не имею экспертных знаний по этому вопросу

Любая помощь по оценке

Благодаря

+0

@fadden Вы можете помочь? – nLL

ответ

1

Во-первых, использовать byte[] вместо short[] для буфера, используемого с AudioRecord - что позволит упростить вещи немного.

Затем кодировать полученный буфер, то, как это должно работать (непроверенное):

while (recording) { 
    readSize = aRecorder.read(buffer, 0, minBufferSize); 
    if (readSize < 0) { 
     break; 
    } else if (readSize > 0) { 
     boolean done = false; 
     while (!done) { 
      int index = avc.dequeueInputBuffer(10000); 
      if (index >= 0) { // In case we didn't get any input buffer, it may be blocked by all output buffers being full, thus try to drain them below if we didn't get any 
       ByteBuffer in = avc.getIndexBuffer(index); 
       in.clear(); 
       in.put(buffer, 0, readSize); 
       avc.queueInputBuffer(index, 0, readSize, System.nanoTime()/1000, 0); 
       done = true; // Done passing the input to the codec, but still check for available output below 
      } 
      index = avc.dequeueOutputBuffer(info, 10000); 
      if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { 
       if (track != -1) { 
        throw new RuntimeException("format changed twice"); 
       } 
       track = muxer.addTrack(avc.getOutputFormat()); 
       muxer.start(); 
      } else if (index >= 0) { 
       if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) { 
        // ignore codec config 
        info.size = 0; 
       } 
       if (track != -1 && info.size > 0) { 
        ByteBuffer out = avc.getOutputBuffer(index); 
        out.position(info.offset); 
        out.limit(info.offset + info.size); 
        muxer.writeSampleData(track, out, info); 
        avc.releaseOutputBuffer(index, false); 
       } 
      } 
     } 
    } 
} 

Я думаю, что нормальный SW AAC кодер должен быть хорошо с вами пропусканием произвольного числа байт аудио к нему , но в случае, когда кодировщик является придирчивым, вам необходимо передать его записанным данным в блоках из 1024 отсчетов (2048 байт для моно, 4096 байт для стерео).