AVURLAsset se niega a cargar video

AVURLAsset cargar un archivo de video en mi aplicación para iPad como un 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 MPMoviePlayerController a un MPMoviePlayerController , pero AVURLAsset parece negarse a tener nada que ver con eso.

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 para “error desconocido”. Tipo de callejón sin salida. ¿Algunas ideas? ¿Hay algo que deba configurar antes de intentar cargar el activo?

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

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

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 un recurso remoto.

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