使用 AVPlayer 音频播放 AVMutableComposition 会不同步

Posted

技术标签:

【中文标题】使用 AVPlayer 音频播放 AVMutableComposition 会不同步【英文标题】:Playing an AVMutableComposition with AVPlayer audio gets out of sync 【发布时间】:2012-10-19 22:29:40 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

您在创建 AVURLAsset 时是否将资产选项的“AVURLAssetPreferPreciseDurationAndTimingKey”设置为 [NSNumber numberWithBool:YES]? 是的,我确实将“AVURLAssetPreferPreciseDurationAndTimingKey”设置为 [NSNumber numberWithBool:YES] 根据您的描述,我猜这个问题与您为视频和音频轨道设置时间刻度的方式有关。但我必须看到你的作文代码才能提供帮助。 似乎我也有同样的问题。我正在尝试将许多视频和音频文件合并到一个视频中。您找到解决此问题的方法了吗? 你能解决这个问题吗?我目前遇到同样的问题,并开始认为它与音轨/文件 beeing VBR 编码有关...... CBR 文件工作正常 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于使用 AVPlayer 音频播放 AVMutableComposition 会不同步的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVPlayer 播放音频时如何在 UIWebView 中暂停音频

iOS音频篇:使用AVPlayer播放网络音乐

使用 AVPlayer 在 iOS 中音频流期间的播放速度

iOS音频篇:使用AVPlayer播放网络音乐

AVPlayer 不播放音频

使用 AVPlayer 音频播放 AVMutableComposition 会不同步