Ios Avplayer创建了2次
我有一个创建AVPlayer的详细控制器,当我启动播放器时,然后我退出控制器,输入有关歌曲的数据未保存,当我单击play AVPlayer时,再次创建AVPlayer。问题是如何让AVPlayer保存所有数据,而不必删除旧播放器。请解决下面的问题 这是我的代码: ViewControllerAudioInfo是我获取歌曲数据的控制器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
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)
}
}