【问题标题】:Audio Session: Using measurement mode causes low volume / no sound in iOS 7.1音频会话:在 iOS 7.1 中使用测量模式会导致音量低/没有声音
【发布时间】:2014-05-05 18:18:00
【问题描述】:

将 AVAudioSessionModeMeasurement 与 AVAudioSessionCategoryPlayAndRecord 一起使用在 iOS 5.x、6.x 和 7.0 下可以正常工作,但现在在 iOS 7.1 下的某些(不是所有)设备上会导致音量低/扬声器没有声音。代码如下:

NSError* error = nil;
// Set Aduio Session category
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord
              withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker
                    error:&error];
if( error ) ...

// Set Audio Session mode
[audioSession setMode:AVAudioSessionModeMeasurement error:&error];
if( error ) ...

旁注:旧版本的代码使用 AudioSessionSetProperty 函数来设置 kAudioSessionProperty_OverrideCategoryDe​​faultToSpeaker,但在 iOS 7.1 下仍然存在同样的问题。

到目前为止,低音量(或无声音)问题似乎仅出现在 iPad 4 设备上。我不知道它是在所有 iPad 4 上发生还是仅在一部分上发生,但只有使用 iPad 4 的客户在升级到 iOS 7.1 后与我们联系过这个问题。删除将模式设置为 AVAudioSessionModeMeasurement 的代码可以解决问题;以正常音量听到音频。但是,不使用测量模式会影响我们对录制的音频进行的信号处理,因此绝对不可取。

如何播放音频似乎并不重要。设置测量模式时,AVAudioPlayer 和音频队列服务都表现出相同的低音量/无声音问题。

因为这个问题似乎只影响 iPad,所以我尝试删除 AVAudioSessionCategoryOptionDefaultToSpeaker 选项(iPhone 通常需要该选项),看看是否有帮助,但这并没有改变。

插入耳机即可解决问题;通过耳机以正常音量听到音频。

假设这是 iOS 7.1 的错误,我已经将它作为错误报告给 Apple。但是我想问你们,看看我是否错过了 iPad 4 的一些特别之处,或者我的音频会话设置中的其他一些东西。如果您有一个播放音频的应用程序(通过 AVAudioPlayer 或音频队列服务),即使您让我知道在您将类别更改为 AVAudioSessionCategoryPlayAndRecord 并将模式更改为 AVAudioSessionModeMeasurement 后音频是否仍然可以在 iPad 4 上正常播放,这也会有所帮助极大地。您的应用程序不需要实际录制任何音频;无论是否正在录制音频,都会出现此问题。

提前感谢您的帮助。

【问题讨论】:

标签: ios ipad core-audio avaudiosession ios7.1


【解决方案1】:

我自己在 iOS 7 的 iPad 上肯定遇到过这个问题。

录制时,AVAudioSessionModeMeasurement 确实会改变 iOS 7 上的播放音量。

Apple 的文档状态: 如果您的应用正在执行音频输入或输出的测量,请指定此模式。 ... 如果在具有多个内置麦克风的设备上录制,则使用主麦克风。

在具有两个扬声器和两个麦克风的 iPhone 上,这种做法有点道理。从手机底部的麦克风录制时,它会从听筒扬声器中播放音频,以防止干扰。在免提模式下使用时,它使用响亮的底部扬声器和听筒中的麦克风。

在 iOS 7 的 iPad 上,它似乎通过单方面降低播放音量来复制这种行为。

直接回答您的问题:是的,我相信这是一个错误,或者至少是一个非常无证的功能。

完成录音和测量后,您可以通过以下方式重置静音音频:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&err];
if(err) NSLog(@"AudioSession reset category error at %s:%d", __FILE__, __LINE__);

[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:&err];
if(err) NSLog(@"AudioSession reset mode error at %s:%d", __FILE__, __LINE__);

虽然这不一定有帮助,但同样我确认的发现是不使用 AVAudioSessionModeMeasurement 可以解决问题。

【讨论】:

  • 嗨,安迪,感谢您的回复。请注意,该 API 在大多数 iPad 型号(iPad 2、iPad 3、iPad Air)上都能正常工作;它只在 iPad 4 上失败。所以它不是真正的 iPhone 与 iPad 的事情。此外,除非在 iOS 7.1 中发生了某些变化,否则测量模式也会消除额外的过滤(即,它不仅会改变使用的麦克风),因此对于任何进行信号处理的应用程序来说,它在 iPad 上也是必不可少的,即使是 iPad只有一个麦克风。
  • 顺便说一句,我已在 3 月份向大量用户群发布了该应用程序的更新版本,仅在 iPad 4 上禁用了此模式,此后没有听到任何客户投诉,进一步确认其他 iPad 型号没有出现同样的问题。
  • 哦,很高兴了解 iPad Air。我在 iPad 4 上注意到了这一点,并假设所有较新的设备也会有这个问题。除了没有在 Airs 上进行测试外,您的发现与我的一致。谢谢!
  • 这个问题解决了吗?
  • @Pi 不。我最终放弃了测量模式,因为自 iOS 7.1 以来它一直很痛苦。我想一个选择是仅在插入耳机时启用它,但我调整了我的信号处理算法以在没有测量模式的情况下完美地工作,所以没有任何理由在这种行为模式下冒险从一种设备型号到另一种设备型号差别很大。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
相关资源
最近更新 更多