Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何逐个播放多个音频文件_Ios_Swift_Xcode - Fatal编程技术网

Ios 如何逐个播放多个音频文件

Ios 如何逐个播放多个音频文件,ios,swift,xcode,Ios,Swift,Xcode,我在主情节提要上创建了4个UIButton 我想用“Button4”来实现一行中的其他按钮功能。这意味着当我按下按钮4时,应该先播放播放器1,然后播放播放器2,然后播放播放器3 然而,当我按下“按钮4”时,“按钮2”和“按钮3”同时播放 fileprivate var player1:AVAudioPlayer? fileprivate var player2:AVAudioPlayer? fileprivate var player3:AVAud

我在主情节提要上创建了4个UIButton

我想用“Button4”来实现一行中的其他按钮功能。这意味着当我按下按钮4时,应该先播放播放器1,然后播放播放器2,然后播放播放器3

然而,当我按下“按钮4”时,“按钮2”和“按钮3”同时播放

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

        let url1 = Bundle.main.bundleURL.appendingPathComponent("music1.mp3")
        let url2 = Bundle.main.bundleURL.appendingPathComponent("music2.mp3")
        let url3 = Bundle.main.bundleURL.appendingPathComponent("music3.mp3")

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

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

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

 //"yourButton2" and "yourButton3" is played at same time in this code at player2

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

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

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

            } catch {
                print(error)
            }
        }

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

与其使用AVAudioPlayer,不如使用AVQueuePlayer

下面是一个简单的例子:

var files = ["file1", "file2", "file3"]

var player: AVQueuePlayer = {
    var pathArray = [String]()
    files.forEach { resource in
        if let path = Bundle.main.path(forResource: resource, ofType: "mp3") {
            pathArray.append(path)
        }
    }

    var urlArray = [URL]()
    pathArray.forEach { path in
        urlArray.append(URL(fileURLWithPath: path))
    }

    var playerItems = [AVPlayerItem]()
    urlArray.forEach { url in
        playerItems.append(AVPlayerItem(url: url))
    }

    let player = AVQueuePlayer(items: playerItems)
    player.actionAtItemEnd = AVPlayerActionAtItemEnd.advance

    return player
}()
在按钮的动作中:

@IBAction func buttonTapped(_ sender: UIButton) {
    files = ["file2", "file3", "file1"]
    player.play()
}
诚然,这是非常快速和肮脏的,但有点像这样,因为我们正在将文件数组传递给播放器。为这段代码找到更多优化应该不会太难


编辑:意识到我没有传递AVPlayerItems数组,所以进行了更新。

与其使用AVAudioPlayer,不如使用AVQueuePlayer

下面是一个简单的例子:

var files = ["file1", "file2", "file3"]

var player: AVQueuePlayer = {
    var pathArray = [String]()
    files.forEach { resource in
        if let path = Bundle.main.path(forResource: resource, ofType: "mp3") {
            pathArray.append(path)
        }
    }

    var urlArray = [URL]()
    pathArray.forEach { path in
        urlArray.append(URL(fileURLWithPath: path))
    }

    var playerItems = [AVPlayerItem]()
    urlArray.forEach { url in
        playerItems.append(AVPlayerItem(url: url))
    }

    let player = AVQueuePlayer(items: playerItems)
    player.actionAtItemEnd = AVPlayerActionAtItemEnd.advance

    return player
}()
在按钮的动作中:

@IBAction func buttonTapped(_ sender: UIButton) {
    files = ["file2", "file3", "file1"]
    player.play()
}
诚然,这是非常快速和肮脏的,但有点像这样,因为我们正在将文件数组传递给播放器。为这段代码找到更多优化应该不会太难

编辑:意识到我没有传入AVPlayerItems数组,所以进行了更新。

编辑

每一个按钮,1,2,3等…都会工作,但“按钮2”有点混合

无论如何,重新解释?

编辑

每一个按钮,1,2,3等…都会工作,但“按钮2”有点混合


无论如何,重新解释一下?

您将UIAudio与(UIAudio…)链接起来。编辑**重写…将UIAudio与(UIAudio…)链接。编辑**重写…没问题。如果你还有其他问题,请告诉我。没问题。如果你还有其他问题,请告诉我。