2012-01-27 15 views
11

estoy jugando un pequeño vídeo en el controlador de mpmediaplayer utilizando este códigoplayer.duration muestra siempre cero en MPMoviePlayerController de archivo de vídeo

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

donde videostr es ruta de ese archivo de vídeo.

Ahora necesito obtener la longitud de ese archivo de video para el que estoy usando este código.

length = player.duration; 

Pero siempre muestra 0.000. Pero el video está jugando bien.

Estoy comprobando mediante Google cada código para obtener la duración del video es player.duration solamente.

Y trato de algún otro código también

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

a pesar de que muestra zero.Can cualquiera, por favor me ayude.

Gracias de antemano.

Respuesta

22

No puede obtener una duración útil hasta que el contenido se pueda reproducir.

Registro de cambios de estado de carga:

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

evaluar el estado una vez de haber sido notificado:

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

notificación: MPMoviePlayerLoadSadDidChangeNotification llame 2 veces de forma automática – g212gs

+0

Si el video está pausado de manera predeterminada, esta solución no funciona, porque esta notificación se invoca cuando el usuario ejecuta la acción de reproducción. ¿Existe alguna forma de obtener la duración anterior? – jose920405

2

SWIFT

Se puede hacer en rápida como esto

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

Tal vez ampliar esa respuesta un poco. Con una muestra de código o algo útil ... –

+0

Solo funciona cuando el usuario ejecuta una acción de juego – jose920405

0

Puede bajar el tiempo de duración del archivo de vídeo mediante el siguiente código.

NSURL *videoURL = [NSURL fileURLWithPath:VideoFileURL]; 

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

CMTime duration = sourceAsset.duration; 

double durationInSeconds = duration.value/duration.timescale; 

En durationInSeconds variable que reciben la duración exacta en segundos.

Cuestiones relacionadas