2016-02-14 2 views
1

Как я могу получить AvPlayer для работы как AvAudioPlayer. Я имею в виду, что, похоже, я не могу долго работать. Вот то, что мне нужно, чтобы преобразовать в AVPlayer:Как получить AvPlayer Продолжительность - Swift

import UIKit 
import AVKit 
import AVFoundation 


class ModalViewController: UIViewController { 

    var audioPlayer = AVAudioPlayer() 
    let varSend = VarSend.sharedInstance 
    var timer:NSTimer! 
    var toggleState = 2 


    @IBOutlet weak var slider: UISlider! 
    @IBOutlet weak var sermonImage: UIImageView! 
    @IBOutlet weak var sermont: UILabel! 
    @IBOutlet weak var sermond: UILabel! 
    @IBOutlet weak var sermonE: UILabel! 
    @IBOutlet weak var sermonL: UILabel! 
    @IBOutlet weak var play: UIButton! 
    @IBOutlet var layer: UIView! 


    override func viewDidLoad() { 

     super.viewDidLoad() 
     let url = varSend.url 
     print("Setting up.") 



     do { 
      let data1 = NSData(contentsOfURL: NSURL(string:url)!) 
      audioPlayer = try AVAudioPlayer(data: data1!) 
      audioPlayer.prepareToPlay() 
      audioPlayer.volume = 1.0 
      audioPlayer.play() 
     } catch { 
      print("Error getting the audio file") 
     } 



     slider.maximumValue = Float(audioPlayer.duration) 
     timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("updateSlider"), userInfo: nil, repeats: true) 
     slider.setThumbImage(UIImage(named: "circle"), forState: .Normal) 
     slider.setThumbImage(UIImage(named: "circle"), forState: .Highlighted) 


     let title = varSend.sermonName 
     self.sermont.text = title 

     let date = varSend.sermonDate 
     self.sermond.text = date 

     let image = varSend.sermonPic 

     ImageLoader.sharedLoader.imageForUrl(image, completionHandler:{(image: UIImage?, url: String) in 
      self.sermonImage.image = image! 
     }) 
    } 

    @IBAction func ChangeAudioTime(sender: AnyObject) { 
     audioPlayer.stop() 
     audioPlayer.currentTime = NSTimeInterval(slider.value) 
     audioPlayer.prepareToPlay() 
     audioPlayer.volume = 1.0 
     audioPlayer.play() 

    } 



    func updateSlider() { 
     slider.value = Float(audioPlayer.currentTime) 
     let currentTime = Int(audioPlayer.currentTime) 
     let minutes = currentTime/60 
     let seconds = currentTime - minutes * 60 
     let con = Int(audioPlayer.duration) 
     let currentItem = con - currentTime 
     let minutesU = Int(currentItem/60) 
     let secondsU = Int(currentItem % 60) 
     sermonE.text = NSString(format: "%02d:%02d", minutes,seconds) as String 
     let timeLeft = NSString(format: "%02d:%02d", minutesU,secondsU) as String 
     sermonL.text = "-\(timeLeft)" 

     if currentItem == 1 { 
      //audioPlayer.pause() 
      toggleState = 1 
      print(toggleState) 
      play.setImage(UIImage(named:"play.png"),forState:UIControlState.Normal) 
     } 
    } 


    @IBAction func playPauseButton(sender: AnyObject) { 
     let playBtn = sender as! UIButton 
     if toggleState == 1 { 
      audioPlayer.play() 
      toggleState = 2 
      playBtn.setImage(UIImage(named:"pause.png"),forState:UIControlState.Normal) 

     } else { 
      audioPlayer.pause() 
      toggleState = 1 
      playBtn.setImage(UIImage(named:"play.png"),forState:UIControlState.Normal) 
     } 
    } 


    @IBAction func play(sender: AnyObject) { 
     audioPlayer.play() 
    } 

    @IBAction func pause(sender: AnyObject) { 
     audioPlayer.pause() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    @IBAction func close(sender: AnyObject) { 
     self.dismissViewControllerAnimated(true, completion: nil) 
     audioPlayer.stop() 
    } 

} 

А вот то, что я уже пробовал:

import UIKit 
import Alamofire 
import SwiftyJSON 
import AVKit 
import AVFoundation 
import CoreMedia 

class test: UIViewController { 
    var audioPlayer:AVPlayer! 
    var playerItem:AVPlayerItem! 

    var timer:NSTimer! 

    @IBOutlet weak var sermonE: UILabel! 
    @IBOutlet weak var sermonL: UILabel! 
    @IBOutlet weak var slider: UISlider! 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     //let playerItem:AVPlayerItem!; 
     let playerURL = "example.com" 
     let steamingURL:NSURL = NSURL(string:playerURL)! 
     audioPlayer = AVPlayer(URL: steamingURL) 


     timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("updateSlider"), userInfo: nil, repeats: true) 






    } 

    func updateSlider() { 
     let item = audioPlayer?.currentItem 

      let durationInSeconds = CMTimeGetSeconds(item!.duration) 
     print(durationInSeconds) 

    } 

    @IBAction func ChangeAudioTime(sender: AnyObject) { 

    } 

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




    @IBAction func Play(sender: AnyObject) { 
     audioPlayer.play() 
    } 

} 

Я искал в течение нескольких дней и документы от Apple очень трудно разобрать , Я даже попытался

self.player.currentItem.asset.duration

от: How to get Duration from AVPlayer (Not AVAudioPlayer)?

Любая помощь будет оценена.

+0

Вы играете видео из потока HTTP Live? – Xcoder

+0

Да. Это MP3 – Barrett

+0

Какое значение вы получаете на время? Существует вероятность, что, когда вы запрашиваете продолжительность с AVPlayerItem, что он еще не загружен. Если это так, вы можете попробовать сначала создать AVAsset и использовать func loadValuesAsynchronouslyForKeys (keys: [String], обработчик завершенияHandler: (() -> Void)?), Где keys = ["duration"]. Затем в вашем обработчике завершения вы можете быть уверены, что продолжительность была загружена и готова к использованию. – Jonathan

ответ

0

Swift 2,0

loadedTimeRanges Массив содержит объекты, содержащие NSValue значение CMTimeRange с указанием времени диапазоны, для которых элемент игрок имеет мультимедийные данные легко доступны. Возвращаемые интервалы времени могут быть прерывистыми.

Таким образом, я вызываю myplayer.getCurrentTrackDuration каждые 1 секунду и замечаю, что при потоковой передаче я получил правильную конечную продолжительность через 3-4 секунды.

extension AVPlayer { 
//run this every 1 second of streaming (or use KVO) 
//In Http stream the duration it going to increase and probably finallize near to 7% of the total duration of the song 
func getCurrentTrackDuration() -> Float64 { 
    guard let currentItem = self.currentItem else { return 0.0 } 
    guard currentItem.loadedTimeRanges.count > 0 else { return 0.0 } 

    let timeInSecond = CMTimeGetSeconds((currentItem.loadedTimeRanges[0].CMTimeRangeValue).duration); 

    return timeInSecond >= 0.0 ? timeInSecond : 0.0 
} 
} 
Смежные вопросы