AVPlayerLooper、带有 AVMutableAudioMixInputParameters 的 AVComposition:音量在循环之间不稳定

AVPlayerLooper, AVComposition with AVMutableAudioMixInputParameters : volume is instable between loops

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

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

似乎一切正常,但我注意到音量有问题:

第一个循环很好并呈现预期音量,但下一个循环的音量似乎是随机的,一个循环处于预期音量(假设 setVolume() 中的 4.0),另一个是默认的 (1.0).

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

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

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

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

来自头文件:

kMTAudioProcessingTapCreationFlag_PreEffects Signifies that the processing tap is inserted before any effects.
kMTAudioProcessingTapCreationFlag_PostEffects Signifies that the processing tap is inserted after any effects.

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

总而言之,我希望您在点击后应用音量控制不会有问题。如果是,只需在水龙头内自己施加音量。

但是,伙计,AVPlayerLooperAVCompositionMTAudioProcessingTap 之间有讨厌的互动吗?哎呀。在 API 设计中,旗帜始终是红旗。