2010-11-04 29 views
39

Estoy tratando de cargar un archivo de video en mi aplicación para iPad como AVURLAsset, usando la carga asincrónica para esperar a que esté listo. El problema es que cuando lo ejecuto recibo un mensaje de error "genérico" completamente genérico que no tengo idea de qué hacer. El video funciona si lo entrego a un MPMoviePlayerController, pero AVURLAsset parece negarse a tener algo que ver con eso.AVURLAsset se niega a cargar el video

Código:

asset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:[docPath stringByAppendingPathComponent:@"video.mov"]] options:nil]; 
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self composeIfReady]; 
    }); 
}]; 

...

- (void)composeIfReady 
{ 
    NSError *error = nil; 
    if([asset statusOfValueForKey:@"tracks" error:&error] == AVKeyValueStatusFailed) 
     NSLog(@"error loading: %@", [error description]); 
    if(error == nil) 
     NSLog(@"okay awesome"); 
} 

La salida:

error loading: Error Domain=AVFoundationErrorDomain Code=-11800 "The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)" UserInfo=0x1696f0 {NSUnderlyingError=0x169a40 "The operation couldn’t be completed. (OSStatus error -12936.)"} 

-11800, por cierto, es el código de error de "error desconocido". Tipo de callejón sin salida. ¿Algunas ideas? ¿Hay algo que deba configurar antes de intentar cargar el activo?

Respuesta

110

Resuelto. El truco: use fileURLWithPath:, no URLWithString:. Aparentemente, la diferencia es realmente significativa.

+27

Estoy usando fileURLWithPath y sigo recibiendo los mismos errores. – gngrwzrd

+0

+1 Esto funciona para mí ... Muchas gracias .. –

+1

¡Muchas gracias! Ahora me doy cuenta de que la diferencia es significativa porque necesita una URL absoluta para el archivo y, por lo tanto, la URL relativa (/ var/mobile/...) proporcionada por URLWithString no funciona. –

6

Si alguien todavía tiene problemas con esto incluso después de usar fileURLWithPath, intente solicitar NSTimeIntervals en la matriz de tiempo si está utilizando int (s).

Esto no funciona:

NSMutableArray *playbackTimes = [NSMutableArray array]; 
    for (int i = 0; i <= 10; i ++) { 
     [playbackTimes addObject:@(i)]; 
    } 

    [self.videoPlayer requestThumbnailImagesAtTimes:playbackTimes timeOption:MPMovieTimeOptionNearestKeyFrame]; 

Esto funciona:

NSMutableArray *playbackTimes = [NSMutableArray array]; 
    for (int i = 0; i <= 10; i ++) { 
     [playbackTimes addObject:@((NSTimeInterval)i)]; 
    } 

    [self.videoPlayer requestThumbnailImagesAtTimes:playbackTimes timeOption:MPMovieTimeOptionNearestKeyFrame]; 
+0

Este fue mi problema. Gracias, Edwin. –

+0

¿Podría hacer una versión rápida de esto? Por favor, – rottenoats

5

Si está utilizando -[NSURL fileURLWithPath:] para crear la URL y aún así obtener el mismo error.

Compruebe AVURLAssetReferenceRestrictionsKey, Su m3u8 local puede fallar si contiene recursos remotos.

Establezca el valor @(AVAssetReferenceRestrictionForbidNone) debería solucionar el problema.

+1

¿Dónde lo configura? – CodyMace

+0

@CodyMace Es una clave de opción para 'AVURLAsset', vea' - [AVURLAsset URLAssetWithURL: options:] ' – naituw

Cuestiones relacionadas