【问题标题】:Unknown selected data source for Port Speaker (type: Speaker)?端口扬声器(类型:扬声器)的未知选定数据源?
【发布时间】:2019-03-08 15:18:13
【问题描述】:

我在 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) 的调试器消息仍在显示

【问题讨论】:

  • 在设备处于静音或切换到静音状态时停止播放声音,将 AVAudioSessionCategoryPlayback 更改为 AVAudioSessionCategoryAmbient

标签: swift xcode audio


【解决方案1】:

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

来源: AVAudioSession errors in iOS 12

至于静音播放的背景音乐,是因为你选择了AVAudioSessionCategory。根据AVAudioSessionCategoryPlayback 文档(source):

使用此类别时,您的应用音频会在静音开关设置为静音或屏幕锁定时继续播放。

根据您应用的风格,也许您可​​以使用AVAudioSessionCategorySoloAmbient (source):

您的音频通过屏幕锁定和静音开关(在 iPhone 上称为响铃/静音开关)静音。

或者AVAudioSessionCategoryAmbient (source):

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

【讨论】:

  • 我试过这对我不起作用,但我也不想播放音乐。我收到此消息的唯一地方是 AdMod 尝试显示广告时,这意味着我收到了很多。如果以上是正确答案,则在所有情况下都应关闭此消息,因为所有其他提出此问题的尝试都被标记为重复并引用此答案。
  • @Sojourner9 对于我在 Apple Developer 论坛上读到的内容,这似乎是 iOS 12 特有的问题。由于该消息来自 iOS,因此尚未找到使其静音的方法。这就是为什么我提到苹果可能会很快解决这个问题。也许 AdMob 正在尝试播放声音或视频以触发此消息?你也在使用 iOS 12 吗?
【解决方案2】:

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

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

我其实不需要录音功能,所以我把它改成了

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

这消除了错误(并且是我唯一能消除错误的方法)。但是,如果您还需要录制功能,这显然行不通。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多