【问题标题】:How to record and play sound in iPhone app?如何在 iPhone 应用程序中录制和播放声音?
【发布时间】:2023-11-10 21:38:01
【问题描述】:

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

我尝试将 AVAudioPlayer 的音量值设置为 1.0 或更高,但没有太大帮助。

我还有哪些其他选择可以录制足够响亮的声音以进行播放?

【问题讨论】:

  • 您使用的是内置麦克风,还是标准耳塞电源线上的麦克风?声音的来源离麦克风有多近?如果您记录 -peakPowerForChannel,您会看到什么样的值?
  • @NSResponder:我使用的是内置麦克风。你能解释一下如何记录 -peakPowerForChannel 吗?

标签: iphone ios4 avaudioplayer avaudiorecorder


【解决方案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]; 这个对我有用。

      【讨论】:

        最近更新 更多