AVURLAsset отказывается загружать видео

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


person Noah Witherspoon    schedule 04.11.2010    source источник


Ответы (3)


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

person Noah Witherspoon    schedule 17.11.2010
comment
Большое вам спасибо !!! Теперь я понимаю, что разница значительна, потому что для этого нужен абсолютный URL-адрес файла, и поэтому относительный URL-адрес (/ var / mobile / ...), заданный URLWithString, не работает. - person Chintan Patel; 22.05.2012
comment
Для меня обратный вызов просто никогда не вызывался при использовании URLWithString - даже для того, чтобы сообщить мне об ошибке. А с fileURLWithPath это работает. Это серьезный недостаток ... -.- - person Frank Schlegel; 10.02.2015
comment
fileURLWithPath предназначен для воспроизведения звука из пакета, но я не могу воспроизвести звук с URL-адреса. - person Deepak Saki; 21.02.2017
comment
У меня также возникает одна проблема, пожалуйста, изучите это и сообщите: stackoverflow.com/questions/51239586/ - person user2786; 09.07.2018

Если у кого-то все еще возникают проблемы с этим даже после использования fileURLWithPath, попробуйте запросить NSTimeInterval в массиве времени, если вы используете 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];
person Edwin Iskandar    schedule 15.10.2013
comment
Это была моя проблема. Спасибо, Эдвин. - person Dafydd Williams; 16.06.2014
comment
Не могли бы вы сделать быструю версию этого? Пожалуйста - person kemicofa ghost; 22.08.2016

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

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

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

person naituw    schedule 17.05.2014
comment
Где вы это устанавливаете? - person CodyMace; 08.12.2016
comment
@CodyMace Это ключ опции для AVURLAsset, см. -[AVURLAsset URLAssetWithURL:options:] - person naituw; 10.05.2017