前言
今天在使用AVKit進(jìn)行視頻播放的時(shí)候發(fā)現(xiàn)無(wú)法播放本地視頻肯污,而只能播放網(wǎng)絡(luò)視頻,在仔細(xì)查看了一遍代碼后忽然想到了加載本地資源時(shí)應(yīng)該用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];
于是問(wèn)題就解決了匠璧。
但是為什么會(huì)這樣呢?在網(wǎng)上簡(jiǎn)單的Google了一下沒(méi)有找到滿意的文章,隨意決定自己動(dòng)手寫(xiě)一篇把将,于是便有了這篇文章。
正文
- fileURLWithPath:方法和URLWithString:方法的區(qū)別忆矛。
fileURLWithPath:方法自帶一個(gè)baseURL察蹲,默認(rèn)值為file:///。使用fileURLWithPath:創(chuàng)建出的url的絕對(duì)路徑會(huì)在path的首部插入file:///洪碳。而URLWithString:不會(huì)递览。
這樣造成的后果是什么呢?就是加載本地?cái)?shù)據(jù)時(shí)瞳腌,一般使用fileURLWithPath:方法绞铃,加載網(wǎng)絡(luò)數(shù)據(jù)時(shí)使用URLWithString:方法。
當(dāng)然嫂侍,這不是絕對(duì)的儿捧,你同樣可以用URLWithString:方法的擴(kuò)展方法來(lái)創(chuàng)建可以加載本地?cái)?shù)據(jù)的URL,例如:
NSURL *url = [NSURL URLWithString:@"user/path/video.mov" relativeToURL:[NSURL URLWithString:@"file:///"]];
- 使用Bookmarks.
Bookmarks是個(gè)很有意思的特性挑宠,一旦為某個(gè)URL生成了bookmarks,那么這個(gè)路徑指向的文件或者文件夾不論是更換位置還是重命名菲盾,通過(guò)bookmarks我們總能找到它。使用代碼如下:
/// 通過(guò)url生成一個(gè)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并用來(lái)創(chuàng)建一個(gè)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);
}
以后如果有其他用到的地方各淀,我可能還會(huì)更新懒鉴。