【问题标题】:Play swift sound based on each duration of I time in array根据数组中 I 时间的每个持续时间播放快速声音
【发布时间】:2020-12-09 04:05:25
【问题描述】:

我希望我的快速代码调用 playSound 并根据数组 playamount 中每个项目的持续时间播放声音。所以我希望用户第一次播放声音 10 秒,然后从头开始播放声音 20 秒,然后同样的声音 30 秒。所以每次调用时,声音总是从头开始。

import UIKit;  import AVFoundation

class ViewController: UIViewController {
    
  

    var player: AVAudioPlayer?

    func playSound() {
        let url = Bundle.mainBundle().URLForResource("rock", withExtension: "mp3")!

        do {
            player = try AVAudioPlayer(contentsOfURL: url)
            guard let player = player else { return }

            player.prepareToPlay()
            player.play()

        } catch let error as NSError {
            print(error.description)
        }
    }
    var playAmount : [Int] = [10,20,30]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}

【问题讨论】:

    标签: arrays swift loops audio duration


    【解决方案1】:
    class ViewController: UIViewController {
    
        var player: AVAudioPlayer?
        var currentIndex: Int = 0
    
        func runMusicBox() {
            guard !playAmount.isEmpty else { return }
            currentIndex = 0
            newTimerForIndex(index: 0)
        }
        
        func newTimerForIndex(index: Int) {
            player?.prepareToPlay()
            player?.play()
            Timer.scheduledTimer(withTimeInterval: Double(playAmount[index]), repeats: false) { timer in
                self.player?.stop()
                if self.currentIndex + 1 < self.playAmount.count {
                    self.currentIndex += 1
                    self.newTimerForIndex(index: self.currentIndex)
                } else {
                    self.player?.stop()
                }
            }
        }
        
        func playSound() {
            let url = Bundle.mainBundle().URLForResource("rock", withExtension: "mp3")!
    
            do {
                player = try AVAudioPlayer(contentsOfURL: url)
                guard let player = player else { return }
                runMusicBox()
    
            } catch let error as NSError {
                print(error.description)
            }
        }
        var playAmount : [Int] = [10,20,30]
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
        }
    
    
    }
    

    你好,你能试试这个代码吗?这里我有一个计时器,当一个计时器停止时,我们检查数组中是否还有另一个元素,然后运行一个新的计时器。计时器正在工作,但我没有检查播放器。如果它按预期工作 - 它应该适合你

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多