使用照片框架从图库上传视频
Upload videos from gallery using Photos framework
使用照片框架从图库上传视频的最佳方式是什么?
在我使用 ALAssetRepresentation 和下一个方法之前:
- (NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error;
这允许上传文件而无需先将其复制到应用程序临时目录。在照片框架中看不到任何替代品。唯一的方法似乎是使用 AVAssetExportSession -> 导出到本地目录 -> 上传,但这需要额外的存储空间 space(如果视频太大,可能会有问题)
似乎唯一有效的方法是从 PHImageManager
请求 AVAsset
,并检查返回的资产是否为 AVURLAsset
。在这种情况下 URL 可用于直接访问文件并获取所需的字节块:
[[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
}
}];
这不适用于慢动作视频,因为返回的是 AVComposition
而不是 AVURLAsset
。可能的解决方案是使用 PHVideoRequestOptionsVersionOriginal
视频文件版本:
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
}
}];
并获取全尺寸图像 url:
PHContentEditingInputRequestOptions *options = [[PHContentEditingInputRequestOptions alloc] init];
options.canHandleAdjustmentData = ^BOOL(PHAdjustmentData *adjustmentData) {
return YES;
};
[imageAsset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
// use contentEditingInput.fullSizeImageURL
}];
使用照片框架从图库上传视频的最佳方式是什么? 在我使用 ALAssetRepresentation 和下一个方法之前:
- (NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error;
这允许上传文件而无需先将其复制到应用程序临时目录。在照片框架中看不到任何替代品。唯一的方法似乎是使用 AVAssetExportSession -> 导出到本地目录 -> 上传,但这需要额外的存储空间 space(如果视频太大,可能会有问题)
似乎唯一有效的方法是从 PHImageManager
请求 AVAsset
,并检查返回的资产是否为 AVURLAsset
。在这种情况下 URL 可用于直接访问文件并获取所需的字节块:
[[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
}
}];
这不适用于慢动作视频,因为返回的是 AVComposition
而不是 AVURLAsset
。可能的解决方案是使用 PHVideoRequestOptionsVersionOriginal
视频文件版本:
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
}
}];
并获取全尺寸图像 url:
PHContentEditingInputRequestOptions *options = [[PHContentEditingInputRequestOptions alloc] init];
options.canHandleAdjustmentData = ^BOOL(PHAdjustmentData *adjustmentData) {
return YES;
};
[imageAsset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
// use contentEditingInput.fullSizeImageURL
}];