我设法将多个视频与音轨合并,但后来我意识到,如果我将多个视频与其中一个没有音轨合并,我必须为组合音轨添加静音。
那么,我该怎么做呢?我应该用填充0的ByteBuffer对时间戳进行编码以保持静音吗?
答案 0 :(得分:0)
那么,我该怎么做呢?我应该用填充0的ByteBuffer对时间戳进行编码以保持静音吗?
基本上是的。我正在使用下面的函数在某个演示时间编码静音。 对于没有音频的视频长度,您应该定期编码静音。我确定间隔应该与之前的音频匹配。所以在我的情况下,我的第一个视频的音频呈现时间之间的时间间隔为21333 us。
使用该信息我开始编码沉默: 从第一个视频的音频+ 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);
}