2017-09-29 185 views
0

我從用戶照片庫中選取視頻,然後將視頻保存在用戶Documents文件夾中,以便即使用戶從他的照片庫中刪除此視頻也能播放視頻。該文件的URL存儲在覈心數據中。 一切正常,直到下次運行應用程序。不知何故,它似​​乎不再有效,這是奇怪的,因爲我可以在[AVPlayer playerWithURL:videoURL]失敗時刪除視頻文件。 這裏是我挑的視頻網址:AVPlayer playerWithURL在應用程序重新啓動後無法工作

- (void) imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{ 
NSURL* videoURL = info[UIImagePickerControllerMediaURL];} 

這是我如何保存視頻:

+ (NSURL*) saveVideoInDocumentsFolder:(NSURL*)videoURL name:(NSString*)name { 
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString* documentsDirectory = [paths objectAtIndex:0]; 
NSString* pathComponent = [NSString stringWithFormat:@"/%@.%@", name, [videoURL pathExtension]]; 
NSString* path = [documentsDirectory stringByAppendingPathComponent:pathComponent]; 

NSError* error = nil; 
NSData* videoData = [NSData dataWithContentsOfURL:videoURL options:0 error:&error]; 
if (error) 
    return nil; 

BOOL success = [videoData writeToFile:path options:NSDataWritingAtomic error:&error]; 
if (success) 
    return [NSURL fileURLWithPath:path]; 

return nil;} 

這是我如何播放視頻:

AVPlayer* player = [AVPlayer playerWithURL:videoURL]; // <- AFTER I RESTART THE APP THIS METHOD ALWAYS RETURNS nil!! 

AVPlayerViewController* viewController = [[AVPlayerViewController alloc] init]; 
[self presentViewController:viewController animated:YES completion:nil]; 
viewController.player = player; 
[player play]; 

很多感謝提前!

回答

0

的URL此文件存儲在覈心數據

這就是問題所在。文檔目錄URL在您每次運行應用程序時都會更改(因爲您已被沙箱化),因此第二次無效。絕對不要永遠不要在iOS中保存絕對文件的URL!

+0

謝謝,馬特!在每個會話中找到指向文檔文件夾的基本URL的最正確方法是什麼? – Mig70

+0

正如你所做的那樣。您只需在每次需要訪問文檔目錄時重新計算'documentsDirectory'。 :)它會在應用程序運行過程中持續存在,但僅此而已。 – matt

0

當您關閉並打開應用程序時,您需要採用超時路徑目錄,因爲當應用程序關閉它時,它會刪除documentDirectory,因此您必須再次使用它,並且如果要獲取視頻文件,請保存FILE NAME的視頻轉換爲首選項或coreData,然後通過附加此視頻名稱文件獲取documentDirectory路徑,您將獲得視頻。

隨便看看: - (代碼是迅速,你可以把它轉換目標C容易)

讓文件名= 「recording.mp4」

讓TEMPPATH = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask,真)

設tempDocumentsDirectory:AnyObject = TEMPPATH [0]作爲AnyObject

讓tempDataPath = tempDocumentsDirectory.appendingPathCompo新界東北堆填區(文件名)的字符串作爲字符串

該文件名,你會優先或coreData

,當你關閉保存並打開該應用只需要檢查你是否有文件名保存在偏好或者如果核心數據是然後通過追加文件目錄,您將獲得您的視頻

相關問題