AVAudioSession 的 OutputVolume 永远不会改变

Posted

技术标签:

【中文标题】AVAudioSession 的 OutputVolume 永远不会改变【英文标题】:AVAudioSession's OutputVolume never changes 【发布时间】:2014-07-21 18:43:26 【问题描述】:

SO 上有很多问题和答案都说[AVAudiosession sharedInstance].outputVolume 是检测设备音量的唯一方法。但它似乎并不完全正确。 outputVolume 永远不会改变,尽管它在第一次设置时是正确的(在应用程序启动时)。

我做错了吗?除了读取outputVolume 的值,我不知道还能做什么。我的直觉会告诉我这是一个错误,如果不是因为 other people 似乎做得很好。我还在 iOS 7 和 8 上对其进行了测试,所以它不是 iOS 8 的错误。我在一个小型测试项目中复制了同样的东西,所以我的项目中没有任何东西干扰它。

另外:我很清楚铃声音量和音量之间的区别。我都改了,报的量还是没变。

这是我在测试项目中使用的函数:

- (void)checkVolume

    float volume = [AVAudioSession sharedInstance].outputVolume;

    NSLog(@"Volume: %f", volume);

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
    
        [self checkVolume];
    );

【问题讨论】:

【参考方案1】:

使用KVO,并确保激活sharedInstance

[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionNew context:nil];

【讨论】:

我明白了。秘密就在[[AVAudioSession sharedInstance] setActive:YES error:nil]; 行中。这是我在outputVolume 改变之前必须调用的。非常感谢 在找到这个答案之前,我不得不查看很多虚假的 SO 答案。它应该被评为更高。 我仍然遇到一个问题,即 outputVolume 上的 KVO 在我的应用失去焦点后似乎停止工作(基本上是在我的音频会话被重置时),即使我重新注册了观察者。跨度> 【参考方案2】:

我发现我需要实际输出声音才能使 [AVAudioSession sharedInstance].outputVolume 准确。

换句话说 - [AVAudioSession sharedInstance].outputVolume 有点小问题 - 你需要播放音频才能返回正确的音量。

【讨论】:

这篇文章看起来不像是试图回答这个问题。这里的每一篇文章都应该明确地尝试回答这个问题;如果您有批评或需要澄清问题或其他答案,您可以在其下方直接post a comment(如这个)。请删除此答案并创建评论或新问题。见:Ask questions, get answers, no distractions 你会发现网上很多人说 [AVAudioSession sharedInstance].outputVolume 不起作用,这就是为什么至少有时会这样。 问题是为什么获取音量不能正常工作。答案是你需要播放声音才能让它工作。【参考方案3】:

我检查了 iOS 12:

[[AVAudioSession sharedInstance] setActive:YES error:nil];
float vol = [[AVAudioSession sharedInstance] outputVolume];
NSLog(@"outputVolume: %f", vol);

【讨论】:

【参考方案4】:

我也有这个问题。您需要开始您的音频会话并为其指定一个类别:

let session = AVAudioSession.sharedInstance()

do 
  try session.setCategory(.playback, options: .mixWithOthers)
  try session.setActive(true)
 catch 
  print("Unable to start audio session: \(error)")

您的音频会话的输出音量现在应该会发生音量变化。

【讨论】:

以上是关于AVAudioSession 的 OutputVolume 永远不会改变的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioSession

何时使用AVAudioSession.setActive?

AVAudioSession - 捕获 setMode 和 setCategory 错误

AVAudioSession 斯威夫特

AVAudioSession 和 AirPods

iOS- 关于AVAudioSession的使用——后台播放音乐