我使用AVPlayerLooper在AVPlayer中循环播放视频。 该视频实际上是将两个音轨和一个视频轨合并的AVComposition。
我在作品上应用了两个audiomix输入参数,每个音轨一个参数来管理它们各自的音量(使用setVolume()方法)。 还要注意,音轨之一还具有抽头处理器,可以使用audiomix输入参数中的private属性来应用一些音频滤波器。
一切似乎都正常,但我注意到音量有问题:
第一个循环很好,可以呈现预期的音量,但是下一个循环的音量似乎是随机的,一个循环处于预期的音量(在setVolume()中为4.0),另一个循环为默认值(1.0)。
请注意,如果我在音量低于预期的循环中播放时对AVPlayer进行静音和取消静音,则音量会恢复为其配置和预期的值。
请注意,使用AVAssetExportSession将相同的合成文件导出到文件中(这样就可以从任何循环播放器中导出)效果很好,音量始终符合预期。
您有任何提示可以帮助我解决此问题吗?
答案 0 :(得分:1)
关于此的一切听起来都像个错误(viz first loop有效,AVAssetExportSession
有效),再加上将AVMutableAudioMixInputParameters
的音量设置为已记录的[0,1]范围之外的值,听起来像那种可能引起怪异行为的事物,但是如何将MTAudioProcessingTap
创建标志从kMTAudioProcessingTapCreationFlag_PostEffects
更改为kMTAudioProcessingTapCreationFlag_PreEffects
似乎可以解决或至少可以解决此问题。
来自头文件:
kMTAudioProcessingTapCreationFlag_PreEffects
表示在任何效果之前已插入处理水龙头。
kMTAudioProcessingTapCreationFlag_PostEffects
表示在任何效果之后都插入了处理水龙头。
我的理解是,这两个标志只会更改谁在音频上首先受到叮咬的人:水龙头或AVAudioMix
inputParameters
(inputParameters
不会得到特殊的优先标志,因此我假设它们以数组顺序应用?)。所有这些都没有表明在某个特定的时间点会丢弃混合配置,因此我认为pre-fx恰好可以避免出现错误的,不愉快的代码路径。
因此,总而言之,我希望在点击后 应用音量控制不是问题。如果是的话,只需将自己的音量放在水龙头内即可。
但是,伙计,AVPlayerLooper
,AVComposition
和MTAudioProcessingTap
之间的互动令人讨厌吗? kes。而且标志在API设计中始终是一个危险信号。