Ответ 1
self.player.currentItem.asset.duration
Получил это!
Я хотел бы сделать UISlider (скруббер) для своего AVPlayer. Но поскольку это не AVAudioPlayer, он не имеет встроенной продолжительности. Любое предложение о том, как создать слайдер для быстрой перемотки вперед, перемотки назад и хода воспроизведения?
Я прочитал документ на AVPlayer, у него есть встроенное seekToTime или seekToTime: toleranceBefore: toleranceAfter:. Я этого не понимаю. Будет ли это ответом для моего слайдера? AVPlayer также имеет addPeriodicTimeObserverForInterval: queue: usingBlock:, это для получения продолжительности моего трека? Может ли кто-нибудь дать мне пример о том, как реализовать этот код? Я не являюсь поклонником документации Apple. Кажется очень трудно понять.
self.player.currentItem.asset.duration
Получил это!
заголовки
#import <AVFoundation/AVPlayer.h>
#import <AVFoundation/AVPlayerItem.h>
#import <AVFoundation/AVAsset.h>
код
CMTime duration = self.player.currentItem.asset.duration;
float seconds = CMTimeGetSeconds(duration);
NSLog(@"duration: %.2f", seconds);
рамки
AVFoundation
CoreMedia
Как и в iOS 4.3, вы можете использовать немного короче:
self.player.currentItem.duration;
Для быстрого получения продолжительности в секундах
let duration : CMTime = player.currentItem!.asset.duration
let seconds : Float64 = CMTimeGetSeconds(duration)
print(seconds)
Отмечается StitchedStreamPlayer
Вы должны использовать player.currentItem.duration
- (CMTime)playerItemDuration
{
AVPlayerItem *thePlayerItem = [player currentItem];
if (thePlayerItem.status == AVPlayerItemStatusReadyToPlay)
{
/*
NOTE:
Because of the dynamic nature of HTTP Live Streaming Media, the best practice
for obtaining the duration of an AVPlayerItem object has changed in iOS 4.3.
Prior to iOS 4.3, you would obtain the duration of a player item by fetching
the value of the duration property of its associated AVAsset object. However,
note that for HTTP Live Streaming Media the duration of a player item during
any particular playback session may differ from the duration of its asset. For
this reason a new key-value observable duration property has been defined on
AVPlayerItem.
See the AV Foundation Release Notes for iOS 4.3 for more information.
*/
return([playerItem duration]);
}
return(kCMTimeInvalid);
}
В этом примере avPlayer является экземпляром AVPlayer.
Я создал видеоконтроль, который использует следующее:
чтобы позиционировать слайдер, используйте что-то подобное, чтобы получить процент воспроизведения в фильме, вам нужно будет повторно запускать эту функцию. Поэтому я бы запускал такую функцию, как:
float scrubberBarLocation = (scrubberBgImageView.frame.size.width / 100.0f) * [self moviePercentage];
- (float)moviePercentage {
CMTime t1 = [avPlayer currentTime];
CMTime t2 = avPlayer.currentItem.asset.duration;
float myCurrentTime = CMTimeGetSeconds(t1);
float myDuration = CMTimeGetSeconds(t2);
float percent = (myCurrentTime / myDuration)*100.0f;
return percent;
}
Затем, чтобы обновить видео, я бы сделал что-то вроде:
- (void)updateVideoPercent:(float)thisPercent {
CMTime t2 = avPlayer.currentItem.asset.duration;
float myDuration = CMTimeGetSeconds(t2);
float result = myDuration * thisPercent /100.0f;
//NSLog(@"this result = %f",result); // debug
CMTime seekTime = CMTimeMake(result, 1);
[avPlayer seekToTime:seekTime];
}