Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Avplayer创建了2次_Ios_Swift_Avplayer - Fatal编程技术网

Ios Avplayer创建了2次

Ios Avplayer创建了2次,ios,swift,avplayer,Ios,Swift,Avplayer,我有一个创建AVPlayer的详细控制器,当我启动播放器时,然后我退出控制器,输入有关歌曲的数据未保存,当我单击play AVPlayer时,再次创建AVPlayer。问题是如何让AVPlayer保存所有数据,而不必删除旧播放器。请解决下面的问题 这是我的代码: ViewControllerAudioInfo是我获取歌曲数据的控制器 func request(){ let urlData = "https:---.com/local/apps/apple/library_detai

我有一个创建AVPlayer的详细控制器,当我启动播放器时,然后我退出控制器,输入有关歌曲的数据未保存,当我单击play AVPlayer时,再次创建AVPlayer。问题是如何让AVPlayer保存所有数据,而不必删除旧播放器。请解决下面的问题

这是我的代码:

ViewControllerAudioInfo是我获取歌曲数据的控制器

 func request(){

    let urlData = "https:---.com/local/apps/apple/library_detail.php/?idLibrary=\(detail!.id!)"


    var urlRequest = URLRequest(url: URL(string: urlData)!)
    urlRequest.timeoutInterval = 300



    let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in

        if error != nil{
            print(error ?? 0)
            return
        }

        DispatchQueue.main.async {

            let json = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String: Any]


            if let posts = json["FILE"] as? [AnyObject] {
                for post in posts {
                    var info = Modal()

                    info.AudioName = post["NAME"] as? String
                    info.UrlName = post["SRC"] as? String
                    info.ImageViewAudio = self.detail?.ImageView
                    info.AudioName = info.AudioName?.replacingOccurrences(of:".mp3", with: "")

                    self.mod.append(info)


                }
            }
        }

    }
    self.preloadEnd()
    task.resume()
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

     if segue.identifier == "audioDetail" {
        let destinationVC = segue.destination as! ViewControllerAudioDetail
        destinationVC.mod = mod
    }

    if segue.identifier == "list" {
        let destinationVC = segue.destination as! TableViewControllerAudioList
        destinationVC.mod = mod
    }
}
和详细控制器

import UIKit  
import AVFoundation

class ViewControllerAudioDetail: UIViewController {


static var avPlayer:AVPlayer?
var status = false
var timeSlider = false
fileprivate let seekDuration: Float64 = 10
fileprivate let seekDurationThirty: Float64 = 30
var sliderEndTime:Any!
var sliderDurationTime:Any!


var mod = [Modal]()

@IBOutlet weak var menuButton: UIBarButtonItem!


@IBOutlet weak var ImageView: UIImageView!

@IBOutlet weak var startTime: UILabel!
@IBOutlet weak var endTime: UILabel!
@IBOutlet weak var sliderSong: UISlider!
@IBOutlet weak var name: UILabel!

@IBOutlet weak var Volume: UISlider!
@IBOutlet weak var iconChange: UIButton!


override func viewDidLoad() {
    super.viewDidLoad()


    //кнопка назад
    let backItem = UIBarButtonItem()
    backItem.title = ""
    navigationItem.backBarButtonItem = backItem

    menu()


    sliderSong.minimumValue = 0
    sliderSong.maximumValue = 1
    sliderSong.setThumbImage(UIImage(named: "thumb.png"), for: .normal)



    name.sizeToFit()
    name.text = mod[thisSong].AudioName
    ImageView.image = mod[0].ImageViewAudio

    player(urlSong:mod[thisSong].UrlName!)

    self.timeSlider = true
    self.status = true
    Status()


    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        let _ = try AVAudioSession.sharedInstance().setActive(true)
    } catch let error as NSError {
        print("an error occurred when audio session category.\n \(error)")
    }


}

func menu(){

    if revealViewController() != nil {

        menuButton.target = revealViewController()
        menuButton.action = #selector(SWRevealViewController.rightRevealToggle(_:))

        view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())


    }

}


@IBAction func sliderSong(_ sender: UISlider) {

        //перемотка аудиозвука
        let duration = CMTimeGetSeconds(ViewControllerAudioDetail.avPlayer!.currentItem!.asset.duration)
        let value = sliderSong.value
        let durationToSeek = Float(duration) * value

        ViewControllerAudioDetail.avPlayer?.seek(to: CMTimeMakeWithSeconds(Float64(durationToSeek),ViewControllerAudioDetail.avPlayer!.currentItem!.duration.timescale)) { [](state) in


            if (self.iconChange.currentImage?.isEqual(UIImage(named: "Play.png")))! {
                ViewControllerAudioDetail.avPlayer?.pause()
            } else if (self.iconChange.currentImage?.isEqual(UIImage(named: "Pause.png")))!{
                ViewControllerAudioDetail.avPlayer?.play()
            }
        }
}


@IBAction func volume(_ sender: UISlider) {

    ViewControllerAudioDetail.avPlayer?.volume = sender.value
}



@IBAction func minusThirtySec(_ sender: Any) {

    let playerCurrentTime = CMTimeGetSeconds((ViewControllerAudioDetail.avPlayer?.currentTime())!)
    var newTime = playerCurrentTime - seekDurationThirty

    if newTime < 0 {
        newTime = 0
    }
    let time2: CMTime = CMTimeMake(Int64(newTime * 1000 as Float64), 1000)
    ViewControllerAudioDetail.avPlayer?.seek(to: time2, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)


}
@IBAction func minusTenSec(_ sender: Any) {

    let playerCurrentTime = CMTimeGetSeconds((ViewControllerAudioDetail.avPlayer?.currentTime())!)
    var newTime = playerCurrentTime - seekDuration

    if newTime < 0 {
        newTime = 0
    }
    let time2: CMTime = CMTimeMake(Int64(newTime * 1000 as Float64), 1000)
    ViewControllerAudioDetail.avPlayer?.seek(to: time2, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)

}

@IBAction func plusTenSec(_ sender: Any) {

    guard let duration = ViewControllerAudioDetail.avPlayer?.currentItem?.duration else{
        return
    }
    let playerCurrentTime = CMTimeGetSeconds((ViewControllerAudioDetail.avPlayer?.currentTime())!)
    let newTime = playerCurrentTime + seekDuration

    if newTime < (CMTimeGetSeconds(duration) - seekDuration) {

        let time2: CMTime = CMTimeMake(Int64(newTime * 1000 as Float64), 1000)
        ViewControllerAudioDetail.avPlayer?.seek(to: time2, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)

    }

}
@IBAction func plusThirtySec(_ sender: Any) {

    guard let duration = ViewControllerAudioDetail.avPlayer?.currentItem?.duration else{
        return
    }
    let playerCurrentTime = CMTimeGetSeconds((ViewControllerAudioDetail.avPlayer?.currentTime())!)
    let newTime = playerCurrentTime + seekDurationThirty

    if newTime < (CMTimeGetSeconds(duration) - seekDuration) {

        let time2: CMTime = CMTimeMake(Int64(newTime * 1000 as Float64), 1000)
        ViewControllerAudioDetail.avPlayer?.seek(to: time2, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)

    }

}

@IBAction func Next(_ sender: Any) {

    ViewControllerAudioDetail.avPlayer?.removeTimeObserver(sliderEndTime)
    ViewControllerAudioDetail.avPlayer?.removeTimeObserver(sliderDurationTime)



    if thisSong == mod.count - 1 {
        thisSong = 0
    } else {
        thisSong += 1
    }


    if thisSong != mod.count{

        name.text = mod[thisSong].AudioName
        player(urlSong:mod[thisSong].UrlName!)

        Status()

    }

}
@IBAction func Back(_ sender: Any) {

    ViewControllerAudioDetail.avPlayer?.removeTimeObserver(sliderEndTime)
    ViewControllerAudioDetail.avPlayer?.removeTimeObserver(sliderDurationTime)



    if thisSong != 0 {
        thisSong -= 1
    } else {
        thisSong = mod.endIndex - 1
    }


        name.text = mod[thisSong].AudioName
        player(urlSong:mod[thisSong].UrlName!)

       Status()




}


func Status(){

    timeSlider = false

    if status == true {
        iconChange.setImage(UIImage(named:"Pause.png"), for: .normal)
        ViewControllerAudioDetail.avPlayer?.play()
    } else {
        iconChange.setImage(UIImage(named:"Play.png"), for: .normal)
        ViewControllerAudioDetail.avPlayer?.pause()
    }

}


@IBAction func Play(_ sender: Any) {


    if ViewControllerAudioDetail.avPlayer?.rate == 0 && status == false{
        status = true
        ViewControllerAudioDetail.avPlayer?.play()
        ViewControllerAudioDetail.avPlayer?.rate = 1.0
        iconChange.setImage(UIImage(named:"Pause.png"), for: .normal)


        if timeSlider == false {

        sliderDurationTime = ViewControllerAudioDetail.avPlayer?.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: nil, using: {
                (CMTime) -> Void in

                self.updateProgressBar()
            })

        }


    } else {

        status = false
        ViewControllerAudioDetail.avPlayer?.rate = 0.0
        ViewControllerAudioDetail.avPlayer?.pause()
        iconChange.setImage(UIImage(named:"Play.png"), for: .normal)

    }

}




func player(urlSong:String) {

    let url = URL(string: urlSong)
    let playerItem = AVPlayerItem(url: url!)
    ViewControllerAudioDetail.avPlayer = AVPlayer(playerItem:playerItem)

    NotificationCenter.default.addObserver(self, selector:#selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem)

    sliderDurationTime = ViewControllerAudioDetail.avPlayer?.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: nil, using: {
        (CMTime) -> Void in

        self.updateProgressBar()
    })

     sliderEndTime = ViewControllerAudioDetail.avPlayer!.addPeriodicTimeObserver(forInterval: CMTime(seconds: 1, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: DispatchQueue.main) { [weak self] (time) in

        let duration = CMTimeGetSeconds((ViewControllerAudioDetail.avPlayer!.currentItem!.asset.duration))
        self?.sliderSong.value = Float(CMTimeGetSeconds(time)) / Float(duration)

    }


    let duration = CMTimeGetSeconds(ViewControllerAudioDetail.avPlayer!.currentItem!.asset.duration)
    let minutesTextOut = Int(duration) / 60 % 60
    let secondsTextOut = Int(duration) % 60
    let strDuration = String(format:"%02d:%02d", minutesTextOut, secondsTextOut)
    endTime.text = strDuration



}

func playerDidFinishPlaying(note: NSNotification) {

    ViewControllerAudioDetail.avPlayer?.removeTimeObserver(sliderDurationTime)
    ViewControllerAudioDetail.avPlayer?.removeTimeObserver(sliderEndTime)
    NotificationCenter.default.removeObserver(self)


    if thisSong == mod.count - 1 {
        thisSong = 0
    } else {
        thisSong += 1
    }


    if thisSong != mod.count{

        name.text = mod[thisSong].AudioName
        player(urlSong:mod[thisSong].UrlName!)

        Status()

    }




}


func updateProgressBar(){
    let timeNow = Int(ViewControllerAudioDetail.avPlayer!.currentTime().value) / Int(ViewControllerAudioDetail.avPlayer!.currentTime().timescale)

    let minutesText = timeNow / 60
    let secondsText = timeNow % 60

    let duration = String(format:"%02d:%02d", minutesText, secondsText)
    startTime.text = duration

}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toList" {
        let vc = segue.destination as! TableViewControllerAudioList
        vc.mod = mod
    }
}
导入UIKit
进口AVF基金会
类ViewControllerAudioDetail:UIViewController{
静态变量avPlayer:avPlayer?
var状态=错误
var timeSlider=false
fileprivate let seekDuration:Float64=10
fileprivate let seekDurationHirty:Float64=30
var sliderEndTime:任何!
var sliderDurationTime:任何!
var mod=[Modal]()
@IBVar menuButton:UIBarButtonItem!
@IBVAR ImageView:UIImageView!
@IBVAR启动时间:UILabel!
@IBVAR弱var结束时间:UILabel!
@iBliderSong:UISlider!
@IBVAR名称:UILabel!
@IBOutlet弱var卷:UISlider!
@IBOutlet弱var图标更改:UIButton!
重写func viewDidLoad(){
super.viewDidLoad()
//кнопка назад
let backItem=UIBarButtonItem()
backItem.title=“”
navigationItem.BackbarButtonim=backItem
菜单()
sliderSong.minimumValue=0
sliderSong.maximumValue=1
sliderSong.setThumbImage(UIImage(名为:“thumb.png”),用于:。正常)
name.sizeToFit()
name.text=mod[thisSong].AudioName
ImageView.image=mod[0]。ImageViewAudio
播放器(urlSong:mod[thisSong].UrlName!)
self.timeSlider=true
self.status=true
状态()
做{
尝试AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
让我们试试AVAudioSession.sharedInstance().setActive(true)
}将let错误捕获为NSError{
打印(“音频会话分类时出错。\n\(错误)”)
}
}
func菜单(){
如果revealViewController()!=nil{
menuButton.target=Revalviewcontroller()
menuButton.action=#选择器(swrevelaviewcontroller.righrevelavealtogle(35;:)
view.AddGestureRecognitizer(self.RevelveViewController().PangestureRecognitizer())
}
}
@iAction func sliderSong(uu发送方:UISlider){
//перемотка аудиозвука

让持续时间=CMTimeGetSeconds(ViewControllerAudioDetail.avPlayer!.currentItem!.asset.duration) let value=sliderSong.value 让durationToSeek=浮动(持续时间)*值
ViewControllerAudioDetail.avPlayer?.seek(到:CMTimeMakeWithSeconds(Float64(durationToSeek),ViewControllerAudioDetail.avPlayer!.currentItem!.duration.timescale)){[](状态)在 if(self.iconChange.currentImage?.isEqual(UIImage(名为:“Play.png”)){
ViewControllerAudioDetail.avPlayer?.pause() }else if(self.iconChange.currentImage?.isEqual(UIImage(名为:“Pause.png”)){
ViewControllerAudioDetail.avPlayer?.play() } } } @iAction func卷(\发送方:UISlider){
ViewControllerAudioDetail.avPlayer?.volume=sender.value } @iAction func减数三十秒(uu发送方:任意){
让playerCurrentTime=CMTimeGetSeconds((ViewControllerAudioDetail.avPlayer?.currentTime())!) var newTime=playerCurrentTime-seekDurationHirty 如果newTime<0{ newTime=0 } 让time2:CMTime=CMTimeMake(Int64(newTime*1000作为Float64),1000)
ViewControllerAudioDetail.avPlayer?.seek(到:时间2,之前的公差:kCMTimeZero,之后的公差:kCMTimeZero) } @iAction func minutensec(uu发送方:任何){
让playerCurrentTime=CMTimeGetSeconds((ViewControllerAudioDetail.avPlayer?.currentTime())!) var newTime=playerCurrentTime-seekDuration 如果newTime<0{ newTime=0 } 让time2:CMTime=CMTimeMake(Int64(newTime*1000作为Float64),1000)
ViewControllerAudioDetail.avPlayer?.seek(到:时间2,之前的公差:kCMTimeZero,之后的公差:kCMTimeZero) } @IBAction func plusTenSec(\发送方:任何){
guard let duration=ViewControllerAudioDetail.avPlayer?.currentItem?.duration else{ 返回 }
让playerCurrentTime=CMTimeGetSeconds((ViewControllerAudioDetail.avPlayer?.currentTime())!) 让newTime=playerCurrentTime+seekDuration 如果newTime<(CMTimeGetSeconds(持续时间)-请参阅持续时间){ 让time2:CMTime=CMTimeMake(Int64(newTime*1000作为Float64),1000)
ViewControllerAudioDetail.avPlayer?.seek(到:时间2,之前的公差:kCMTimeZero,之后的公差:kCMTimeZero) } } @iAction func plusThirtySec(uu发送方:任意){
guard let duration=ViewControllerAudioDetail.avPlayer?.currentItem?.duration else{ 返回 }
让playerCurrentTime=CMTimeGetSeconds((ViewControllerAudioDetail.avPlayer?.currentTime())!) 让newTime=playerCurrentTime+seekDurationHirty 如果newTime<(CMTimeGetSeconds(持续时间)-请参阅持续时间){ 让time2:CMTime=CMTimeMake(Int64(newTime*1000作为Float64),1000)
ViewControllerAudioDetail.avPlayer?.seek(到:时间2,之前的公差:kCMTimeZero,之后的公差:kCMTimeZero) } } @iAction func Next(\发送方:任意){
ViewControllerAudioDetail.avPlayer?.removeTimeObserver(sliderEndTime)
ViewControllerAudioDetail.avPlayer?.removeTimeObserver(sliderDurationTime) 如果thisSong==mod.count-1{ 这首歌=0 }否则{ 这首歌+=1 } 如果这首歌!=mod.count{ name.text=mod[thisSong].AudioName 播放器(urlSong:mod[thisSong].UrlName!) 状态() } } @IBAction func Back(\发送方:任意){
ViewControllerAudioDetail.avPlayer?.removeTimeObserver(sliderEndTime)
ViewControllerAudioDetail.avPlayer?.removeTimeObserver(sliderDurationTime) 如果这首歌!=0{ 这首歌-=1 }否则{ thisSong=mod.endIndex-1 } name.text=mod[thisSong].AudioName 播放器(urlSong:mod[th
static var avPlayer:AVPlayer?
        if  avPlayer != nil {
         if ((avPlayer.rate != 0) && (avPlayer.error == nil)) {
             // No need to initialise player again....
         } else {
             // initialise the code here...
             avPlayer = AVPlayer(playerItem:playerItem)
             avPlayer.play()
             avPlayer.actionAtItemEnd = .advance
             avPlayer.addObserver(self, forKeyPath: "currentItem", options: [.new, .initial] , context: nil)
        }
    }