Ist es möglich, die Spielzeit und die Gesamtspielzeit in AVPlayer abzurufen? Wenn ja, wie kann ich das machen?
73
Sie können auf das aktuell gespielte Objekt zugreifen, indem Sie die folgenden currentItem
Eigenschaften 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
_audioPlayer = [self playerWithAudio:_audio]; _observer = [_audioPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 2) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) { _progress = CMTimeGetSeconds(time); }];
quelle
Swift 3
let currentTime:Double = player.currentItem.currentTime().seconds
Sie können die Sekunden Ihrer aktuellen Zeit abrufen, indem Sie auf die
seconds
Eigenschaft von zugreifencurrentTime()
. Dies gibt ein zurückDouble
, 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) } }
quelle
Verwenden Sie dies mit Swift 4.2.
let currentPlayer = AVPlayer() if let currentItem = currentPlayer.currentItem { let duration = currentItem.asset.duration } let currentTime = currentPlayer.currentTime()
quelle
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)" }) }
quelle
AVPlayerItem *currentItem = player.currentItem; NSTimeInterval currentTime = CMTimeGetSeconds(currentItem.currentTime); NSLog(@" Capturing Time :%f ",currentTime);
quelle
Schnell:
let currentItem = yourAVPlayer.currentItem let duration = currentItem.asset.duration var currentTime = currentItem.asset.currentTime
quelle
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)") } }
quelle
Swift 4.2:
let currentItem = yourAVPlayer.currentItem let duration = currentItem.asset.duration let currentTime = currentItem.currentTime()
quelle