使用AVAudioPlayer播放多个音频文件 [英] Playing multiple audio files using AVAudioPlayer

查看:187
本文介绍了使用AVAudioPlayer播放多个音频文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在主故事板上创建了3个UIButton.

I created the 3 UIButtons on the Main StoryBoard.

当我按下"Button1"或"Button2"时,每个播放音频文件(播放器1",播放器2".),并且在播放音频时,UIButton设置为selected.

When I press "Button1" or "Button2" each plays an audio file ( "player 1" , "player 2".) and while the audio is playing the UIButton is set to selected.

我希望"Button3"连续实现多个功能. 这意味着当我按下按钮3"时,应该先播放玩家3",然后再播放玩家1"之后,再播放玩家2".

I would like "Button3" to implement multiple functions in a row. That means when I press "Button 3", "player 3" should be played first, after that "player 1" and after that "player 2".

但是,当我按下"Button3"时,播放器1"和播放器2"会同时播放,因为前一个播放器没有延迟.

However, when I press "Button3", "player 1" and "player 2" are played at same time as there is no delay for the previous to finish.

我发现设置AVAudioPlayer的委托或使用AVQueuePlayer可以解决问题,但是我发现很难进行更改.

I found out setting the delegate of the AVAudioPlayer or using AVQueuePlayer would solve the problem, but I find it difficult to make changes.

    fileprivate var player1:AVAudioPlayer?
    fileprivate var player2:AVAudioPlayer?
    fileprivate var player3:AVAudioPlayer?


    @IBAction func pushButton1(sender: UIButton) {
        audioPlayer1(url: url1)
    }

    @IBAction func pushButton2(sender: UIButton) {
        audioPlayer2(url: url2)
    }

    @IBAction func pushButton3(_ sender: UIButton) {
        audioPlayer3(url: url1, url2: url2, url3: url3)
    }


    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        if (player === player1) {
            yourButton1.isSelected = false
        } else if (player === player2) {
            yourButton2.isSelected = false
        } else if (player === player3) {

            //"player 1" and "player 2" are played at same time

            yourButton3.isSelected = false
            player1!.play()
            yourButton1.isSelected = true
            player2!.play()
            yourButton2.isSelected = false
        }
    }


    func audioPlayer1(url: URL) {
        do {
            try player1 = AVAudioPlayer(contentsOf:url)
            player1!.play()
            yourButton1.isSelected = true
            player1!.delegate = self
        } catch {
            print(error)
        }
    }

    func audioPlayer2(url: URL) {
        do {
            try player2 = AVAudioPlayer(contentsOf:url)
            player2!.play()
            yourButton2.isSelected = true
            player2!.delegate = self

        } catch {
            print(error)
        }
    }

    func audioPlayer3(url: URL, url2: URL, url3: URL) {
        do {
            try player3 = AVAudioPlayer(contentsOf:url3)
            try player1 = AVAudioPlayer(contentsOf: url1)
            try player2 = AVAudioPlayer(contentsOf: url2)
            player3!.play()
            yourButton3.isSelected = true
            player3!.delegate = self
            player1!.delegate = self
        } catch {
            print(error)
        }
    }
}

更改代码

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


    override func viewDidLoad() {
        super.viewDidLoad()
        player1?.delegate = self
        player2?.delegate = self
        player3?.delegate = self

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

        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 pushButton3(_ sender: UIButton) {
        //audioPlayer3(url: url1, url2: url2)
        sender.isSelected = true
        queue.play()
    }
 func playerItemDidReachEnd(notification: NSNotification) {

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

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

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

        if notification.object as? AVPlayerItem == items[3] {
            yourButton4.isSelected = false
            print("item 3")
        }

推荐答案

这是 AVAudioPlayer

所以基本上:

1::仅添加一个播放器,删除其余的播放器.

1: Add only one player, remove the rest of the players.

2: 创建 NSMutableArray与您要播放的对象.

2: Create an NSMutableArray with your objects that you want to play.

3 :根据所按下的按钮,您可以重新排列NSMutableArray对象以根据需要设置正确的顺序. (如果要简化,只需重新创建数组即可)并开始播放数组中的firstObject(URL),从而将其相应地添加到播放器中.

3: Depending on what button gets pressed, you can re-arrange the NSMutableArray objects to set the correct order as you wish. (Simply recreate the array if you want to make it easy) And start playing the firstObject (url) in the array adding it accordingly to your player.

4::播放器播放完毕后,您可以开始播放下一个对象,方法与上述相同,从NSMutableArray将其添加到播放器中.

4: When the player finished playing, you can start playing the next object adding it to your player from the NSMutableArray the same way as done above.

执行上述步骤将避免让多个玩家同时玩,以及其他好处(例如避免同时加载多个URL等)

Following above steps will avoid having multiple players playing simultaniously, together with other benefits (like avoid loading multiple URLs at the same time etc)

您可能需要一些变量来检查currentPlayingObject以确定下一个对象,也许是int,并检查是否没有尝试从数组中加载新项目(如果它是最后播放的项目),避免在访问不存在的objectAtIndex时崩溃.

You may need some variable to check the currentPlayingObject to determine which one is next, maybe an int, and check that you don't try to load a new item from the array if it is the last item playing, to avoid crash on accessing objectAtIndex that does not exist.

这篇关于使用AVAudioPlayer播放多个音频文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆