我有一个带有2个音轨和一个视频轨的AVMutableComposition.我正在使用该合成来从.mov文件中串起大约40个不同的视频片段,将每个片段的视频内容放入我的合成视频轨道和音频轨道中的音频.我用于音乐的第二个音轨.我还有一个标题图形的同步图层.
当我使用AVPlayer播放此合成时,音频慢慢变得不同步.大约需要4分钟才能开始变得明显.看起来如果我只将一小撮较长的剪辑串在一起,问题就不那么明显了,那就是当有很多剪辑较短的剪辑(在我的测试中约为40)时,它变得非常糟糕.
暂停和播放不会重新同步音频,无论如何寻求.换句话说,如果我让视频播放到最后,即使我在整个过程中暂停和播放,唇音同步也会明显关闭,但是,如果我寻找一段时间,音频会重新同步.
我现在的hacky解决方案是每分钟左右寻找当前时间+ 1帧.由于搜索操作的延迟,这会在视频中产生令人不快的跳跃,因此不是一个好的解决方案.
使用ExportSession导出不会出现此问题,音频在输出影片中保持同步.
我想知道AVPlayer中的新masterClock属性是否是这个的答案,如果是,它是如何使用的?
小智 3
我遇到了同样的问题,并通过以下方式指定时间时间尺度来修复它以及许多其他音频和视频问题:
CMTime(seconds: my_seconds, preferredTimescale: CMTimeScale(600))
Run Code Online (Sandbox Code Playgroud)
之前,我的时间尺度是CMTimeScale(NSEC_PER_SEC). 这让我在以不同的帧速率编写剪辑时感到紧张,再加上 Eddy 在这里提到的音频不同步。
尽管看起来像一个神奇的数字,600 是 24、30、60 和 120 的公倍数。这些是用于不同目的的常见帧速率。公倍数可以避免在合成多个剪辑时出现舍入问题。