【问题标题】:AVQueuePlayer and AVAudioPlayer called at same timeAVQueuePlayer 和 AVAudioPlayer 同时调用
【发布时间】:2017-02-23 07:01:34
【问题描述】:

我有一个带有 3 个不同按钮的屏幕。当 Button1 被点击时,一个 AVQueuePlayer 被调用。点击 Button2 或 Button3 时,将调用 AVAudioPlayer。

当点击 Button1(启动 AVQueuePlayer)然后点击 Button2 或 Button3(启动 AVAudioPlayer)时会出现问题。结果是AVQueuePlayer当前正在播放的音频文件和AVAudioPlayer正在播放的音频文件同时播放。

我正在寻找一种方法来防止在 AVQueuePlayer 处于活动状态时点击 Button2 或 Button3,或者在用户点击 Button2 或 Button3 时让 AVQueuePlayer 停止播放。

我发现不是使用两个播放器,而是只使用一个播放器可以解决问题,但我不知道如何。

        var queue = AVQueuePlayer()
        var items = [AVPlayerItem]()

        override func viewDidLoad() {
        super.viewDidLoad()

        let asset1 = AVPlayerItem(url: url1)
        let asset2 = AVPlayerItem(url: url2)
        let asset3 = AVPlayerItem(url: url3)


        items = [asset1, asset2, asset3, asset4]

        queue = AVQueuePlayer(items: items)

    for item in queue.items() {
        NotificationCenter.default.addObserver(self, selector:#selector(playerItemDidReachEnd(notification:)),
           name: .AVPlayerItemDidPlayToEndTime, object: item)
    }
}

    @IBAction func pushButton1(_ sender: UIButton) {
        sender.isSelected = true
        queue.play()
    }

    @IBAction func pushButton2(sender: UIButton) {
        if self.lonelyPlayer == nil {

        }else {
            if (self.lonelyPlayer?.isPlaying)! {
                self.lonelyPlayer?.stop()
            }
        }
        audioPlayer(url: url1, buttonId: 1)    }

    @IBAction func pushButton3(sender: UIButton) {
        if self.lonelyPlayer == nil {

        }else {
            if (self.lonelyPlayer?.isPlaying)! {
                self.lonelyPlayer?.stop()
            }
        }
        audioPlayer(url: url2, buttonId: 2)
        }

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        if (self.currentPlayer == 1) {
            yourButton2.isSelected = false
        } else if (self.currentPlayer == 2) {
            yourButton3.isSelected = false
        } 
}

    func playerItemDidReachEnd(notification: NSNotification) {

        if notification.object as? AVPlayerItem == items[0] {
            yourButton1.isSelected = false
            yourButton2.isSelected = true
        }

        if notification.object as? AVPlayerItem == items[1] {
            yourButton2.isSelected = false
            yourButton3.isSelected = true
        }

    func audioPlayer(url: URL, buttonId: Int) {
        do {
            try lonelyPlayer = AVAudioPlayer(contentsOf:url)
            lonelyPlayer!.play()
            lonelyPlayer!.delegate = self
            yourButton2.isSelected = (buttonId == 1)
            yourButton3.isSelected = (buttonId == 2)
            currentPlayer = buttonId
        } catch {
            print(error)
        }
    }

【问题讨论】:

    标签: ios swift


    【解决方案1】:
    var queue = AVQueuePlayer()
    var items = [AVPlayerItem]()
    var currentlyPlaying = 0
    var isPlaying = false {
        didSet{
            checkButtons()
        }
    }
    
    @IBOutlet weak var button1 : UIButton? //connect to button 1
    @IBOutlet weak var button2 : UIButton? //connect to button 2
    @IBOutlet weak var button3 : UIButton? //connect to button 3
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let asset1 = AVPlayerItem(url: url1)
        let asset2 = AVPlayerItem(url: url2)
        let asset3 = AVPlayerItem(url: url3)
    
    
        items = [asset1, asset2, asset3, asset4]
    
        queue = AVQueuePlayer(items: items)
    
        for item in queue.items() {
            NotificationCenter.default.addObserver(self, selector:#selector(playerItemDidReachEnd(notification:)), name: .AVPlayerItemDidPlayToEndTime, object: item)
        }
    }
    
    @IBAction func pushButton1(_ sender: UIButton) {
        self.currentlyPlaying = 1
        self.isPlaying = true
        sender.isSelected = true
        queue.play()
    }
    
    @IBAction func pushButton2(sender: UIButton) {
        self.currentlyPlaying = 2
        self.isPlaying = true
        if self.lonelyPlayer == nil {
    
        }else {
            if (self.lonelyPlayer?.isPlaying)! {
                self.lonelyPlayer?.stop()
            }
        }
        audioPlayer(url: url1, buttonId: 1)    
    }
    
    @IBAction func pushButton3(sender: UIButton) {
        self.currentlyPlaying = 3
        self.isPlaying = true
        if self.lonelyPlayer == nil {
    
        }else {
            if (self.lonelyPlayer?.isPlaying)! {
                self.lonelyPlayer?.stop()
            }
        }
        audioPlayer(url: url2, buttonId: 2)
    }
    
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        if (self.currentPlayer == 1) {
            yourButton2.isSelected = false
        } else if (self.currentPlayer == 2) {
            yourButton3.isSelected = false
        } 
        self.isPlaying = false
    }
    
    func playerItemDidReachEnd(notification: NSNotification) {
    
        if notification.object as? AVPlayerItem == items[0] {
            yourButton1.isSelected = false
            yourButton2.isSelected = true
        }
    
        if notification.object as? AVPlayerItem == items[1] {
            yourButton2.isSelected = false
            yourButton3.isSelected = true
        }
        self.isPlaying = false
    )
    
    func audioPlayer(url: URL, buttonId: Int) {
        do {
            try lonelyPlayer = AVAudioPlayer(contentsOf:url)
            lonelyPlayer!.play()
            lonelyPlayer!.delegate = self
            yourButton2.isSelected = (buttonId == 1)
            yourButton3.isSelected = (buttonId == 2)
            currentPlayer = buttonId
        } catch {
            print(error)
        }
    }
    
    func checkButtons() {
        if isPlaying {
            switch currentlyPlaying {
            case 1:
                button2.isEnabled = false
                button3.isEnabled = false
            case 2:
                button1.isEnabled = false
                button3.isEnabled = false
            case 3:
                button1.isEnabled = false
                button2.isEnabled = false
            default:
                print("Something went wrong!")
            }
       } else {
            button1.isEnabled = true
            button2.isEnabled = true
            button3.isEnabled = true
       }
    }
    

    它在播放时禁用按钮。

    注意:这段代码没有经过测试,因为我是在公交车上写的

    编辑:您可以将queue 设置为可选项,然后使用queue.pausequeue = nil 停止它。再次使用前记得重新分配!

    【讨论】:

    • 我在音频播放器和 checkButton 的函数中收到很多错误:/
    • 嗯,我又实现了你的代码。它没有收到任何错误,但按钮 2 3 4 不播放任何音乐。
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多