41

我正在尝试将视频文件加载到我的 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 是“未知错误”的错误代码。有点死胡同。有任何想法吗?在尝试加载资产之前,我应该设置什么吗?

4

3 回答 3

116

解决了。诀窍:使用fileURLWithPath:,而不是URLWithString:。显然,差异是非常非常重要的。

于 2010-11-17T04:12:47.507 回答
6

如果即使在使用 fileURLWithPath 后仍有人遇到此问题,如果您使用的是 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];
于 2013-10-15T15:42:11.677 回答
6

如果您正在使用-[NSURL fileURLWithPath:]创建 URL 并且仍然得到相同的错误。

检查AVURLAssetReferenceRestrictionsKey,如果它包含远程资源,您的本地 m3u8 可能无法播放。

将值设置为@(AVAssetReferenceRestrictionForbidNone)应该可以解决问题。

于 2014-05-17T15:32:02.103 回答