【问题标题】:How to get AVAudioPlayer output to the speaker如何将 AVAudioPlayer 输出到扬声器
【发布时间】:2010-11-04 14:41:07
【问题描述】:

我正在使用 AVAudioRecorder 录制音频,如 How do I record audio on iPhone with AVAudioRecorder? 所示

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

TIA!

【问题讨论】:

    标签: iphone objective-c audio avaudioplayer avaudiorecorder


    【解决方案1】:

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

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

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

    在 Obj-C 中 -

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];
    

    【讨论】:

    • 为我工作。谢谢。
    【解决方案2】:

    来自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);
    

    【讨论】:

    • 对遇到此答案的其他人的说明:示例代码中的前两行无关紧要 - 而且,如果您像 OP(也正在录制音频),这些行将阻止录音无法正常运行。
    • 这对我进行了一次调整:我将 sessionCategory 更改为 kAudioSessionCategory_PlayAndRecord。
    • 我已经多次看到这个解决方案,但我只是不知道在哪里放置那段代码。有人可以告诉我吗?
    • AudioSessionSetProperty 在 iOS7 中已弃用。现在怎么办?
    • 在 iOS7 中你可以做 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
    【解决方案3】:

    斯威夫特 3

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

    AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
    

    在播放之前我设置了:

    AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
    

    目标 C

    录制前:

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

    播放前:

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

    【讨论】:

    • 仅在适合您的用户案例的情况下更改类别。对AVAudioSessionCategoryAmbient ,苹果说“声音播放是非主要的应用程序的类别——也就是说,你的应用程序可以在关闭声音的情况下成功使用。这个类别也适用于“一起玩”风格的应用程序,例如用户在播放音乐应用时弹奏的虚拟钢琴。当您使用此类别时,来自其他应用的音频会与您的音频混合。您的音频会通过屏幕锁定和静音开关静音。
    • 奇怪的是,这是唯一对我有用的。虽然我正在构建一个歌曲录制应用程序,所以我宁愿不使用 Ambient,但其他答案都不起作用。这是唯一一个强制使用设备扬声器而不是电话(小扬声器)。音量仍然比我想要的低。
    【解决方案4】:

    这在 Swift2 中非常适合我

    let session = AVAudioSession.sharedInstance()
    try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker)
    

    【讨论】:

      【解决方案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】:

        Swift2:

        try session.setCategory(AVAudioSessionCategoryPlayAndRecord,
            withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker)
        

        【讨论】:

          【解决方案7】:

          斯威夫特 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.")
          }
          

          查看Developer Documentation 了解更多关于AVAudioSession.CategoryOptions的信息。

          【讨论】:

            【解决方案8】:

            斯威夫特 3

             let audioSession = AVAudioSession.sharedInstance()
            
                do {
                    try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
                } catch let error as NSError {
                    print("Audio Session error: \(error.localizedDescription)")
                }
            

            【讨论】:

              【解决方案9】:

              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 _ {
                  }
              }
              

              【讨论】:

                【解决方案10】:

                这是在扬声器中而不是在麦克风中输出 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.")
                    }
                }
                

                【讨论】:

                  【解决方案11】:

                  Swift 5:要同时使用蓝牙设备和默认扬声器,请使用:

                  let recordingSession = AVAudioSession.sharedInstance()
                  try recordingSession.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetooth])
                  

                  【讨论】:

                    猜你喜欢
                    • 2023-04-02
                    • 1970-01-01
                    • 2011-02-09
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-12-09
                    相关资源
                    最近更新 更多