AVURLAsset拒绝加载video
我试图加载video文件到我的iPad应用程序作为一个AVURLAsset
,使用asynchronous加载的东西,等待它准备好了。 问题是,当我运行它,我得到一个完全通用的“失败”的错误消息,我不知道该怎么办。 如果我把它交给MPMoviePlayerController
,video就可以工作,但是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:
显然差别真的很重要。
如果任何人在使用fileURLWithPath之后仍然有问题,请尝试在time数组中使用int(s)来请求NSTimeIntervals。
这不起作用:
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:]
创buildURL并仍然得到相同的错误。
检查AVURLAssetReferenceRestrictionsKey
,你的本地m3u8可能无法播放,如果它包含远程资源。
将值设置为@(AVAssetReferenceRestrictionForbidNone)
应解决问题。