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?

Voloda2
quelle

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
Bartosz Ciechanowski
quelle
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);
                                      }];
comonitos
quelle
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)
    }
}
Brandon A.
quelle
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()
Kemal Can Kaynak
quelle
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)"

    })
}
xuzepei
quelle
5
     AVPlayerItem *currentItem = player.currentItem;
     NSTimeInterval currentTime = CMTimeGetSeconds(currentItem.currentTime);
     NSLog(@" Capturing Time :%f ",currentTime);
Athul Raj
quelle
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
Unis Barakat
quelle
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)")
            }
        }
Thyselius
quelle
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()
Matthijs
quelle