ios - Audio Session : Using measurement mode causes low volume/no sound in iOS 7. 1

标签 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 上,但只有 iPad 4 的客户在升级到 iOS 7.1 后就此问题与我们联系。删除将模式设置为 AVAudioSessionModeMeasurement 的代码可以解决此问题;以正常音量听到音频。但是,不使用测量模式会影响我们对录制的音频进行的信号处理,因此绝对不可取。

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

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

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

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

在此先感谢您的帮助。

最佳答案

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

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

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

在具有两个扬声器和两个麦克风的 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 可以解决问题。

关于ios - Audio Session : Using measurement mode causes low volume/no sound in iOS 7. 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676367/

相关文章:

swift - Effect AudioUnit 只调用一次渲染回调

ios - 如何从 MIDISourceCreate() 中保留虚拟 MIDI 源的唯一性?

ios - 在 v5 中将预取图像复制到内存中 (SDWebImageCacheMemoryOnly)

ios - didBeginContact 方法不起作用

objective-c - 将 CGrect 值更改为用户坐标系

ios - Autolayout 在 iOS 8 应用程序(Interface Builder)中没有给出预期的输出/行为

iphone - 在编译器中为 NSLog 设置一个标志不显示

ios - UISplitViewController Detail View 旋转后消失

ios - 如何将 AUGraph 的输出写入文件?

iphone - iOS Sprite Kit 如何水平反射 Sprite ?