2015-04-21 16 views
8

Cách tốt nhất để tải video lên từ thư viện bằng cách sử dụng khung Ảnh là gì? Trước khi tôi sử dụng ALAssetRepresentation và phương pháp tiếp theo:Tải lên video từ thư viện bằng cách sử dụng Khung ảnh

- (NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error; 

này được phép tải lên tập tin mà không cần sao chép đầu tiên nó vào thư mục ứng dụng temp. Không thấy bất kỳ lựa chọn thay thế nào trong khung Ảnh. Cách duy nhất dường như sử dụng AVAssetExportSession -> xuất sang thư mục cục bộ -> tải lên, nhưng điều này yêu cầu dung lượng lưu trữ bổ sung (có thể là một vấn đề, nếu video quá lớn)

Trả lời

13

Dường như cách hợp lệ duy nhất là yêu cầu AVAsset từ PHImageManager, và kiểm tra xem tài sản trả lại có phải là AVURLAsset không. Trong trường hợp này URL có thể được sử dụng để truy cập trực tiếp tập tin và nhận được đoạn cần thiết của byte:

[[PHImageManager defaultManager] requestAVAssetForVideo:videoAsset options:nil resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) { 
    if ([asset isKindOfClass:[AVURLAsset class]]) { 
    NSURL *URL = [(AVURLAsset *)asset URL]; 
    // use URL to get file content 
    } 
}]; 

này sẽ không làm việc với video chuyển động chậm, vì AVComposition thay vì AVURLAsset được trả về. giải pháp khả thi là sử dụng PHVideoRequestOptionsVersionOriginal đoạn video tập tin phiên bản:

PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init]; 
options.version = PHVideoRequestOptionsVersionOriginal; 

[[PHImageManager defaultManager] requestAVAssetForVideo:videoAsset options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) { 
    if ([asset isKindOfClass:[AVURLAsset class]]) { 
    NSURL *URL = [(AVURLAsset *)asset URL]; 
    // use URL to get file content 
    } 
}]; 

Và để có được url hình ảnh fullsize:

PHContentEditingInputRequestOptions *options = [[PHContentEditingInputRequestOptions alloc] init]; 
options.canHandleAdjustmentData = ^BOOL(PHAdjustmentData *adjustmentData) { 
    return YES; 
}; 

[imageAsset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 
    // use contentEditingInput.fullSizeImageURL 
}]; 
+1

Không làm việc trong thiết bị thực –

+0

Basil, giải pháp này được sử dụng trong ứng dụng trực tiếp của chúng tôi mà không cần bất kỳ vấn đề. vui lòng chia sẻ một phần mã không hoạt động để biết thêm thông tin – f3n1kc

+0

Trong trường hợp của tôi, tôi đã lên kế hoạch sử dụng URL làm luồng đầu vào để tải lên video lớn. Nhưng không thành công, vì 'hasBytesAvailable' của luồng đó trả về NO. – Benson

Các vấn đề liên quan