将视频与我自己的音频 PCM 轨道混合

Mux video with my own audio PCM track

使用 Android MediaMuxer,将我自己的 PCM 音轨添加为最终电影中的音轨的合适方法是什么?

在电影中,在某个时间,我正在放慢速度、停止、然后加速并重新开始播放视频。对于视频部分,很容易直接影响演示时间,但对于音频,有一个逐块的过程,使得处理音轨中的减速、停止和开始不太直观。

目前,当遍历我从源接收到的缓冲区时,为了减慢整个轨道,我这样做:

// Multiply by 3 the presentation time.

audioEncoderOutputBufferInfo.PresentationTimeUs = 
              audioEncoderOutputBufferInfo.PresentationTimeUs * ratio);

// I expand the sample by 3. Damn, just realized I haven't
// respected the sample alignment but anyway, the problem is not about white noise...

encoderOutputBuffer = Slowdown(encoderOutputBuffer, 3); 

// I then write it in the muxer 
muxer.WriteSampleData(outputAudioTrack, encoderOutputBuffer, audioEncoderOutputBufferInfo);

但这就是不能播放。当然,如果 MediaFormat 从源复制到目标,那么它的持续时间将比实际音频数据短 3 倍。

我可以从一个输入中取出整个 PCM,编辑 byte[] 数组,然后将其作为轨道添加到 MediaMuxer 中吗?

如果您想放慢音频样本的速度,您需要在对它们进行编码之前执行此操作,因此在对音频编解码器的输入缓冲区进行排队之前。 根据我的经验,大多数播放器都会忽略音频演示时间戳(我用 VLC 和 ffplay 尝试过)。如果您想确保音频和视频保持同步,您必须确保您实际上有足够的音频样本来填充 to pts 之间的间隙,否则播放器将只开始播放后面的样本,而不管它们的 pts。 此外,您不能只使用 MediaMuxer 混合 PCM 样本,您需要先对它们进行编码。