33

我正在使用 AVAudioRecorder 录制音频,如如何使用 AVAudioRecorder 在 iPhone 上录制音频?

然后我使用 AVAudioPlayer 播放录音。然而,声音是从耳机发出的,而不是扬声器。我将如何将声音重定向到扬声器?

蒂亚!

4

11 回答 11

31

我意识到这个问题已经相当老了,但是当我在同一个问题上苦苦挣扎时,我找到了一个简单的解决方案,希望能帮助其他希望使用更大声的媒体扬声器而不是接收器扬声器的人。我使用的方法是使用 AVAudioSessionCategoryOptions 中的 DefaultToSpeaker 选项设置音频会话:

在 Swift 中(假设您的音频会话名为session) -

session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker, error: nil)

在 Obj-C 中 -

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];
于 2015-05-19T14:34:08.567 回答
18

来自http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/12890-audiosessionsetproperty-problem-playing-sound-listening-mic.html --

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);    
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
于 2009-07-07T04:07:01.683 回答
17

斯威夫特 3

在录制我设置的声音之前:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

在播放之前我设置:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

目标 C

录制前:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error:nil];

播放前:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
于 2014-06-17T01:16:43.257 回答
13

这在 Swift2 中非常适合我

let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker)
于 2015-12-24T17:19:37.480 回答
6

这是一个老问题,但另一个答案对我没有帮助......但是,我找到了一个解决方案,我将其发布以供将来参考,以防有人(或未来的我自己!)需要它。

该解决方案在以下博客文章中进行了描述:iOS:在插入耳机时将音频输出到扬声器

您需要在项目中创建新的 Objective-C 类 AudioRouter。然后导入AudioRouter.h到您要启动音频功能的类的头文件中。接下来,在相应的.m文件中,在方法中添加以下行viewDidLoad

AudioRouter *foobar = [[AudioRouter alloc] init];
[foobar initAudioSessionRouting];
[foobar forceOutputToBuiltInSpeakers];

现在你有音频(例如 AVAudioPlayer)输出到扬声器!请注意,如果您在应用程序运行时插入耳机则所有音频输出都将定向到耳机。

于 2013-11-19T01:41:20.120 回答
6

斯威夫特2:

try session.setCategory(AVAudioSessionCategoryPlayAndRecord,
    withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker)
于 2015-10-05T01:09:57.770 回答
3

斯威夫特 5

// Get the singleton instance.
let recordingSession = AVAudioSession.sharedInstance()
do {
    // Set the audio session category, mode, and options.
    try recordingSession.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker])
    try recordingSession.setActive(true)
} catch {
    print("Failed to set audio session category.")
}

查看开发人员文档以获取有关AVAudioSession.CategoryOptions的更多信息。

于 2020-03-11T05:04:06.730 回答
2

Swift 5:要在蓝牙设备和默认扬声器上工作,请使用:

let recordingSession = AVAudioSession.sharedInstance()
try recordingSession.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetooth])
于 2021-01-13T16:58:55.430 回答
1

斯威夫特 3

 let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
    } catch let error as NSError {
        print("Audio Session error: \(error.localizedDescription)")
    }
于 2017-04-03T16:21:40.170 回答
1

Swift 4.0 的答案

func SetSessionPlayerOn()
{
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
    } catch _ {
    }
    do {
        try AVAudioSession.sharedInstance().setActive(true)
    } catch _ {
    }
    do {
        try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
    } catch _ {
    }
}
func SetSessionPlayerOff()
{
    do {
        try AVAudioSession.sharedInstance().setActive(false)
    } catch _ {
    }
}
于 2018-03-01T19:08:16.267 回答
1

这是在扬声器中而不是在麦克风中输出 auido 的关键线。请注意,它应该在录制时设置

try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)

以下是设置录制的完整功能

private func setupRecorder() {

    if isAudioRecordingGranted {
        let session = AVAudioSession.sharedInstance()
        do {

            if #available(iOS 10.0, *) {
                try! session.setCategory(.playAndRecord, mode:.spokenAudio)
            }
            else {
                // Workaround until https://forums.swift.org/t/using-methods-marked-unavailable-in-swift-4-2/14949 isn't fixed
               session.perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)
            }
            try session.setActive(true)
            try session.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)

            let settings = [
                AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
                AVSampleRateKey: 44100,
                AVNumberOfChannelsKey: 2,
                AVEncoderAudioQualityKey:AVAudioQuality.high.rawValue
            ]
            audioRecorder = try AVAudioRecorder(url: fileUrl(), settings: settings)
            audioRecorder.delegate = self
            audioRecorder.isMeteringEnabled = true
            audioRecorder.prepareToRecord()
            self.recorderState = .Ready
        }
        catch let error {
            recorderState = .error(error)
        }
    }
    else {
        recorderState = .Failed("Don't have access to use your microphone.")
    }
}
于 2019-03-22T07:14:17.030 回答