AVAudioRecorder & AVAudioPlayer - 内置扬声器的声音输出,如何更改?
Posted
技术标签:
【中文标题】AVAudioRecorder & AVAudioPlayer - 内置扬声器的声音输出,如何更改?【英文标题】:AVAudioRecorder & AVAudioPlayer - Sound output on internal speaker, how to change? 【发布时间】:2010-06-23 18:47:27 【问题描述】:我对 AVAudioRecorder 和 AVAudioPlayer 有疑问。
当我同时使用播放器和录音时(例如,在录音时播放声音),声音在安静的内部扬声器中。我搜索了***,我发现的只是这段代码:
UInt32 *audioRouteOverride = kAudiosessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
但这对我没有帮助:( 当我复制粘贴它时,我得到了错误。 如何录制和播放底部的扬声器?
我不使用 SCLister 之类的东西...
提前致谢
最大
【问题讨论】:
【参考方案1】:这有点旧,但这篇文章对我有帮助,我想为将来可能需要它的其他人更新它。顶部发布的代码是正确的 - 它将通过电话扬声器播放的安静音频并将其路由到底部的扬声器。代码中有一个小错字,这就是它给出错误的原因。这是解决此问题的正确 sn-p:
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
确保在设置后立即激活音频会话,然后再创建音频播放器/录音机:
[[AVAudioSession sharedInstance] setActive:YES error:nil];
最后,如果您要同时播放和录音,您可能还需要设置类别和混音功能。这是整个 sn-p,它将设置类别、启用混合、将音频路由到主扬声器并激活会话。您只需在应用启动后立即执行此操作一次。
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
OSStatus propertySetError = 0;
UInt32 allowMixing = true;
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
NSLog(@"Mixing: %x", propertySetError); // This should be 0 or there was an issue somewhere
[[AVAudioSession sharedInstance] setActive:YES error:nil];
希望对某人有所帮助!
【讨论】:
有相当多的 Apple 示例代码显示 error:nil 和 error:NULL ,因此两者都可以使用。它肯定不会引起任何问题。【参考方案2】:我已经在这里回答过了:How to get AVAudioPlayer output to the speaker
简而言之,在录制之前使用它:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
...并在播放前使用它(如果已插入扬声器或耳机)
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
【讨论】:
【参考方案3】:关于这个话题我发现的唯一一点是:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
如果您想同时播放,则必须在录制音频时进行设置。试一试,让我知道。
附:确保将 AudioToolbox
和 AVFoundation
框架添加到您的项目中,并将它们包含在您的 .m 文件中。
【讨论】:
是的,这是必需的,但我明白了。没有变化:(功能本身还可以,你可以吹麦克风并听到声音,但只能使用内置扬声器。【参考方案4】:如果您目前正在通过静音扬声器播放,并且想通过 iPhone 底部的扬声器播放,请使用以下代码:
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty (
kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,
sizeof (doChangeDefaultRoute),
&doChangeDefaultRoute
);
【讨论】:
【参考方案5】:这是一个老问题,但其他答案都没有帮助我......但是,我找到了一个解决方案,我将其发布以供将来参考,以防有人需要它。
以下博客文章中描述了该解决方案:iOS: Force audio output to speakers while headphones are plugged in 。
您需要在项目中创建新的 Objective-C 类 AudioRouter。然后将AudioRouter.h
导入到您要启动音频功能的类的头文件中。现在在对应的.m
文件中,在viewDidLoad
方法中添加以下行:
AudioRouter *foobar = [[AudioRouter alloc] init];
[foobar initAudioSessionRouting];
[foobar forceOutputToBuiltInSpeakers];
现在您可以将音频(例如 AVAudioPlayer)输出强制到扬声器!
【讨论】:
【参考方案6】:AudioSessionSetProperty 自 iOS7 以来已被弃用,但以下内容对我有用。
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
【讨论】:
以上是关于AVAudioRecorder & AVAudioPlayer - 内置扬声器的声音输出,如何更改?的主要内容,如果未能解决你的问题,请参考以下文章
关于使用 AVAudioPlayer 自动录制和自动播放 AVAudioRecorder
ava.io.InputStream & java.io.FileInputStream