调整 AVAudioMix 音量属性在 iOS9 中没有效果

Posted

技术标签:

【中文标题】调整 AVAudioMix 音量属性在 iOS9 中没有效果【英文标题】:Adjusting AVAudioMix volume property has no effect in iOS9 【发布时间】:2015-09-21 14:44:39 【问题描述】:

我有一个应用程序,它通过 AVMutableComposition 将本地文件加载到 avPlayer 中,它可能有多达 6 个音频和视频轨道作为合成的一部分。

我有一个 UISlider,用于调整播放器中每个音轨的音量。

以下是用于更新音量的代码。

- (void)updateVolumeForTake:(Take *)take
    
    NSInteger trackID = // method that gets trackID

    AVMutableAudioMix *audioMix = self.player.currentItem.audioMix.mutableCopy;
    NSMutableArray *inputParameters = audioMix.inputParameters.mutableCopy;

    AVMutableAudioMixInputParameters *audioInputParams = [inputParameters filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:kTrackIdPredicate, trackID]].firstObject;

   [audioInputParams setVolume:myNewVolumeFloat atTime:myDesiredTime];

    audioMix.inputParameters = inputParameters;

    AVPlayerItem *playerItem = self.player.currentItem;
    playerItem.audioMix = audioMix;

这目前在 appStore 中,自 ios6 以来一直存在,并且一直没有问题。 在运行 iOS9 的设备上,上述内容根本不起作用。我查看了发行说明,虽然其中提到了 AVFoundation,但我没有看到任何关于 AVAudioMix 的信息。我在 Google 上四处搜索,没有发现其他人遇到此问题。

我还尝试使用 AVPlayer 和 UISlider 创建一个新项目,但我看到了相同的行为。

我的问题如下,有没有其他人遇到过这个问题? 有人知道与此相关的已知错误吗?

【问题讨论】:

【参考方案1】:

我找到了解决方案,但不幸的是不是一个确切的原因。

我不能说我完全理解为什么这解决了我的问题,但这里是解决方案,并试图解释为什么它解决了我遇到的问题。

- (void)updateVolumeForTake:(Take *)take


    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
    NSMutableArray *inputParameters = [self.inputParameters filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:kNotTrackIdPredicate, myTrackID]].mutableCopy;

    AVCompositionTrack *track = (AVCompositionTrack *)[self.composition trackWithTrackID:myTrackID];
    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];
    [audioInputParams setVolume:myDesiredVolume atTime:kCMTimeZero];

    [inputParameters addObject:audioInputParams];
    audioMix.inputParameters = inputParameters;

    AVPlayerItem *playerItem = self.player.currentItem;
    playerItem.audioMix = audioMix;

    self.inputParameters = inputParameters;

正如您在上面看到的,我已经停止使用我的 AVAudioMix 及其 inputParameters 的可变副本,而是为 inputParameters 创建了一个新的 AVAudioMix 和 NSMutableArray。新的 inputParameters 数组是现有 inputParameters 的副本(从属性“self.inputParameters”引用)减去与我希望更改的轨道匹配的轨道。

其次,我使用我希望编辑音量的轨道创建 AVMutableAudioMixInputParameters 的新实例(之前我使用匹配的 trackID 引用现有参数并修改它们)。我编辑它,将其添加到我的新数组中,并使其成为 currentItem 的音频混合。

再次,我不能肯定地说为什么会修复它,但它确实对我有用,我想知道当我重新分配 playerItem 的 audioMix 时,是否所有可变副本都没有被发现不同,这就是为什么我没有听到音量有任何变化。 (尽管这似乎值得怀疑)。

无论如何我的问题已经解决了,我希望这可以帮助任何有类似问题的人。

【讨论】:

非常感谢!正是 5 年后解决了我的问题 :)

以上是关于调整 AVAudioMix 音量属性在 iOS9 中没有效果的主要内容,如果未能解决你的问题,请参考以下文章

iOS9如何改变音量?

Pygame - 永久调整主音量

无法在我的 iphone 应用程序中调整音量

通过移动设备音量调高按钮调整 chromecast 电视音量

iOS 9:如何在不显示系统条形音箱弹出窗口的情况下以编程方式更改音量?

在应用内调整音量