web-dev-qa-db-fra.com

AVURLAsset refuse de charger la vidéo

J'essaie de charger un fichier vidéo dans mon application iPad en tant que AVURLAsset, en utilisant le chargement asynchrone pour attendre qu'il soit prêt. Le problème est que lorsque je l'exécute, j'obtiens un message d'erreur "échec" complètement générique dont je ne sais pas quoi faire. La vidéo fonctionne si je la remets à un MPMoviePlayerController, mais AVURLAsset semble refuser d'avoir quoi que ce soit à voir avec ça.

Code:

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

Le résultat:

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, soit dit en passant, est le code d'erreur pour "erreur inconnue". Une sorte d'impasse. Des idées? Y a-t-il quelque chose que je devrais configurer avant d'essayer de charger l'actif?

40
Noah Witherspoon

Résolu. L'astuce: utilisez fileURLWithPath:, ne pas URLWithString:. Apparemment, la différence est vraiment très importante.

116
Noah Witherspoon

Si vous utilisez -[NSURL fileURLWithPath:] Pour créer l'URL et obtenez toujours la même erreur.

Vérifiez le AVURLAssetReferenceRestrictionsKey, votre m3u8 local peut ne pas jouer s'il contient une ressource distante.

Définissez la valeur sur @(AVAssetReferenceRestrictionForbidNone) devrait résoudre le problème.

6
naituw

Si quelqu'un a toujours des problèmes avec cela même après avoir utilisé fileURLWithPath, essayez de demander NSTimeIntervals dans le tableau de temps si vous utilisez int (s).

Cela ne fonctionne pas:

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

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

Cela marche:

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

     [self.videoPlayer requestThumbnailImagesAtTimes:playbackTimes timeOption:MPMovieTimeOptionNearestKeyFrame];
6
Edwin Iskandar