使用AVAudioPlayer播放多个音频文件

丽贝卡87

我在主StoryBoard上创建了3个UIButton。

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

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

但是,当我按“ Button3”时,“播放器1”和“播放器2”同时播放,因为前一个播放没有延迟。

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

我创建图像以使其更易于理解

    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:仅添加一个播放器,删除其余的播放器。

2: 使用您要播放的对象创建一个 NSMutableArray

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何同时播放多个音频文件

来自分类Dev

依次播放多个音频文件

来自分类Dev

使用Swift播放随机音频文件

来自分类Dev

如何使用javascript随机播放音频标签中的多个音频文件?

来自分类Dev

AVAudioPlayer 使用数组来排队音频文件 - Swift

来自分类Dev

如何遍历多个音频文件并使用javascript依次播放它们?

来自分类Dev

仅使用Media Payer的一个实例在android中播放多个音频文件

来自分类Dev

使用 XMLHttpRequest 加载多个音频文件并附加在 Web Audio API 中播放

来自分类Dev

组件以同时播放多个音频文件(单击)Aframe webVR

来自分类Dev

JS-防止同时播放多个音频文件

来自分类Dev

播放/暂停/停止本地存储的多个音频文件

来自分类Dev

AVAudioPlayer通过三个不同的按钮播放/暂停/停止本地音频文件

来自分类Dev

Swift AVAudioPlayer (Xcode) - 在应用程序包外播放音频文件

来自分类Dev

AVAudioPlayer支持音频文件格式吗?

来自分类Dev

使用AVAudioPlayer播放音频

来自分类Dev

AVAudioPlayer无法播放使用ExtAudioFileWriteAsync写入的音频(.wav)文件

来自分类Dev

使用AVAudioEngine反复播放音频文件

来自分类Dev

使用VBA Excel播放任何音频文件

来自分类Dev

如何使用Matlab在特定间隔播放音频文件?

来自分类Dev

在函数中使用音频文件时无法播放

来自分类Dev

使用ffplay播放音频文件列表

来自分类Dev

安排音频文件以备将来使用AVAudioTime播放

来自分类Dev

如何使用Matlab在特定间隔播放音频文件?

来自分类Dev

使用FFPlay静默播放和停止音频文件

来自分类Dev

ffmpeg使用Android将多个音频文件合并为单个音频文件

来自分类Dev

Javascript音频-页面上的多个播放按钮带有单独的音频文件

来自分类Dev

如何链接多个HTML5音频文件(如平滑播放列表)的播放?

来自分类Dev

在Python中播放远程音频文件?

来自分类Dev

星号,如何播放音频文件

Related 相关文章

  1. 1

    如何同时播放多个音频文件

  2. 2

    依次播放多个音频文件

  3. 3

    使用Swift播放随机音频文件

  4. 4

    如何使用javascript随机播放音频标签中的多个音频文件?

  5. 5

    AVAudioPlayer 使用数组来排队音频文件 - Swift

  6. 6

    如何遍历多个音频文件并使用javascript依次播放它们?

  7. 7

    仅使用Media Payer的一个实例在android中播放多个音频文件

  8. 8

    使用 XMLHttpRequest 加载多个音频文件并附加在 Web Audio API 中播放

  9. 9

    组件以同时播放多个音频文件(单击)Aframe webVR

  10. 10

    JS-防止同时播放多个音频文件

  11. 11

    播放/暂停/停止本地存储的多个音频文件

  12. 12

    AVAudioPlayer通过三个不同的按钮播放/暂停/停止本地音频文件

  13. 13

    Swift AVAudioPlayer (Xcode) - 在应用程序包外播放音频文件

  14. 14

    AVAudioPlayer支持音频文件格式吗?

  15. 15

    使用AVAudioPlayer播放音频

  16. 16

    AVAudioPlayer无法播放使用ExtAudioFileWriteAsync写入的音频(.wav)文件

  17. 17

    使用AVAudioEngine反复播放音频文件

  18. 18

    使用VBA Excel播放任何音频文件

  19. 19

    如何使用Matlab在特定间隔播放音频文件?

  20. 20

    在函数中使用音频文件时无法播放

  21. 21

    使用ffplay播放音频文件列表

  22. 22

    安排音频文件以备将来使用AVAudioTime播放

  23. 23

    如何使用Matlab在特定间隔播放音频文件?

  24. 24

    使用FFPlay静默播放和停止音频文件

  25. 25

    ffmpeg使用Android将多个音频文件合并为单个音频文件

  26. 26

    Javascript音频-页面上的多个播放按钮带有单独的音频文件

  27. 27

    如何链接多个HTML5音频文件(如平滑播放列表)的播放?

  28. 28

    在Python中播放远程音频文件?

  29. 29

    星号,如何播放音频文件

热门标签

归档