2010-11-04 143 views
39

我试图加载视频文件到我的iPad应用作为AVURLAsset,使用异步加载的东西来等待它准备就绪。问题是,当我运行它时,我得到一个完全通用的“失败”错误消息,我不知道该如何处理。该视频的作品如果我把它交给MPMoviePlayerController,但AVURLAsset似乎拒绝与它有任何关系。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,顺便说一句,是 “未知错误” 的错误代码。一种死胡同。有任何想法吗?在我尝试加载资产之前是否应该设置一些内容?

回答

110

已解决。诀窍:使用fileURLWithPath:,而不是URLWithString:。显然,这种差异真的很重要。

+27

我正在使用fileURLWithPath,仍然得到相同的错误。 – gngrwzrd 2012-01-18 17:59:19

+0

+1 This work for me..Thanks much .. – 2012-05-04 06:14:29

+1

谢谢你verryy多!!!我现在意识到差异很重要,因为它需要一个绝对的URL到URL,所以URLWithString给出的相对URL(/ var/mobile/...)不起作用。 – 2012-05-22 10:08:59

6

如果任何人在使用fileURLWithPath之后仍然有问题,请尝试在time数组中请求NSTimeIntervals(如果使用的是int)。

这不起作用:

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]; 
+0

这是我的问题谢谢, Edwin – 2014-06-16 11:01:17

+0

你可以做一个这样的快速版本吗?请 – rottenoats 2016-08-22 15:15:14

5

如果使用-[NSURL fileURLWithPath:]创建网址,仍然得到同样的错误。

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

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

+1

你在哪里设置? – CodyMace 2016-12-08 20:26:28

+0

@CodyMace这是'AVURLAsset'的选项键,参见' - [AVURLAsset URLAssetWithURL:options:]' – naituw 2017-05-10 05:33:51