繁体   English   中英

Swift AVAudioPlayer 的播放状态始终为 true?

[英]Swift AVAudioPlayer's playing status always be true?

这是我的代码:

@objc func playSmusic1() {
        guard let url = Bundle.main.url(forResource: "Snote6", withExtension: "wav") else { return }
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.wav.rawValue)
            guard let player = player else { return }
            while (true) {
                player.play()
                player.enableRate = true;
                player.rate = playrate
                if !player.isPlaying {
                    break
                }
            }
        } catch let error {
            print(error.localizedDescription)
        }
    }

我发现 player.isPlaying 属性总是正确的,所以有时一个音调会播放 2 或 3 次。 如何修复这个错误? 非常感谢!

第一:不要使用while(true)进行检查,因为它会阻塞主线程

您应该添加 KVO 观察器以异步检查此属性,例如:

class YourController : UIViewController {
    var player: AVAudioPlayer?
    //...
    
    deinit {
        player?.removeObserver(self, forKeyPath: #keyPath(AVAudioPlayer.isPlaying))
    }

    func play() {
        //...
        player?.addObserver(self,
            forKeyPath: #keyPath(AVAudioPlayer.isPlaying),
            options: .new,
            context: nil)
        player?.play()
    }
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == #keyPath(AVAudioPlayer.isPlaying) {
            if let isPlaying = player?.isPlaying {
                print(isPlaying)
            }
        }
        else {
            self.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM