10

我已经在反馈助手中提交了关于此的反馈,但我想我也会在这里发布——从 iOS 13.4 开始,我注意到 MediaPlayer 框架中的各种错误,特别是 applicationQueuePlayer 和 applicationMusicPlayer。

第一个是在应用程序启动时初始化,它现在抛出这个错误:

[SDKPlayback] applicationQueuePlayer _establishConnectionIfNeeded timeout [ping did not pong]

当调用 prepareToPlay() 时,该错误之后是这个错误:

Error Domain=MPMusicPlayerControllerErrorDomain Code=6 "Failed to prepare to play" UserInfo={NSDebugDescription=Failed to prepare to play}

最终,在调用 prepareToPlay 足够的时间后,它会直接开始播放内容,但即便如此,我发现我必须多次调用 play() 或 pause() 才能可靠地执行此操作。

在 13.4 之后的应用程序中还有其他人看到这个吗?

4

2 回答 2

2

在我的情况下,我的播放器逻辑并不总是触发 player?.prepareToPlay() 代码。我确保 stop() 播放器,然后立即触发 prepareToPlay。然后我用 contentsOf: URL 准备播放器,并调整播放器设置,然后播放。由于发生了爆裂声,我还必须添加一些奇怪的音量调整。我将在下面发布我的播放器代码。

  static func play(sound: Sound) {
    
 
    stop()
    player?.prepareToPlay()

     let path = Bundle.main.path(forResource: sound.file, ofType: sound.extn)
        let url = URL(fileURLWithPath: path!)
    
    do {
        
        player = try AVAudioPlayer(contentsOf: url)
        player?.volume = 0 //starting volume at zero before playing eliminates pop on start
        player?.numberOfLoops = -1
        player?.play()
        player?.setVolume(1, fadeDuration: 0.3)  //fade in, no pop

    } catch {
      print(error)
    }
}
于 2020-09-09T16:02:42.770 回答
1

几天来,我一直在摸不着头脑,为什么我无法播放 Apple Music 目录或图书馆内容的商店标识符。事实证明,直接设置商店标识符MPMusicPlayerApplicationController将播放内容,而使用MPMusicPlayerStoreQueueDescriptor并将其传递给MPMusicPlayerApplicationController没有效果。

我仍然收到以下错误日志:

[SDKPlayback] applicationQueuePlayer _establishConnectionIfNeeded timeout [ping did not pong]

[core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)""

iTunesCloud] ACAccountStore 0x283e1bdb0 - Error retrieving iTunesStore accounts. err=Error Domain=com.apple.accounts Code=9 "(null)"

[iTunesCloud] [ICUserIdentityStore] Failed to fetch local store account with error: Error Domain=com.apple.accounts Code=9 "(null)".

......但已经过去了Error Domain=MPMusicPlayerControllerErrorDomain Code=6 "Failed to prepare to play" UserInfo={NSDebugDescription=Failed to prepare to play}

希望这可能对其他偶然发现此问题的人有用:)

这是一些代码,所以你明白我的意思:

class AMPlayer {

    private(set) var player: MPMusicPlayerController!
    // Every time `queue` is set, it'll ensure the player queue is "updated"
    private var queue: MPMusicPlayerStoreQueueDescriptor! {
        didSet {
            guard self.queue != nil,
                  let storeIDs = self.queue.storeIDs,
                  !storeIDs.isEmpty
            else { return }

            self.player.setQueue(with: storeIDs)
        }
    }
    
    // This is how I set the queue from outside the class
    public func setQueue(with resourceIDs: [String]) {
        self.queue = MPMusicPlayerStoreQueueDescriptor(storeIDs: resourceIDs)
    }

    // This is how I start playback
    public func play() {
        self.player.prepareToPlay { (error) in
            if let error = error as? MPError {
                print("Error while preparing to play: \(error)")
            } else {
                self.player.play()
            }
        }
    }

}

于 2020-07-29T18:06:11.807 回答