Wie erhalte ich die aktuelle Spielzeit und die Gesamtspielzeit in AVPlayer?


73

Ist es möglich, die Spielzeit und die Gesamtspielzeit in AVPlayer abzurufen? Wenn ja, wie kann ich das machen?

Antworten:


162

Sie können auf das aktuell gespielte Objekt zugreifen, indem Sie die folgenden currentItemEigenschaften verwenden:

AVPlayerItem *currentItem = yourAVPlayer.currentItem;

Dann können Sie leicht die angeforderten Zeitwerte erhalten

CMTime duration = currentItem.duration; //total time
CMTime currentTime = currentItem.currentTime; //playing time

15
Es gibt auch eine bequeme Methode CMTimeGetSeconds, um NSTimeInterval abzurufen: NSTimeInterval duration = CMTimeGetSeconds (currentItem.duration); NSTimeInterval currentTime = CMTimeGetSeconds (currentItem.currentTime);
Slamor

Ich musste call it in der Hauptwarteschlange einstellen, damit es den richtigen Wert zurückgibt (oder in welcher Warteschlange auch immer Ihr Avplayer läuft).
Pnar Sbi Wer

1
Wie kann man LABEL diese Eigenschaft geben?
Mr. Bond

Ich spiele Lied von URL. aber bei CMTime Dauer und CMTime currentTime bekomme ich 0. Was ist das Problem hier für 0 Wert? kennt jemand die lösung
Moxarth

NSTimeInterval duration3 = CMTimeGetSeconds (currentItem.duration); NSTimeInterval currentTime3 = CMTimeGetSeconds (currentItem.currentTime); NSLog (@ "% f und% f", Dauer3, aktuelle Zeit3); self.playbackSlider.value = currentTime3 / duration3;
Genevios

22
_audioPlayer = [self playerWithAudio:_audio];
_observer =
[_audioPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 2)
                                           queue:dispatch_get_main_queue()
                                      usingBlock:^(CMTime time)
                                      {
                                          _progress = CMTimeGetSeconds(time);
                                      }];

14

Swift 3

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

Sie können die Sekunden Ihrer aktuellen Zeit abrufen, indem Sie auf die secondsEigenschaft von zugreifen currentTime(). Dies gibt ein zurück Double, das die Sekunden in der Zeit darstellt. Mit diesem Wert können Sie dann eine lesbare Zeit erstellen, die Sie Ihrem Benutzer präsentieren möchten.

Fügen Sie zunächst eine Methode hinzu, um die Zeitvariablen zurückzugeben H:mm:ss, die Sie dem Benutzer anzeigen:

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)
}

Als Nächstes eine Methode, mit der die oben abgerufenen Werte in eine lesbare Zeichenfolge konvertiert werden:

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
}

Aktualisieren Sie nun die Benutzeroberfläche mit den vorherigen Berechnungen:

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)
    }
}

Gibt es eine Eigenschaft auf dem Player, die Millisekunden zurückgibt?
bibscy

12

Verwenden Sie dies mit Swift 4.2.

let currentPlayer = AVPlayer()
if let currentItem = currentPlayer.currentItem {
    let duration = currentItem.asset.duration
}
let currentTime = currentPlayer.currentTime()

Ich habe versucht, AVPlayer.currentTime () zu verwenden, aber kein Glück, Fehler beim Zugriff
KavyaKavita

currentPlayer.currentItem.currentTime () - Sie. werden. Holen Sie sich die richtige Zeit.
Dolly Vaish

Diese Antwort ist zu 100% richtig, aber wenn Sie den Player ohne Avasset initialisieren, müssen Sie Folgendes verwenden: * player? .currentItem? .duration . Es ist besser, einen Avasset zu verwenden
Lance Samaria

6

Swift 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)"

    })
}

5
     AVPlayerItem *currentItem = player.currentItem;
     NSTimeInterval currentTime = CMTimeGetSeconds(currentItem.currentTime);
     NSLog(@" Capturing Time :%f ",currentTime);

Ich spiele Lied von URL. aber bei CMTime Dauer und CMTime currentTime bekomme ich 0. Was ist das Problem hier für 0 Wert? kennt jemand die lösung
Moxarth

5

Schnell:

let currentItem = yourAVPlayer.currentItem

let duration = currentItem.asset.duration
var currentTime = currentItem.asset.currentTime

2

Swift 5: Timer.scheduledTimer scheint besser zu sein als addPeriodicTimeObserver, wenn Sie einen reibungslosen Fortschrittsbalken wünschen

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)")
            }
        }

Man muss wirklich sanfte Fortschrittsbalken von Punkt zu Punkt animieren - das ist nicht so einfach. Sie würden definitiv nie einen Trimer (aus irgendeinem Grund) mit 1/60 verwenden - verwenden Sie einfach CADisplayLink
Fattie

0

Swift 4.2:

let currentItem = yourAVPlayer.currentItem
let duration = currentItem.asset.duration
let currentTime = currentItem.currentTime()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.