音频会话:使用测量模式会导致iOS 7.1中音量低/无声音

时间:2014-03-27 01:08:55

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

将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上仍然可以正常播放音频,这将有助于我极大。您的应用不需要实际录制任何音频;无论音频是否正在录制,都会出现问题。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

我自己在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解决了这个问题。