[英]AVQueuePlayer not playing in background
我已经尝试过在后台播放音乐的标准方式,下面是我在播放声音之前一直在使用和粘贴的代码,在 AppDelegate、ViewDidLoad 中,但没有。 请帮忙。 我还为音频启用了背景模式。
这是我一直在使用并在我的应用程序的不同部分进行尝试的代码。
do {
try AVAudioSession.sharedInstance().setCategory(.playback)
print("Playback OK")
try AVAudioSession.sharedInstance().setActive(true)
print("Session is Active")
} catch {
print(error)
}
这是我的代码示例(简化版)
import AVFoundation
import UIKit
class ViewController: UIViewController {
var myQueauPlayer: AVQueuePlayer?
var avItems: [AVPlayerItem] = []
var slider: Int?
var isActive: Bool = false
var dispatchAfter: DispatchTimeInterval?
//slider values --------------------------------------------------------------------------------------------------
@IBOutlet weak var textValue: UILabel!
@IBOutlet weak var sliderValue: UISlider!
@IBAction func sliderButton(_ sender: UISlider) {
var time = Int(sliderValue.value)
self.dispatchAfter = DispatchTimeInterval.seconds(time)
slider = Int(sender.value)
textValue.text = String(time) + " seconds between items to imagine"
}
override func viewDidLoad() {
super.viewDidLoad()
let mySongs: [String] = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40","41","42", "43", "44", "45", "46", "47", "48", "49", "50", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "100","101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "112", "113", "114", "115"]
for i in mySongs{
if let url = Bundle.main.url(forResource: i, withExtension: ".mp3"){
avItems.append(AVPlayerItem(url: url))
} else {print("Could not load \(i).mp3 clip")}
}
if avItems.count == 0 {
fatalError("Failed to get any songs")
}
}
@objc
func sliderDidChange(sliderSecond: UISlider) {
self.slider = Int(sliderSecond.value)
self.dispatchAfter = DispatchTimeInterval.seconds(Int(sliderSecond.value))
}
// function 通知它结束播放声音 ---------
@objc func playerDidFinishPlaying(sender: Notification) {
guard let player = myQueauPlayer, player.items().count > 0 else {
return
}
player.isMuted = true
player.pause()
var dispatchAfterSecond = DispatchTimeInterval.seconds(Int(self.sliderValue.value))
//var dispatchAfterSecond = DispatchTimeInterval.seconds(10)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + dispatchAfterSecond, execute: {
if self.isActive == true {
player.isMuted = false
player.play()
//self.isActive = false
}
})
}
//完成所有工作的函数------------------------
func playQueau() -> Void {
myQueauPlayer?.isMuted = true
if myQueauPlayer == nil{
myQueauPlayer = AVQueuePlayer()
}
guard let player = myQueauPlayer else {
// I suppose it's possible that AVQueuePlayer() failed to instantiate
// so print a message to debug console and return
print("AVQueuePlayer failed to instantiate!")
return
}
player.removeAllItems()
for item in avItems {
item.seek(to: .zero, completionHandler: nil)
}
avItems.forEach{player.insert($0, after: nil)}
avItems.shuffle()
myQueauPlayer?.isMuted = false
player.play()
}
//按钮部分---------------------------------------------- --------------------------
@IBOutlet weak var restartShuffleTapp: UIButton!
@IBAction func restartShuffledTapped(_ sender: Any) {
// isActive = true
if isActive == false {
restartShuffleTapp.setImage(UIImage(systemName: "pause.circle.fill"), for: .normal)
isActive = true
NotificationCenter.default.addObserver(self, selector: #selector(self.playerDidFinishPlaying(sender:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: myQueauPlayer)
playQueau()
} else if isActive == true {
restartShuffleTapp.setImage(UIImage(systemName: "play.circle.fill"), for: .normal)
isActive = false
guard let player = myQueauPlayer, player.items().count > 0 else {
return
}
player.pause()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.