Можно ли получить игровое время и общее игровое время в AVPlayer? Если да, то как я могу это сделать?
Как получить текущее игровое время и общее игровое время в AVPlayer?
Ответы (9)
Вы можете получить доступ к текущему воспроизводимому элементу, используя свойство currentItem
:
AVPlayerItem *currentItem = yourAVPlayer.currentItem;
Затем вы можете легко получить запрошенные значения времени
CMTime duration = currentItem.duration; //total time
CMTime currentTime = currentItem.currentTime; //playing time
Свифт 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)
}
}
В Swift 4.2 используйте это;
let currentPlayer = AVPlayer()
if let currentItem = currentPlayer.currentItem {
let duration = currentItem.asset.duration
}
let currentTime = currentPlayer.currentTime()
Свифт 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)"
})
}
Быстрый:
let currentItem = yourAVPlayer.currentItem
let duration = currentItem.asset.duration
var currentTime = currentItem.asset.currentTime
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)")
}
}
Свифт 4.2:
let currentItem = yourAVPlayer.currentItem
let duration = currentItem.asset.duration
let currentTime = currentItem.currentTime()
в свифт 5+
Вы можете запросить проигрыватель напрямую, чтобы узнать текущее время активного воспроизведения AVPlayerItem. Время хранится в структуре CMTime для простоты преобразования в различные масштабы, такие как 10-е секунды, 100-е секунды и т. д. В большинстве случаев нам нужно представлять время в секундах, поэтому следующее покажет вам, что вы хотите
let currentTimeInSecs = CMTimeGetSeconds(player.currentTime())