Ответ 1
решаемая. Трюк: используйте fileURLWithPath:
, а не URLWithString:
. По-видимому, разница действительно, действительно значительна.
Я пытаюсь загрузить видеофайл в свое приложение для 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, кстати, является кодом ошибки для "неизвестной ошибки". Вид тупика. Есть идеи? Есть ли что-то, что я должен настроить до того, как попытаюсь загрузить актив?
решаемая. Трюк: используйте fileURLWithPath:
, а не URLWithString:
. По-видимому, разница действительно, действительно значительна.
Если у кого-то есть проблемы с этим даже после использования 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];
Если вы используете -[NSURL fileURLWithPath:]
для создания URL-адреса и по-прежнему получаете ту же ошибку.
Проверьте AVURLAssetReferenceRestrictionsKey
,
Ваш локальный m3u8 может не сыграть, если он содержит удаленный ресурс.
Задайте значение @(AVAssetReferenceRestrictionForbidNone)
, чтобы решить проблему.