如何在 iPhone 应用程序中录制和播放声音?

Posted

技术标签:

【中文标题】如何在 iPhone 应用程序中录制和播放声音?【英文标题】:How to record and play sound in iPhone app? 【发布时间】:2011-04-14 11:07:56 【问题描述】:

我尝试使用AVAudiosessionAVAudioPlayer分别录制和播放声音,但音量非常低。

我尝试将 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 上向后播放录制的声音

在模拟器中录制和播放声音效果很好,但在我的 iPhone 中却不行

如何在 iPhone 扬声器上强制播放音频?

使用 iPhone SDK 同时播放和录制声音?

完成的 iPhone 应用程序:添加一个新功能。录制系统声音,然后能够播放

播放录制文件时 iPhone 上的音量太低