Как получить текущее игровое время и общее игровое время в AVPlayer?

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


person Voloda2    schedule 18.11.2011    source источник


Ответы (9)


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

AVPlayerItem *currentItem = yourAVPlayer.currentItem;

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

CMTime duration = currentItem.duration; //total time
CMTime currentTime = currentItem.currentTime; //playing time
person Bartosz Ciechanowski    schedule 21.11.2011
comment
также есть удобный метод CMTimeGetSeconds для получения NSTimeInterval: NSTimeInterval duration = CMTimeGetSeconds(currentItem.duration); NSTimeInterval currentTime = CMTimeGetSeconds (currentItem.currentTime); - person slamor; 12.01.2015
comment
мне пришлось установить вызов в основной очереди, чтобы он возвращал правильное значение (или любую очередь, в которой работает ваш avplayer). - person Pnar Sbi Wer; 17.04.2015
comment
как передать это свойство LABEL? - person Mr. Bond; 21.03.2016
comment
я играю песню с URL. но при продолжительности CMTime и текущем времени CMTime я получаю 0. в чем проблема здесь для значения 0? кто-нибудь знает решение? - person Moxarth; 19.09.2017
comment
Продолжительность NSTimeInterval3 = CMTimeGetSeconds (currentItem.duration); NSTimeInterval currentTime3 = CMTimeGetSeconds (currentItem.currentTime); NSLog(@%f и %f,duration3,currentTime3); self.playbackSlider.value = текущее время3/длительность3; - person Genevios; 03.04.2018

Свифт 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)
    }
}
person Brandon A    schedule 03.05.2017
comment
есть ли у игрока свойство, которое возвращает миллисекунды? - person bibscy; 04.12.2018

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

let currentPlayer = AVPlayer()
if let currentItem = currentPlayer.currentItem {
    let duration = currentItem.asset.duration
}
let currentTime = currentPlayer.currentTime()
person Kemal Can Kaynak    schedule 14.01.2016
comment
Я пытался использовать AVPlayer.currentTime() , но не повезло, получая ошибку неправильного доступа - person KavyaKavita; 24.04.2017
comment
currentPlayer.currentItem.currentTime() — вы. будет. получить правильное время. - person Dolly Vaish; 30.04.2019
comment
этот ответ на 100% правильный, но если вы инициализируете плеер без ассета, вы должны использовать: *player?.currentItem?.duration. Лучше использовать ассет - person Lance Samaria; 25.10.2020
comment
Может ли кто-нибудь привести полный пример того, как использовать это в SwiftUI, пожалуйста? - person Aiyush; 26.06.2021
comment
@Aiyush, вам нужно использовать VideoPlayer для SwiftUI. - person Kemal Can Kaynak; 27.06.2021
comment
@KemalCanKaynak Я борюсь с этим. Как я могу получить текущее время с помощью VideoPlayer, т.е. если текущее время в видео составляет 10 секунд, тогда напечатайте (Hello) или покажите какой-нибудь текст и т. д. Я был бы очень признателен за это :) - person Aiyush; 27.06.2021

Свифт 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)"

    })
}
person xuzepei    schedule 26.10.2018

Быстрый:

let currentItem = yourAVPlayer.currentItem

let duration = currentItem.asset.duration
var currentTime = currentItem.asset.currentTime
person Unis Barakat    schedule 09.09.2015

Swift 5: Timer.scheduledTimer кажется лучше, чем addPeriodicTimeObserver, если вы хотите иметь плавный индикатор выполнения

static public var currenTime = 0.0
static public var currenTimeString = "00:00"

        Timer.scheduledTimer(withTimeInterval: 1/60, repeats: true) { timer in

            if self.player!.currentItem?.status == .readyToPlay {

                let timeElapsed = CMTimeGetSeconds(self.player!.currentTime())
                let secs = Int(timeElapsed)
                self.currenTime = timeElapsed
                self.currenTimeString = NSString(format: "%02d:%02d", secs/60, secs%60) as String


                print("AudioPlayer TIME UPDATE: \(self.currenTime)    \(self.currenTimeString)")
            }
        }
person Thyselius    schedule 12.11.2019
comment
действительно, вам нужно анимировать плавные индикаторы выполнения от точки к точке - это не так просто. вы определенно никогда не будете использовать тример (по какой-либо причине) с 1/60 - просто используйте CADisplayLink - person Fattie; 26.02.2020

Свифт 4.2:

let currentItem = yourAVPlayer.currentItem
let duration = currentItem.asset.duration
let currentTime = currentItem.currentTime()
person Matthijs    schedule 17.10.2018

в свифт 5+

Вы можете запросить проигрыватель напрямую, чтобы узнать текущее время активного воспроизведения AVPlayerItem. Время хранится в структуре CMTime для простоты преобразования в различные масштабы, такие как 10-е секунды, 100-е секунды и т. д. В большинстве случаев нам нужно представлять время в секундах, поэтому следующее покажет вам, что вы хотите

let currentTimeInSecs = CMTimeGetSeconds(player.currentTime())
person Umar Cheema    schedule 23.06.2021
comment
добавлено :) надеюсь, что это поможет - person Umar Cheema; 25.06.2021
comment
Не могли бы вы добавить пример того, как это полностью реализовать в SwiftUI? Это было бы очень признательно! :) - person Aiyush; 26.06.2021
comment
Это выходит за рамки вышеуказанного вопроса, но вот руководство по спускам, которое может оказаться полезным: letsbuildthatapp.com /course_video?id=282 - person Umar Cheema; 28.06.2021

person    schedule
comment
я играю песню с URL. но при продолжительности CMTime и текущем времени CMTime я получаю 0. в чем проблема здесь для значения 0? кто-нибудь знает решение? - person Moxarth; 19.09.2017