2016-10-18 63 views
0

我在一個應用程序,我需要將視頻上傳到這裏server.Now工作,我有兩兩件事:
無法從相機上傳照片圖庫視頻,但能夠上傳視頻拍攝的iOS

  1. 拍攝視頻使用UIImagePickerController,生成一個縮略圖,然後上傳到服務器
  2. 從照片庫中選擇視頻,生成縮略圖,然後上傳到服務器。

現在兩者之間的唯一區別是:

當我使用「generateImageAsynchronouslyForTimes:completionHandler:」方法,我在completionHandler塊得到一個電話,我讓我使用下面的代碼的AVAsset.Now得到它的URL:

NSURL *path_url = [(AVURLAsset*)asset URL]; 

這是我覺得事情越來越亂了,因爲我得到的東西像這樣的情況下,2(當我拿起從圖庫視頻):

文件:///var/mobile/Media/DCIM/102APPLE/IMG_2439.mp4

所以我不能上傳它,而情況1工作fine.Is它的東西涉及到沙盒?

這兩條路徑有什麼區別?

  1. 文件:///private/var/mobile/Containers/Data/Application/DA4632E3-FA25-4EBE-9102-62495BF105BF/tmp/trim.07786CFE-2477-4146-9EA0-0A04042A8D05.MOV」
  2. 文件:///var/mobile/Media/DCIM/102APPLE/IMG_2439.mp4

我猜1的appSandbox路徑)

+0

(1)在沙箱中。 (2)你使用UIImagePickerController在編輯後選取原始視頻或視頻嗎?如果您使用編輯過的視頻,我認爲可以上傳。如果沒有,請檢查您是否有權通過使用此視頻網址創建NSData來直接從庫中讀取文件。如果NSData是零,所以我應該選擇編輯的視頻上傳。 – nynohu

+0

如果我通過轉換到NSData上傳,然後它給內存問題,我使用UIImagePickerController從照片庫中選擇一個視頻,然後發送到server.It給我「DCIM」的路徑,你可以看到我的帖子。所以,它不會上傳到server.It顯示文件是空的,而如果我使用UIImagePickerController cameraType和拍攝視頻,然後上傳,然後它上傳。 – Reckoner

回答

1

在iOS系統中,每一個應用程序就像是一個島嶼,有一個沙盒環境。因此,如果您想上傳不在沙盒中的視頻,則必須將該視頻複製到沙盒,然後才能上傳it.This是你如何能做到這一點:

NSURL *path_url = [(AVURLAsset*)asset URL]; 

PHAssetResource *asset_resource = [[PHAssetResource assetResourcesForAsset:[fetchResult lastObject]]firstObject]; 

PHAssetResourceRequestOptions *options = [PHAssetResourceRequestOptions new]; 
options.networkAccessAllowed = YES; 
NSURL *newURL = [self getSandboxURLFromURL:path_url]; 

[[PHAssetResourceManager defaultManager] writeDataForAssetResource:asset_resource toFile:newURL options:options completionHandler:^(NSError * _Nullable error) { 

//here you will get the newURL that you will use... 
}]; 

//方法來獲取沙箱URL

-(NSURL*)getSandboxURLFromURL:(NSURL*)photos_gallery_url{ 

    NSString *last_path_component = [photos_gallery_url lastPathComponent]; 
    NSString *pathToWrite = [NSTemporaryDirectory() stringByAppendingString:last_path_component]; 
    NSURL *localpath = [NSURL fileURLWithPath:pathToWrite]; 
    return localpath; 
}