2010-10-19 26 views
31

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

100
self.player.currentItem.asset.duration 

Got it!

+0

Wow, Merci! C'était de la frustration car self.player.currentItem.duration compile. –

+15

CMTimeGetSeconds (aboveCode) pour la valeur float :) – coolcool1994

+1

Pour les longs vidéos ne fonctionnent pas dans certains cas. Retour 0.00. Une idée? – jose920405

34

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 
+4

renvoie parfois un NaN – 0oneo

9

Comme d'iOS 4.3, vous pouvez utiliser le Slig htly plus court:

self.player.currentItem.duration; 
+0

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? –

3

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); 
} 
2

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]; 

} 
8

Pour Swift pour obtenir la durée en secondes

if let duration = player.currentItem?.asset.duration { 
    let seconds = CMTimeGetSeconds(duration) 
    print(seconds) 
} 
+0

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? –