Ist es möglich, die Spielzeit und die Gesamtspielzeit in AVPlayer abzurufen? Wenn ja, wie kann ich das machen?
Antworten:
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
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 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)
}
}
Verwenden Sie dies mit Swift 4.2.
let currentPlayer = AVPlayer()
if let currentItem = currentPlayer.currentItem {
let duration = currentItem.asset.duration
}
let currentTime = currentPlayer.currentTime()
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)"
})
}
AVPlayerItem *currentItem = player.currentItem;
NSTimeInterval currentTime = CMTimeGetSeconds(currentItem.currentTime);
NSLog(@" Capturing Time :%f ",currentTime);
Schnell:
let currentItem = yourAVPlayer.currentItem
let duration = currentItem.asset.duration
var currentTime = currentItem.asset.currentTime
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)")
}
}