Итак, как мне это сделать? Должен ли я кодировать 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);
}