2010-10-19 13 views
31

Ich möchte einen UISlider (Wäscher) für meine AVPlayer machen. Aber da dies kein AVAudioPlayer ist, hat es keine eingebaute Dauer. Irgendwelche Vorschläge, wie Sie den Slider für den schnellen Vorlauf, Rücklauf und Fortschritt der Wiedergabe erstellen können?Wie bekomme ich die Dauer vom AVPlayer (nicht AVAudioPlayer)?

las ich das doc auf AVPlayer hat es ein in seekToTime gebaut oder seekToTime: toleranceBefore: toleranceAfter :. Ich verstehe es nicht wirklich. Wäre das die Antwort für meinen Slider? AVPlayer hat auch addPeriodicTimeObserverForInterval: Warteschlange: usingBlock :, ist dies die Dauer meiner Spur für immer? Kann mir jemand ein Beispiel geben, wie man diesen Code implementiert? Ich bin kein Fan von Apple's Dokumentation. Es scheint sehr schwer zu verstehen.

Antwort

100
self.player.currentItem.asset.duration 

Verstanden!

+0

Wow zu bekommen, Vielen Dank! Es war Frustration, weil self.player.currentItem.duration kompiliert. –

+15

CMTimeGetSeconds (aboveCode) für den Schwimmer Wert :) – coolcool1994

+1

Für longs Videos in einigen Fällen nicht funktionieren. Rückkehr 0.00. Irgendeine Idee? – jose920405

34

Header

#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); 

Gerüste

AVFoundation 
CoreMedia 
+4

manchmal gibt ein NaN – 0oneo

9

Ab iOS 4.3, können Sie die slig verwenden können htly kürzer:

self.player.currentItem.duration; 
+0

die cmtime von .currentItem.asset.duration dauert 3-4 Sekunden erhalten? Wie löste ich dieses Problem? Ich habe noch Thread benutzt aber nicht gelöst? –

3

Noted von StitchedStreamPlayer

Sie 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

In diesem Beispiel verwenden sollten avPlayer ist die AVPlayer Instanz.

Ich habe eine Video-Steuerung aufgebaut, die die folgenden Angaben:

der Schieber zu positionieren etwas wie folgt verwenden Abspielposition der Prozentsatz durch den Film zu bekommen, müssen Sie diese Funktion immer wieder feuern. So würde ich die Funktion wie laufen:

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; 

} 

Dann das Video zu aktualisieren ich etwas tun würde, wie:

- (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

Für Swift Dauer in Sekunden

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

Abrufen der CMTime von .currentItem.asset.duration dauert 3-4 Sekunden? Wie löste ich dieses Problem? Ich habe noch Thread benutzt aber nicht gelöst? –

Verwandte Themen