1

我使用 AVPlayerLooper 在 AVPlayer 内循环播放视频。视频实际上是一个 AVComposition 合并了两个音频轨道和一个视频轨道。

我在组合上应用了两个 audiomix 输入参数,一个用于每个音轨来管理它们各自的音量(使用 setVolume() 方法)。另请注意,其中一个音轨还有一个抽头处理器来应用一些音频过滤器,使用 audiomix 输入参数中的专用属性。

一切似乎都很好,但我注意到音量有问题:

第一个循环很好,可以渲染预期的音量,但下一个循环的音量似乎是随机的,一个循环处于预期的音量(比如说 setVolume() 中的 4.0),另一个循环是默认的(1.0)。

请注意,如果我在音量低于预期的循环中播放时将 AVPlayer 静音和取消静音,则音量会恢复到其配置和预期的值。

请注意,使用 AVAssetExportSession 在文件中导出相同的组合(因此从任何循环器中导出)效果很好,音量始终符合预期。

你有什么提示可以帮助我解决这个问题吗?

4

1 回答 1

1

这一切听起来像是一个错误(即第一个循环有效,AVAssetExportSession有效),加上将音量设置为 AVMutableAudioMixInputParameters文档 [0, 1] 范围之外的值听起来像是一种可能引发奇怪行为的事情,但是改变MTAudioProcessingTap创建标志from kMTAudioProcessingTapCreationFlag_PostEffectstokMTAudioProcessingTapCreationFlag_PreEffects似乎可以解决或至少解决此问题。

从头文件:

kMTAudioProcessingTapCreationFlag_PreEffects 表示在任何效果之前插入处理抽头。
kMTAudioProcessingTapCreationFlag_PostEffects 表示在任何效果之后插入处理抽头。

我对此的解读是,这两个标志只会改变谁首先听到音频:点击或AVAudioMix inputParametersinputParameters没有获得特殊的优先标志,所以我假设它们是按数组顺序应用的?)。所有这一切都表明混合配置在某个时间点被丢弃,所以我猜 pre-fx 恰好让你避免了错误的、不愉快的代码路径。

所以总而言之,我希望你在点击应用音量控制不是问题。如果是这样,只需在水龙头内应用音量即可。

AVPlayerLooper但是,伙计,AVComposition和之间令人讨厌的交互MTAudioProcessingTap?哎呀。并且标志始终是 API 设计中的危险信号。

于 2018-12-21T00:29:13.863 回答