ios - 从后台线程播放 AVAudioPlayer 实例有时会失败

标签 ios swift avaudioplayer dispatch-queue ios-multithreading

我正在尝试使用 Swift 5 中的 AVAudioPlayer 实例从后台线程播放声音。大多数情况下,它会成功。但有时音频播放器无法播放声音。

似乎调用 play() 两次,或者连续调用 prepareToPlay() 和 play() 以某种方式解决了问题,但这对我来说似乎不是一个好的解决方案,因为我担心这仍然不保证播放成功。

func setUpAudio() {
    AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)
    try! AVAudioSession.sharedInstance().setActive(true)
    NotificationCenter.default.addObserver(self, selector: #selector(handleInterruption), name: AVAudioSession.interruptionNotification, object: nil)
}

func startNewAudio() {
    let destinationData = Destinations.getDestinations()
    var audio = destinationData[currentStop]!["audio"] as! String
    if inTransit {
        audio = destinationData[Paths.tourOrder[currentIndex + 1]]!["transit_audio"] as! String
    }
    let sound = NSURL(fileURLWithPath: Bundle.main.path(forResource: audio, ofType: "mp3", inDirectory: "audio")!)
    try! audioPlayer = AVAudioPlayer(contentsOf: sound as URL)
    audioPlayer.delegate = self
    currentTime = 0
    setPlay()
}

func setPlay() {
    paused = false
    pauseButton.setImage(UIImage(named: "pause"), for: .normal)
    pauseButton.isEnabled = true
    audioPlayer.currentTime = currentTime
    DispatchQueue.global(qos: .background).async {
        self.audioPlayer.play()
        print(self.audioPlayer.isPlaying) // returns false sometimes
    }
}

我按以下顺序调用方法:

setUpAudio()
startNewAudio()
setPlay()

我想不出问题所在——我真的只想调用 play() 一次,然后一切正常。

最佳答案

没有理由在后台线程上说play;播放声音不会阻塞主线程。此外,没有理由认为 AVAudioPlayer 是线程安全的。而且您的代码肯定不是线程安全的,因为您是从不同的线程同时与音频播放器对话的。所以你错误地使用了线程。讨论错误行为的结果是没有意义的。拿走你的后台线程并尝试你的代码以正确的方式做事。如果仍有问题,我们可以讨论。

关于ios - 从后台线程播放 AVAudioPlayer 实例有时会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56402751/

相关文章:

swift - EXC_BAD_INSTRUCTION(代码=EXC_1386_INBOP,子代码=0x0

ios - 如何解决收藏 View 闪烁问题? ( swift )

ios - 从firebase数据库中检索数据到tableView中的类

ios - 我是否必须为 rootviewController 实现一个 View 来管理其他 Controller ,但自己不显示任何内容?

ios - 监视文件更改时打开太多文件

ios - Swift iOS - 如何分析给定的 MP3 文件以确定节拍的时间?

ios - 使用 AVAudioPlayer 从 URL 播放音频

ios - 有没有办法使用 AVAudioPlayerNode 从头开始​​重播声音?

ios - subview 在 collectionView 单元格中被复制?

ios - 访问空属性时 CoreData EXC_BAD_ACCESS (code=1, address=0x0)