Как узнать текущее и общее время воспроизведения в AVPlayer? - PullRequest
66 голосов
/ 18 ноября 2011

Возможно ли получить время воспроизведения и общее время воспроизведения в AVPlayer?Если да, как я могу это сделать?

Ответы [ 8 ]

145 голосов
/ 21 ноября 2011

Вы можете получить доступ к воспроизводимому в данный момент элементу, используя свойство currentItem:

AVPlayerItem *currentItem = yourAVPlayer.currentItem;

Тогда вы можете легко получить запрошенные значения времени

CMTime duration = currentItem.duration; //total time
CMTime currentTime = currentItem.currentTime; //playing time
22 голосов
/ 08 июня 2014
_audioPlayer = [self playerWithAudio:_audio];
_observer =
[_audioPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 2)
                                           queue:dispatch_get_main_queue()
                                      usingBlock:^(CMTime time)
                                      {
                                          _progress = CMTimeGetSeconds(time);
                                      }];
11 голосов
/ 03 мая 2017

Swift 3

let currentTime:Double = player.currentItem.currentTime().seconds

Вы можете получить секунды вашего текущего времени, обратившись к свойству seconds currentTime().Это вернет Double, который представляет секунды во времени.Затем вы можете использовать это значение, чтобы создать удобочитаемое время для представления вашему пользователю.

Сначала включите метод, который возвращает временные переменные для H:mm:ss, которые вы будете отображать пользователю:

func getHoursMinutesSecondsFrom(seconds: Double) -> (hours: Int, minutes: Int, seconds: Int) {
    let secs = Int(seconds)
    let hours = secs / 3600
    let minutes = (secs % 3600) / 60
    let seconds = (secs % 3600) % 60
    return (hours, minutes, seconds)
}

Далее, метод, который преобразует значения, которые вы извлекли выше, в читаемую строку:

func formatTimeFor(seconds: Double) -> String {
    let result = getHoursMinutesSecondsFrom(seconds: seconds)
    let hoursString = "\(result.hours)"
    var minutesString = "\(result.minutes)"
    if minutesString.characters.count == 1 {
        minutesString = "0\(result.minutes)"
    }
    var secondsString = "\(result.seconds)"
    if secondsString.characters.count == 1 {
        secondsString = "0\(result.seconds)"
    }
    var time = "\(hoursString):"
    if result.hours >= 1 {
        time.append("\(minutesString):\(secondsString)")
    }
    else {
        time = "\(minutesString):\(secondsString)"
    }
    return time
}

Теперь обновите интерфейс с предыдущими вычислениями:

func updateTime() {
    // Access current item
    if let currentItem = player.currentItem {
        // Get the current time in seconds
        let playhead = currentItem.currentTime().seconds
        let duration = currentItem.duration.seconds
        // Format seconds for human readable string
        playheadLabel.text = formatTimeFor(seconds: playhead)
        durationLabel.text = formatTimeFor(seconds: duration)
    }
}
9 голосов
/ 14 января 2016

С Swift 4.2 используйте это;

let currentPlayer = AVPlayer()
if let currentItem = currentPlayer.currentItem {
    let duration = currentItem.asset.duration
}
let currentTime = currentPlayer.currentTime()
5 голосов
/ 06 июля 2015
     AVPlayerItem *currentItem = player.currentItem;
     NSTimeInterval currentTime = CMTimeGetSeconds(currentItem.currentTime);
     NSLog(@" Capturing Time :%f ",currentTime);
4 голосов
/ 09 сентября 2015

Свифт:

let currentItem = yourAVPlayer.currentItem

let duration = currentItem.asset.duration
var currentTime = currentItem.asset.currentTime
3 голосов
/ 26 октября 2018

Свифт 4

    self.playerItem = AVPlayerItem(url: videoUrl!)
    self.player = AVPlayer(playerItem: self.playerItem)

    self.player?.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: DispatchQueue.main, using: { (time) in
        if self.player!.currentItem?.status == .readyToPlay {
            let currentTime = CMTimeGetSeconds(self.player!.currentTime())

            let secs = Int(currentTime)
            self.timeLabel.text = NSString(format: "%02d:%02d", secs/60, secs%60) as String//"\(secs/60):\(secs%60)"

    })
}
0 голосов
/ 17 октября 2018

Swift 4.2:

let currentItem = yourAVPlayer.currentItem
let duration = currentItem.asset.duration
let currentTime = currentItem.currentTime()
...