2012-01-27 10 views
11

sto giocando un piccolo video controller mpmediaplayer utilizzando questo codiceplayer.duration mostra sempre pari a zero in MPMoviePlayerController per file video

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] 
            initWithContentURL:[NSURL fileURLWithPath:videostr]]; 

dove videostr è il percorso di quel file video.

Ora ho bisogno di ottenere la lunghezza di quel file video per quello sto usando questo codice.

length = player.duration; 

Ma mostra sempre 0.000. Ma il video sta giocando bene.

Sto verificando tramite google ogni codice in cui la durata del video è player.duration.

e cerco qualche altro codice anche

AVURLAsset *asset = [[[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:videostr] 
              options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]] autorelease]; 
NSTimeInterval duration; 
if (asset) 
    duration = CMTimeGetSeconds(asset.duration) ; 
NSLog(@">>>>>>>>>>>>>>>>>>>> %f", asset.duration); 

anche se mostra zero.Can qualcuno ti prego, aiutami.

Grazie in anticipo.

risposta

22

Non è possibile ottenere una durata utile finché il contenuto non è effettivamente riproducibile.

Registrati cambiamenti di stato di carico:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(MPMoviePlayerLoadStateDidChange:) 
              name:MPMoviePlayerLoadStateDidChangeNotification 
              object:nil]; 

valutare lo stato una volta dalla notifica:

- (void)MPMoviePlayerLoadStateDidChange:(NSNotification *)notification 
{ 
    if ((player.loadState & MPMovieLoadStatePlaythroughOK) == MPMovieLoadStatePlaythroughOK) 
    { 
     NSLog(@"content play length is %g seconds", player.duration); 
    } 
} 
+0

notifica: MPMoviePlayerLoadStateDidChangeNotification chiamata 2 volte automatiaclly – g212gs

+0

Se per impostazione predefinita, il video è in pausa questa soluzione non funziona, perché questa notifica viene chiamato quando l'utente esegue azioni di gioco. Esiste in qualsiasi modo per ottenere la durata prima? – jose920405

2

SWIFT

Si può fare in rapida come questo

func getMediaDuration(url: NSURL!) -> Float64{ 
     var asset : AVURLAsset = AVURLAsset.assetWithURL(url) as AVURLAsset 
     var duration : CMTime = asset.duration 

     return CMTimeGetSeconds(duration) 
    } 
1

uso MPMovieDurationAvailableNotification

[[NSNotificationCenter defaultCenter] addObserver:self 
            selector:@selector(movieDurationAvailable:) 
             MPMovieDurationAvailableNotification object:nil]; 

- (void)movieDurationAvailable:(NSNotification *)notification { 

     NSLog(@"content play length is %g seconds", moviePlayer.duration); 


} 
+1

Forse espandi un po 'la risposta. Con un esempio di codice o qualcosa di utile .... –

+0

Funziona solo quando l'utente esegue l'azione di riproduzione – jose920405

0

È possibile recuperare durata da file video utilizzando il codice di seguito.

NSURL *videoURL = [NSURL fileURLWithPath:VideoFileURL]; 

AVURLAsset *sourceAsset = [AVURLAsset URLAssetWithURL:videoURL options:nil]; 

CMTime duration = sourceAsset.duration; 

double durationInSeconds = duration.value/duration.timescale; 

In durationInSeconds variabile si ottiene l'esatta durata in secondi.

Problemi correlati