结合 AVAudioSessionCategoryPlayAndRecord 的低录音音量

Posted

技术标签:

【中文标题】结合 AVAudioSessionCategoryPlayAndRecord 的低录音音量【英文标题】:Low recording volume in combination with AVAudioSessionCategoryPlayAndRecord 【发布时间】:2010-02-11 17:44:48 【问题描述】:

当我设置时:

[[AVAudiosession sharedInstance] setCategory:
    AVAudioSessionCategoryPlayAndRecord error:NULL];

…录音和播放效果很好,只是播放音量比我在没有录音和设置 PlayAndRecord 的情况下播放相同的声音时低 60% 左右。

我需要获得高音量峰值(以检查用户是否对麦克风吹气),因为我开始了录音会话。但如果没有设置 AVAudio..PlayandRecord,我无法同时播放任何声音。这就是我实现这个命令的原因。

有什么帮助吗?

谢谢克里斯

【问题讨论】:

【参考方案1】:

对于遇到相同问题的每个人,请将您的输出重定向到扬声器:

[[AVAudioSession sharedInstance] setCategory:
    AVAudioSessionCategoryPlayAndRecord error:NULL];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute,
    sizeof(audioRouteOverride), &audioRouteOverride);

这行得通。

【讨论】:

谢谢!这解决了我在 AVAudioSessionCategoryPlay 和 AVAudioSessionCategoryRecord 之间切换的延迟问题 当您尝试与耳机同时使用时会出现很多错误 工作正常。但是当背景音频在耳机中播放时,在录音的同时,音频通过扬声器播放,我们该如何阻止呢?【参考方案2】:

我今天遇到了这个问题,看来这个答案有点过时了。 AudioSessionsSetProperty(...) 现已弃用。

以下似乎可行,通过扬声器提供全音量,但如果在应用运行之前插入耳机,则会自动将音频路由到耳机:

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];

如果您希望在插入耳机的情况下通过扬声器以最大音量播放音频,这也可以:

[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];

【讨论】:

你节省了我的时间...+1@lucian【参考方案3】:

我发现(参见the iOS documentation 中的清单 7-9),上面关于覆盖音频路由的建议解决方案在插入和移除耳机后停止工作。

因此,如果您希望在当前音频会话(the iOS documentation 中的清单 7-10)中永久更改音频路由,则可以使用相同的源设置默认音频路由

NSError *setCategoryErr = nil;
NSError *activationErr  = nil;
//Set the general audio session category
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: &setCategoryErr];

//Make the default sound route for the session be to use the speaker
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute);

//Activate the customized audio session
[[AVAudioSession sharedInstance] setActive: YES error: &activationErr];

当然要确保链接 AudioToolbox 框架并使用

#import <AudioToolbox/AudioServices.h>

【讨论】:

谢谢!这是一个很好的解决方案。 AudioSessionSetProperty 在 iOS 7.0 中已弃用 谢谢!这让我发疯了!【参考方案4】:

我今天遇到了这个问题,大多数答案似乎不适用于最近的 iOS 更改。上面使用 defaultToSpeaker 选项的 Lucian 的回答是正确的,尽管在模拟器和设备上的行为似乎仍然不同。对我有帮助的是在一次调用中设置类别、模式和选项,这在 iOS 10+ 中可用,如下所示:

try session.setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeDefault, options: .defaultToSpeaker)

使用此音频一直到最大并保持这种状态。

【讨论】:

【参考方案5】:

不要忘记导入语句。对于更有经验的程序员来说可能很明显......

#import <AudioToolbox/AudioServices.h>

【讨论】:

【参考方案6】:

另外,需要通过右键框架 -> 添加 -> 现有框架,将 AudioToolbox 和 AVFoundation 框架添加到您的项目中。

否则可能会出现链接器错误:“_AudioSessionSetProperty”,引用自: -OpenBook.o中的[OpenBook startRecording]

【讨论】:

【参考方案7】:

在我的情况下,除了使用 AVAudioSessionCategoryOptionDefaultToSpeaker 选项之外,我还必须删除将 audioSession 模式从 AVAudioSessionModeDefault 更改为 AVAudioSessionModeMeasurement。

因此,如果您使用 AVAudioSessionModeDefault 以外的模式,请小心。

【讨论】:

以上是关于结合 AVAudioSessionCategoryPlayAndRecord 的低录音音量的主要内容,如果未能解决你的问题,请参考以下文章

连接蓝牙耳机时无法切换到扬声器输出

Swift实现iOS录音与播放音频功能

应用程序运行时无法将蓝牙耳机与 AVAudioSessionCategoryPlayAndRecord 连接

如何理解C语言的左结合 和右结合性

一个核糖体与mRNA的结合部位,为啥形成2个tRNA结合位点

编译器思维之结合律