繁体   English   中英

AVQueuePlayer 不在后台播放

[英]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.

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