Ios 如何准确地在AVAudioPlayer开始播放音频时获得通知?

Ios 如何准确地在AVAudioPlayer开始播放音频时获得通知?,ios,swift,avaudioplayer,Ios,Swift,Avaudioplayer,注:请仔细阅读标题(和问题),然后再将其标记为副本。问题是关于AVAudioPlayer而不是AVPlayer 因此根据AVAudioPlayer open func play()->Bool/*声音是异步播放的*/ 我需要在音频启动时向用户显示一个弹出窗口。这不是我们调用play()的时候 当玩家停止游戏而不是开始游戏时,会有一个代表调用: 我找不到任何方法来准确知道音频何时启动。有什么方法可以检查它吗?我面临同样的问题,我决定基于AVPlayer创建一个新类: import AVFound

注:请仔细阅读标题(和问题),然后再将其标记为副本。问题是关于
AVAudioPlayer
而不是
AVPlayer


因此根据
AVAudioPlayer

open func play()->Bool/*声音是异步播放的*/

我需要在音频启动时向用户显示一个弹出窗口。这不是我们调用
play()
的时候

当玩家停止游戏而不是开始游戏时,会有一个代表调用:


我找不到任何方法来准确知道音频何时启动。有什么方法可以检查它吗?

我面临同样的问题,我决定基于AVPlayer创建一个新类:

import AVFoundation
import UIKit

 class AudioManager {

    private init() {}

    public static let shared = AudioManager()

    var player: AVPlayer?
    var item: AVPlayerItem?
    var layer: AVPlayerLayer?
    var currentUrl: URL?

    var pauseTime: CMTime?
    var endOfTrackObserver: Any?

    func startPlayContentOf(url: URL?) {

        NotificationCenter.default.addObserver(self,
                                               selector: #selector(self.playerItemDidReachEnd(notification:)),
                                               name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
                                               object: self.player?.currentItem)

        guard let newAudioUrl = url else { return }
        let newAudioItem = AVPlayerItem(url: newAudioUrl)


        if let currentUrl = self.currentUrl, currentUrl == newAudioUrl {
            //same track
            if let playing = self.player?.isPlaying, playing == true  {
                self.pauseTime = self.player?.currentTime()
                self.pause()
            } else {
                self.player = AVPlayer(playerItem: newAudioItem)
                self.player?.volume = 3
                self.player?.seek(to: self.pauseTime ?? CMTime.zero)
                self.layer = AVPlayerLayer(player: self.player)
                self.layer?.frame = CGRect(x: 0, y: 0, width: 10, height: 10)
                self.layer?.backgroundColor = UIColor.clear.cgColor
                guard let layer = self.layer else { return }
                UIApplication.shared.keyWindow?.rootViewController?.view.layer.insertSublayer(layer, at: 0)
                self.play()
            }
        } else {
            //new track
            self.pauseTime = nil
            self.pause()
            self.player = AVPlayer(playerItem: newAudioItem)
            self.player?.volume = 3
            self.layer = AVPlayerLayer(player: self.player)
            self.layer?.frame = CGRect(x: 0, y: 0, width: 10, height: 10)
            self.layer?.backgroundColor = UIColor.clear.cgColor
            guard let layer = self.layer else { return }
            UIApplication.shared.keyWindow?.rootViewController?.view.layer.insertSublayer(layer, at: 0)
            self.play()
        }

        self.currentUrl = newAudioUrl
    }

    func playOrPause() {
        guard self.player != nil else { return }
        if self.player!.isPlaying {
            self.player!.pause()
        } else {
            self.player?.replaceCurrentItem(with: self.item)
            self.player!.play()
        }
    }

    func pause() {
        guard self.player != nil else { return }
        self.player!.pause()
    }

    func play() {
        guard self.player != nil else { return }
        self.player!.play()
    }

    @objc func playerItemDidReachEnd(notification: Notification) {
        self.pauseTime = nil
    }

}

if self.avPlayer?.currentItem?.status==AVPlayerItem.status.readyToPlay{if(self.player?.currentItem?.isPlaybackLikelyToKeepUp)==true{//您可以在这里管理它}@阿塔扎兹先生请仔细阅读标题。它不是AVPlayer,而是AVAudioPlayer。@Shu Khan
AVPlayer
AVAudioPlayer
是两个不相关的游戏classes@iur你可以尝试在属性上放置观察者,例如在
currentTime
@mag_zbc上,我也考虑过这一点属性<代码>重要。不要轮询此属性以确定播放何时完成,而是执行指定的委托方法。
因此我不确定是否可以使用它检查播放机是否开始播放。