Mux视频与我自己的音频PCM轨道

时间:2015-07-29 03:05:47

标签: android audio mediacodec pcm

使用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吗?

1 个答案:

答案 0 :(得分:1)

如果你想减慢你的音频样本,你需要在编码之前这样做,所以在排队音频编解码器的输入缓冲区之前。 根据我的经验,大多数玩家都忽略了音频演示时间戳(我用VLC和ffplay尝试过)。如果你想确保音频和视频保持同步,你必须确保你实际上有足够的音频样本来填补pts之间的差距,否则玩家将开始播放以下样本而不管他们的分数。 此外,您不能只使用MediaMuxer对PCM样本进行多路复用,您需要先对它们进行编码。