我有一个应用程序,它通过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的任何内容。我已经搜索过,并没有找到其他任何人解决此问题。
我还尝试创建一个只有AVPlayer和UISlider的新项目,我看到了同样的行为。
我的问题如下,还有其他人遇到过这个问题吗? 有人知道与此相关的已知错误吗?
答案 0 :(得分:5)
我找到了一个解决方案,但不幸的是不是一个确切的原因。
我不能说我完全理解为什么这解决了我的问题,但这是解决方案,并尝试解释为什么它解决了我遇到的问题。
- (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时,是否所有可变副本都没有被发现。为什么我没有听到音量的任何变化。 (虽然这看起来很可疑)。
无论如何,我的问题已得到修复,我希望这可以帮助任何有类似问题的人。