Android录制视频后,音视频同步有问题

4
我正在尝试解决音视频同步问题。视频比音频慢了1秒钟。(请看下面的注释)
从Android媒体框架部分开始,我能否延迟音频时间戳以使其与视频同步,应该从哪里开始?是AudioSource?MPEG4Writer?MediaCodecSource?
请帮忙!
案例:如果有一个5秒的视频。当前情况:
0-1秒的视频部分会冻结,1-5秒正常播放。从1.00秒开始的视频帧实际上是从0.00秒开始的。
音频部分在整个场景中都正常。因此,视频部分将比音频部分慢1秒钟。
1.00秒的视频部分实际上与0.00秒的音频部分匹配。
尝试失败:
我尝试将MPEG4Writer上视频部分的StartTimeUs移动,A/V将同步,但最终文件中会有1.00秒的视频冻结和正常的音频。
我的想法:
如果我能暂停音频1秒钟,那么它将把音频从0.00秒移动到1.00秒,这样就可以同步了。但我不知道我可以更改哪个代码来实现这种方法。请帮忙!

My Notes


你需要分别录制音频和视频。对于音频记录,你需要使用OpenGLEs。对于没有声音的视频记录,可以使用Camera类和Surfaceview。然后将它们混合在一起。 - Amit Thaper
1个回答

0

我假设您正在使用MediaCodec编码器并将输出馈送到MediaMuxer以生成视频文件。

听起来这可能与我在this question中遇到的类似问题有关。我认为音频MediaCodec编码器基本上会忽略您提供的任何时间戳;因此,我不认为更改音频时间戳会解决您的问题。但是,听起来您可以通过在帧离开编码器但在到达复用器之前将视频帧时间戳更正为更早的时间(与音频同步)来解决该问题。


1
我已经更新了问题。情况是视频始终会比音频慢1秒。我尝试将MPEG4Writer的视频StartTimeUs更改为1秒。它会同步直到文件的最后1秒。我得到了冻结的视频,但正常的音频...求助~ - user2871337
你能分享一下代码“将视频帧时间戳更正为早期时间”吗?假设视频比音频晚了1秒。 - user2871337
在我的情况下,视频帧被绘制到一个Surface上,该Surface作为MediaCodec视频编码器的输入。因此,我的代码使用了一对Surface.lockCanvas()(或在较新的设备上使用lockHardwareCanvas())和Surface.unlockCanvasAndPost()。由于unlock方法不允许传递时间戳,所以我在每次调用MediaMuxer.writeSampleData()时手动将时间戳放入BufferInfo中。 - Grant
@Grant,你的解决方案是什么?我也遇到了同样的情况。我的视频通过OpenGLS传输,但音频是通过AudioRecord捕获的。音频比视频提前约500毫秒播放。我正在努力尝试将两者同步,但却无法解决。我也不想假设所有设备上的延迟都是相同的约500毫秒。 - JCutting8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接