端口扬声器(类型:扬声器)的未知选定数据源?

时间:2018-10-03 11:40:16

标签: swift xcode audio

我多次在cat日志中收到此消息:

[avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Speaker (type: Speaker)

我正在使用此代码播放背景音乐:

  let path = Bundle.main.path(forResource: fileName, ofType:"mp3")!
        let url = URL(fileURLWithPath: path)

        do {
                let sound = try AVAudioPlayer(contentsOf: url)
                self.player = sound
                sound.prepareToPlay()
                sound.volume = 0.05
                sound.numberOfLoops = loops
                sound.play()
        } catch {
            print("[PLAY SOUND][DELEGATE] error loading file -> \(fileName)")
        }

我进行了研究,发现了类似的问题,因此我在viewdidload中添加了音频类别:

  do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, mode: AVAudioSessionModeDefault)
            try AVAudioSession.sharedInstance().setActive(true)
        } catch {
            print(error)
        }

添加以上代码后,即使手机处于静音模式,背景音乐仍在播放!并且Unknown selected data source for Port Speaker (type: Speaker)的调试器消息仍在显示

2 个答案:

答案 0 :(得分:20)

消息Unknown selected data source for Port Speaker似乎是iOS 12的问题。显然,即使代码正在工作,也会出现一些警告。也许Apple会很快解决此问题,所以也许现在您可以忽略此警告,一旦他们找到解决方案,您就可以使其静音。

来源: AVAudioSession errors in iOS 12

至于在静音模式下播放背景音乐,这是因为您选择了AVAudioSessionCategory。根据{{​​1}}文档(source):

  

使用此类别时,您的应用音频会继续将“静音”开关设置为“无声”或屏幕锁定。

取决于您应用的样式,也许您可​​以使用AVAudioSessionCategoryPlaybacksource):

  

您可以通过屏幕锁定和静音开关(在iPhone上称为“铃声/静音”开关)使音频静音。

或者也许是AVAudioSessionCategorySoloAmbientsource):

  

此类别也适用于“伴奏”风格的应用程序,例如用户在播放“音乐”应用程序时演奏的虚拟钢琴。使用此类别时,其他应用程序的音频会与您的音频混合在一起。屏幕锁定和静音开关(在iPhone上称为“铃声/静音”开关)使音频静音。

答案 1 :(得分:3)

从Swift 4.2开始,我最初是这样设置的:

try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [])

我实际上并不需要录制功能,所以我将其更改为

try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])

这消除了错误(这是我唯一可以解决的错误)。但是,如果您还需要记录功能,显然这将无法工作。