7

我有一个带有 2 个音轨和一个视频轨的 AVMutableComposition。我正在使用合成从 .mov 文件中串起大约 40 个不同的视频剪辑,将每个剪辑的视频内容放在我的合成的视频轨道中,并将音频放在音轨中。我用于音乐的第二个音轨。我还有一个用于标题图形的同步层。

当我使用 AVPlayer 播放此作品时,音频会慢慢不同步。开始变得明显大约需要 4 分钟。似乎如果我只将少数较长的剪辑串在一起,问题就不那么明显了,当有很多剪辑较短的剪辑(在我的测试中约为 40 个)时,它会变得非常糟糕。

暂停和播放不会重新同步音频,但是搜索会。换句话说,如果我让视频播放到最后,即使我在整个过程中暂停和播放,唇形同步也会明显关闭,但是,如果我寻找到接近尾声的时间,音频就会恢复同步。

我现在的 hacky 解决方案是每分钟左右寻找 currentTime + 1 帧。这会在视频中产生令人不快的跳跃,这是由于查找操作的延迟而导致的,因此不是一个好的解决方案。

使用 ExportSession 导出不会出现此问题,音频在输出影片中保持同步。

我想知道 AVPlayer 中的新 masterClock 属性是否是这个问题的答案,如果是,它是如何使用的?

4

1 回答 1

2

我遇到了同样的问题,并通过以下方式指定时间尺度来修复它,以及许多其他音频和视频内容:

CMTime(seconds: my_seconds, preferredTimescale: CMTimeScale(600))

之前,我的时间刻度是CMTimeScale(NSEC_PER_SEC). 这让我在以不同的帧速率编写剪辑时感到紧张,加上 Eddy 在这里提到的音频不同步。

尽管看起来像一个神奇的数字,但 600 是 24、30、60 和 120 的公倍数。这些是用于不同目的的常用帧速率。共同倍数避免了在编写多个剪辑时拖拽舍入问题。

于 2018-09-11T01:02:29.623 回答