如何在 iPhone 应用程序中录制和播放声音?
Posted
技术标签:
【中文标题】如何在 iPhone 应用程序中录制和播放声音?【英文标题】:How to record and play sound in iPhone app? 【发布时间】:2011-04-14 11:07:56 【问题描述】:我尝试使用AVAudiosession
和AVAudioPlayer
分别录制和播放声音,但音量非常低。
我尝试将 AVAudioPlayer
的音量值设置为 1.0 或更高,但没有太大帮助。
我还有哪些其他选择可以录制足够响亮的声音以进行播放?
【问题讨论】:
您使用的是内置麦克风,还是标准耳塞电源线上的麦克风?声音的来源离麦克风有多近?如果您记录 -peakPowerForChannel,您会看到什么样的值? @NSResponder:我使用的是内置麦克风。你能解释一下如何记录 -peakPowerForChannel 吗? 【参考方案1】:这段代码应该对你有用:
#import <AudioToolbox/AudioServices.h>
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
sizeof (audioRouteOverride),&audioRouteOverride);
它会增加音量。该代码的功能是将普通声音转换为您 iPhone 上的扬声器声音。这就是使用 kAudioSessionOverrideAudioRoute_Speaker 的原因。
【讨论】:
感谢您的意见。我会检查一下并尽快回复你:) 非常感谢这确实有效:) 从现在开始我一直在寻找解决方案。 不要忘记导入语句。对于更有经验的程序员来说可能很明显... #import 我在上面的答案中添加了这个,感谢您提及所需的导入。 我让它工作了(声音从扬声器中出来),但我不确定我是否正确使用它。这是应用程序启动时的一次性事情吗?曾经在我的控制器的 viewDidLoad 处?每次我制作一个新的 AVAudioPlayer 一次?正如 KKendal 所问的那样:这是怎么回事?谢谢!【参考方案2】:从 iOS7 开始,您可以直接使用 AVAudioSession 解决此问题
overrideOutputAudioPort 方法的作用与 AudioSessionSetProperty 相同
NSError *setOverrideError;
NSError *setCategoryError;
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&setCategoryError];
if(setCategoryError)
NSLog(@"%@", [setCategoryError description]);
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&setOverrideError];
if(setOverrideError)
NSLog(@"%@", [setOverrideError description]);
【讨论】:
这条线救了我的命,谢谢 [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&setOverrideError];【参考方案3】:斯威夫特版本:
import AVFoundation
var overrideError : NSError?
if AVAudioSession.sharedInstance().overrideOutputAudioPort(.Speaker, error: &error)
else
print("error in overrideOutputAudioPort " + overrideError!.localizedDescription)
斯威夫特 2:
do
try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker)
catch
【讨论】:
在 Swift 2 中,现在是 do-try-catch 情况,不需要 overrideError 可选【参考方案4】:以下代码为我解决了这个问题:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error: nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
UInt32 doChangeDefault = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefault), &doChangeDefault);
【讨论】:
【参考方案5】:伙计,试试这个。
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *setCategoryError = nil;
if (![session setCategory:AVAudioSessionCategoryPlayback
withOptions:kAudioSessionOverrideAudioRoute_Speaker
error:&setCategoryError])
// handle error
NSError *error;
NSData * data = [NSData dataWithContentsOfURL:self.playlet.urlSound];
self.audioPlayer = [[AVAudioPlayer alloc] initWithData:data fileTypeHint:@"aac" error:&error];
self.audioPlayer.delegate = self;
if (error)
NSLog(@"Error: %@",
[error localizedDescription]);
else
[_audioPlayer play];
【讨论】:
【参考方案6】:只要设置这个 [会话覆盖输出音频端口:AVAudioSessionPortOverrideSpeaker 错误:&setOverrideError]; 这个对我有用。
【讨论】:
以上是关于如何在 iPhone 应用程序中录制和播放声音?的主要内容,如果未能解决你的问题,请参考以下文章
在模拟器中录制和播放声音效果很好,但在我的 iPhone 中却不行