我正在使用 UIImagePickerController 允许我的用户从资产库中选择视频。
当用户在第二个屏幕上选择“选择”按钮时,视图会显示一个进度条和“正在压缩视频...”消息。
为什么会这样?
有什么方法可以避免这种压缩操作吗?
我正在使用 UIImagePickerController 允许我的用户从资产库中选择视频。
当用户在第二个屏幕上选择“选择”按钮时,视图会显示一个进度条和“正在压缩视频...”消息。
为什么会这样?
有什么方法可以避免这种压缩操作吗?
答:目前没有办法控制 UIImagePickerController 如何压缩选取的视频。
我只是做了一些快速测试。使用我创建的测试应用程序,我选择了两次相同的视频 - 一次将videoQuality
属性设置为UIImagePickerControllerQualityTypeHigh
,一次将其设置为UIImagePickerControllerQualityTypeLow
. 复制的结果文件大小完全相同,为 15.1MB,帧大小为 360x480。原始大小为 72.5MB,帧大小为 480x640。显然,此属性根本不影响使用的压缩。
将UIImagePickerController的videoQuality属性设置为“High”(UIImagePickerControllerQualityTypeHigh = 0)
来自 SDK 文档:“如果在图像选择器中显示录制的电影,请指定您不想降低电影的视频质量。”
由于目前还没有办法避免使用 UIImagePickerController 进行压缩,因此我想介绍一些关于如何创建自己的图像选择器来避免压缩的想法。
这将允许访问原始视频文件:
iOS 8
PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];
for (PHAsset *asset in assetsFetchResult) {
PHVideoRequestOptions *videoRequestOptions = [[PHVideoRequestOptions alloc] init];
videoRequestOptions.version = PHVideoRequestOptionsVersionOriginal;
[[PHImageManager defaultManager] requestAVAssetForVideo:asset options:videoRequestOptions resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
// the AVAsset object represents the original video file
}];
}
查看 PhotoKit 文档以访问集合(时刻)和其他选项。
这是 Apple 使用 PhotoKit 的示例应用程序,可以修改为照片选择器:https ://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html
这是 GitHub 上的一个照片选择器库,它使用 PhotoKit 看起来很有前途,因为它为您提供了所有选定图像/视频的 PHAsset 对象:https ://github.com/guillermomuntaner/GMImagePicker
iOS 7 及以下
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (group) {
// If you want, you can filter just pictures or videos
// I just need videos so I do this:
[group setAssetsFilter:[ALAssetsFilter allVideos]];
[group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){
if (asset){
// You can now add this ALAsset in your own video picker.
// Note that you can only access the ALAsset as long as
// you maintain a reference to the ALAssetsLibrary
// Or if you want to process the video, you can create an AVAsset:
NSURL *url = asset.defaultRepresentation.url;
AVAsset *videoAsset = [AVAsset assetWithURL:url];
}
}];
}
} failureBlock:^(NSError *error) {
NSLog(@"error enumerating AssetLibrary groups %@\n", error);
}];
从 iOS 11 开始,您可以指定videoExportPreset
并将其设置为AVAssetExportPresetPassthrough
:
picker.videoExportPreset = AVAssetExportPresetPassthrough
这仍然会显示“压缩”进度条,但会更快,尤其是对于较小的视频。
对于那些建议使用 videoQuality 属性的人,文档清楚地说明它是一个视频捕获选项,而不是一个选择器选项。
正如杰克在下面提到的那样,它也用于转码。看起来我读文档太快了,因为我没有注意到转码提及。