【问题标题】:AVAudioSession's OutputVolume never changesAVAudioSession 的 OutputVolume 永远不会改变
【发布时间】: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];
    });
}

【问题讨论】:

    标签: ios avaudiosession


    【解决方案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)")
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-10
        • 1970-01-01
        相关资源
        最近更新 更多