Je voudrais faire un UISlider (scrubber) pour mon AVPlayer. Mais puisque ce n'est pas un AVAudioPlayer, il n'a pas de durée intégrée. Une suggestion sur la façon de créer le curseur pour l'avance rapide, le rembobinage et la progression de la lecture? J'ai lu le doc sur AVPlayer, il a un builtToTime ou seekToTime: toleranceBefore: toleranceAfter :. Je ne le comprends pas vraiment. Serait-ce la réponse pour mon curseur? AVPlayer a également addPeriodicTimeObserverForInterval: queue: usingBlock :, est-ce pour obtenir la durée de ma piste? Quelqu'un peut-il me donner un exemple sur la façon d'implémenter ce code? Je ne suis pas fan de la documentation d'Apple. Cela semble très difficile à comprendre.Comment réserver la durée de AVPlayer (Not AVAudioPlayer)?
Répondre
self.player.currentItem.asset.duration
Got it!
têtes
#import <AVFoundation/AVPlayer.h>
#import <AVFoundation/AVPlayerItem.h>
#import <AVFoundation/AVAsset.h>
Code
CMTime duration = self.player.currentItem.asset.duration;
float seconds = CMTimeGetSeconds(duration);
NSLog(@"duration: %.2f", seconds);
cadres
AVFoundation
CoreMedia
renvoie parfois un NaN – 0oneo
Comme d'iOS 4.3, vous pouvez utiliser le Slig htly plus court:
self.player.currentItem.duration;
obtenir le CMTime à partir de .currentItem.asset.duration prend 3-4 secondes? Comment résoudre ce problème? J'ai encore utiliser le fil mais pas résolu? –
A pris note de StitchedStreamPlayer
Vous devez utiliser 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);
}
Dans cet exemple AVPlayer est l'instance AVPlayer.
J'ai construit un contrôle vidéo qui utilise les éléments suivants:
pour positionner le curseur utiliser quelque chose comme ceci pour obtenir le pourcentage de la tête de lecture à travers le film, vous devez tirer cette fonction à plusieurs reprises. Donc, je courrais la fonction comme:
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;
}
ensuite de mettre à jour la vidéo que je ferais quelque chose comme:
- (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];
}
Pour Swift pour obtenir la durée en secondes
if let duration = player.currentItem?.asset.duration {
let seconds = CMTimeGetSeconds(duration)
print(seconds)
}
obtenir le CMTime à partir de .currentItem.asset.duration prend 3-4 secondes? Comment résoudre ce problème? J'ai encore utiliser le fil mais pas résolu? –
Wow, Merci! C'était de la frustration car self.player.currentItem.duration compile. –
CMTimeGetSeconds (aboveCode) pour la valeur float :) – coolcool1994
Pour les longs vidéos ne fonctionnent pas dans certains cas. Retour 0.00. Une idée? – jose920405