2016-11-08 7 views
1

Мне удалось объединить несколько видеороликов со звуковыми дорожками, но потом я понял, что если я объединю несколько видеороликов с одним из них, не имеющим звуковой дорожки, я должен добавить молчание комбинированная звуковая дорожка.MediaCodec - намеренно добавляет тишину к звуковой дорожке

Итак, как мне это сделать? Должен ли я кодировать ByteBuffer, заполненный 0 секундами, для тишины?

ответ

0

Итак, как мне это сделать? Должен ли я кодировать ByteBuffer, заполненный 0 секундами, для тишины?

По существу да. Я использую функцию ниже, чтобы закодировать тишину в определенное время презентации. Для длины вашего видео без звука, вы должны быть тишиной кодирования с регулярным интервалом. Я решил, что интервал должен соответствовать звуку перед ним. Так что в моем случае период между временем представления аудио моего первого видео был 21333 нас.

Используя эту информацию, я начал кодирующую молчание: от последнего времени представления аудио первого видео в + 21333, с интервалом 21333, пока я не закодирован достаточно тишины, чтобы последней полного видео

Я все еще пытаюсь выяснить, как использовать видео без звука (в качестве первого видео), а затем видео со звуком. Я уточню свой ответ, если выясню это.

private byte[] zerodArray = new byte[2048];// Used to encode silent audio... Not really sure how big this should be ...... 

private void encodeSilenceForFrame(long presentationTime){ 
    //mAudioEncoder is the audio encoder you are using to combine the other videos' audio. 
    final int TIMEOUT_USEC = 10000; 
    int encoderInputBufferIndex = mAudioEncoder.dequeueInputBuffer(TIMEOUT_USEC); 
    if (encoderInputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) { 
     if (VERBOSE) Log.d(TAG, "no audio encoder input buffer"); 
    } 
    if (VERBOSE) { 
     Log.d(TAG, "audio encoder: returned input buffer: " + encoderInputBufferIndex); 
    } 
    ByteBuffer encoderInputBuffer = mAudioEncoder.getInputBuffer(encoderInputBufferIndex); 
    encoderInputBuffer.position(0); 
    encoderInputBuffer.put(zerodArray); 
    Log.d(TAG, "audio silence: pending buffer for time " + presentationTime); 


    mAudioEncoder.queueInputBuffer(
      encoderInputBufferIndex, 
      0, 
      zerodArray.length, 
      presentationTime,0); 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^