AVURLAsset отказывается загружать видео - PullRequest
40 голосов
/ 05 ноября 2010

Я пытаюсь загрузить видеофайл в приложение iPad как AVURLAsset, используя асинхронную загрузку, чтобы дождаться его готовности. Проблема в том, что когда я его запускаю, я получаю совершенно общее сообщение об ошибке «сбой», с которым я не знаю, что делать. Видео работает, если я передаю его на MPMoviePlayerController, но AVURLAsset, похоже, отказывается иметь какое-либо отношение к нему.

Код:

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

Выход:

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, кстати, является кодом ошибки для «неизвестной ошибки». Вроде тупик. Есть идеи? Что-то, что я должен настроить, прежде чем пытаться загрузить ресурс?

Ответы [ 3 ]

116 голосов
/ 17 ноября 2010

решаемая. Хитрость: используйте fileURLWithPath:, а не URLWithString:. Видимо, разница действительно очень существенная.

6 голосов
/ 15 октября 2013

Если у кого-то все еще есть проблемы с этим даже после использования fileURLWithPath, попробуйте запросить NSTimeIntervals в массиве времени, если вы используете int (s).

Это не работает:

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

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

Это работает:

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

     [self.videoPlayer requestThumbnailImagesAtTimes:playbackTimes timeOption:MPMovieTimeOptionNearestKeyFrame];
5 голосов
/ 17 мая 2014

Если вы используете -[NSURL fileURLWithPath:] для создания URL и по-прежнему получаете ту же ошибку.

Проверьте AVURLAssetReferenceRestrictionsKey, ваш локальный m3u8 может не воспроизводиться, если он содержит удаленный ресурс.

Установите значение @(AVAssetReferenceRestrictionForbidNone), чтобы решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...