前言
今天在使用AVKit进行视频播放的时候发现无法播放本地视频,而只能播放网络视频,在仔细查看了一遍代码后忽然想到了加载本地资源时应该用fileURLWithPath:方法而不是URLWithString:方法:
NSURL *url = [NSURL fileURLWithPath:@"user/path/video.mov"];
NSLog(@"%@", [url absoluteURL]);
AVPlayer *player = [AVPlayer playerWithURL:url];
AVPlayerViewController *playerViewController = [AVPlayerViewController new];
playerViewController.player = player;
[self presentViewController:playerViewController animated:YES completion:nil];
于是问题就解决了。
但是为什么会这样呢?在网上简单的Google了一下没有找到满意的文章,随意决定自己动手写一篇,于是便有了这篇文章。
正文
- fileURLWithPath:方法和URLWithString:方法的区别。
fileURLWithPath:方法自带一个baseURL,默认值为file:///。使用fileURLWithPath:创建出的url的绝对路径会在path的首部插入file:///。而URLWithString:不会。
这样造成的后果是什么呢?就是加载本地数据时,一般使用fileURLWithPath:方法,加载网络数据时使用URLWithString:方法。
当然,这不是绝对的,你同样可以用URLWithString:方法的扩展方法来创建可以加载本地数据的URL,例如:
NSURL *url = [NSURL URLWithString:@"user/path/video.mov" relativeToURL:[NSURL URLWithString:@"file:///"]];
- 使用Bookmarks.
Bookmarks是个很有意思的特性,一旦为某个URL生成了bookmarks,那么这个路径指向的文件或者文件夹不论是更换位置还是重命名,通过bookmarks我们总能找到它。使用代码如下:
/// 通过url生成一个NSData类型的bookmark并做持久化处理
NSData *bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationSuitableForBookmarkFile includingResourceValuesForKeys:nil relativeToURL:nil error:nil];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:bookData forKey:@"boormark"];
[defaults synchronize];
/// 拿到NSData类型的bookmark并用来创建一个url
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"boormark"];
if (data) {
NSURL *url = [NSURL URLByResolvingBookmarkData:data options:0 relativeToURL:nil bookmarkDataIsStale:nil error:nil];
NSLog(@"bookmark ------------- %@", url);
}
以后如果有其他用到的地方,我可能还会更新。
网友评论