sta*_*264 3 avaudioplayer ios swift ios-multithreading dispatch-queue
我正在尝试使用 Swift 5 中的 AVAudioPlayer 实例从后台线程播放声音。大多数时候,它会成功。但有时音频播放器无法播放声音。
\n\n看起来好像连续调用 play() 两次,或者调用prepareToPlay() 然后连续调用 play() 以某种方式解决了问题,但这对我来说似乎不是一个好的解决方案,因为我担心这仍然不能解决问题不保证一定能播放成功。
\n\nfunc setUpAudio() {\n AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)\n try! AVAudioSession.sharedInstance().setActive(true)\n NotificationCenter.default.addObserver(self, selector: #selector(handleInterruption), name: AVAudioSession.interruptionNotification, object: nil)\n}\n\nfunc startNewAudio() {\n let destinationData = Destinations.getDestinations()\n var audio = destinationData[currentStop]!["audio"] as! String\n if inTransit {\n audio = destinationData[Paths.tourOrder[currentIndex + 1]]!["transit_audio"] as! String\n }\n let sound = NSURL(fileURLWithPath: Bundle.main.path(forResource: audio, ofType: "mp3", inDirectory: "audio")!)\n try! audioPlayer = AVAudioPlayer(contentsOf: sound as URL)\n audioPlayer.delegate = self\n currentTime = 0\n setPlay()\n}\n\nfunc setPlay() {\n paused = false\n pauseButton.setImage(UIImage(named: "pause"), for: .normal)\n pauseButton.isEnabled = true\n audioPlayer.currentTime = currentTime\n DispatchQueue.global(qos: .background).async {\n self.audioPlayer.play()\n print(self.audioPlayer.isPlaying) // returns false sometimes\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我按以下顺序调用这些方法:
\n\nsetUpAudio()\nstartNewAudio()\nsetPlay()\nRun Code Online (Sandbox Code Playgroud)\n\n我无法弄清楚问题\xe2\x80\x94我真的只想调用 play() 一次,让一切正常工作。
\n没有理由说play在后台线程上;播放声音不会阻塞主线程。此外,没有理由假设 AVAudioPlayer 是线程安全的。而且您的代码当然不是线程安全的,因为您是从不同的线程同时与音频播放器对话。所以你\xe2\x80\x99错误地使用了线程。\xe2\x80\x99s 没有必要讨论错误的行为结果。拿掉你的后台线程并尝试你的代码以正确的方式做事。如果还有问题我们可以讨论。
| 归档时间: |
|
| 查看次数: |
3960 次 |
| 最近记录: |