使用照片框架从相册上传视频

9

如何使用Photos框架从相册上传视频?在使用ALAssetRepresentation和以下方法之前:

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

这允许上传文件而无需先将其复制到应用程序临时目录。在照片框架中没有看到任何替代方案。唯一的方法似乎是使用AVAssetExportSession -> 导出到本地目录 -> 上传,但这需要额外的存储空间(如果视频太大可能会成为问题)。

1个回答

14

似乎唯一有效的方法是从PHImageManager请求AVAsset,并检查返回的asset是否为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
}];

Basil,这个解决方案已经在我们的实际应用中使用了一段时间,没有出现任何问题。请分享一下代码中出现问题的部分,以获取更多信息。 - f3n1kc
在我的情况下,我计划使用URL作为上传大视频的输入流。但是失败了,因为该流的hasBytesAvailable返回NO。 - Benson
无法在Facebook上分享,请问有什么建议。 - The iCoder
例如,当您将URL作为NSData获取时,读取URL的操作经常会失败。 - Deepak Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接