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