在 Swift 中将 AVAudioPlayer 输出更改为扬声器?

Posted

技术标签:

【中文标题】在 Swift 中将 AVAudioPlayer 输出更改为扬声器?【英文标题】:Change AVAudioPlayer output to speaker in Swift? 【发布时间】:2015-02-20 14:03:37 【问题描述】:

我的 iphone 应用中有简单的 AVAudioPlayer,它可以工作,但输出应该是手机扬声器而不是耳机。我在这里找到了similiar topic,但不知道如何将其“翻译”为 swift(AudiosessionSetProperty 让我感到困惑)?

var audioPlayer = AVAudioPlayer(data: fileData, error: &playbackError) 
//fileData is url to file

if let player = audioPlayer
    player.delegate = self

    if(player.prepareToPlay() && player.play())
         println("Started playing the recorded audio")
     else 
         println("Could not play the audio")
    

【问题讨论】:

【参考方案1】:

我可以理解这是多么令人困惑,因为我刚刚找到了答案。所以AudioSessionSetProperty 在 iOS 7 中被弃用了。

添加这个:

session.overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker, error: nil)

请务必先致电AVAudioSession.sharedInstance()

【讨论】:

对于 Swift 3-4 使用下面的代码:尝试 recordingSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)【参考方案2】:

在 Swift 3 或 4 中:

let audioSession = AVAudioSession.sharedInstance()

do 
    try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
 catch let error as NSError 
    print("audioSession error: \(error.localizedDescription)")

为避免OSStatus 错误-50(由cmets 中的user462990 提到),必须在设置会话类别后调用overrideOutputAudioPort(代码如下)。

do 
    try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
 catch let error as NSError 
    print("setCategory error: \(error.localizedDescription)")

【讨论】:

能否请您显示此代码集成到 Marko 的代码中?我在他的代码中看到了一个 AVAudioPlayer,在你的代码中看到了一个 AVAudioSession。这些如何联系在一起?我尝试将您的代码添加到我的项目中,但不断出现错误。 我正在使用此代码,但执行时出现错误“操作无法完成。(OSStatus 错误 -50。)”有什么想法吗? 以下是对我发现的内容的更多解释,以及在尝试对汽车音响或电话扬声器实施导航风格提示时(如果没有任何连接到手机)为我解决问题的方法。希望这对其他人有帮助ossh.com.au/design-and-technology/software-development/…【参考方案3】:

试试这些功能。它们的工作很迷人。

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 _ 
    

【讨论】:

您只需要在需要时调用 SetSessionPlayerOn()。 有没有办法从扬声器改为内置听筒。我正在处理音频通话,但默认情况下它在扬声器上,我无法更改。 您是否尝试过上述代码,将布尔值替换为负值? @Nij 是的,这会使扬声器关闭。我想要的是激活靠近前置摄像头的听筒。 注意:我正在使用 opentok 库进行视频/音频通话。 我还想在 Opentok 库上实现内置耳机以进行音频通话。谁能帮我解决这个问题。【参考方案4】:
  func SetEarSepeakerOn()
    
        do 
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
         catch _ 
        
        do 
            try AVAudioSession.sharedInstance().setActive(true)
         catch _ 
        
        do 
            try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.none)
         catch _ 
        
    

【讨论】:

【参考方案5】:

斯威夫特 5

    func setSessionPlayerOn() 
        do 
            try AVAudioSession.sharedInstance().setCategory(.playAndRecord)
         catch _ 
        
        do 
            try AVAudioSession.sharedInstance().setActive(true)
         catch _ 

        
        do 
            try AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
         catch _ 

        
    

【讨论】:

【参考方案6】:

您可以在会话设置期间将音频会话默认设置为内置扬声器而不是接收器。

        do 
            // 1) Configure your audio session category, options, and mode
            try session.setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeVoiceChat, options: [.defaultToSpeaker])
            // 2) Activate your audio session to enable your custom configuration
            try session.setActive(true)
         catch let error as NSError 
            print("Failed to set the audio session category and mode: \(error.localizedDescription)")
        

【讨论】:

以上是关于在 Swift 中将 AVAudioPlayer 输出更改为扬声器?的主要内容,如果未能解决你的问题,请参考以下文章

在其他 swift 文件中调用时,AVAudioPlayer 不会播放声音

Swift - AVAudioPlayer,声音播放不正确

Swift - AVAudioPlayer 不播放声音

有没有办法在指定时间在 Swift 上使用 AVAudioPlayer 播放音乐?

将 AirPlay 添加到 AVAudioPlayer (Swift)

如何在底部面板中存储当前音频信息(AVAudioPlayer,Swift)[重复]