使用UIImagePickerController选择电影时避免视频压缩?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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 %@
", error);
}];
对于那些提供使用videoQuality属性的建议的人,文档清楚地说明它是一个视频捕获选项,而不是选择器选项。
正如杰克在下面提到的那样,它也用于转码。看起来我读得太快,因为我没有注意到转码提及。
从iOS 11开始,您可以指定videoExportPreset
并将其设置为AVAssetExportPresetPassthrough
:
picker.videoExportPreset = AVAssetExportPresetPassthrough
这仍将显示“压缩”进度条,但会更快,特别是对于较小的视频。
以上是关于使用UIImagePickerController选择电影时避免视频压缩?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用/用于 UIImagePickerController 显示所有相机控件?
iOS:UIImagePickerController - 使用工具栏属性?
使用 UIImagePickerController 保存图像
将 UIImagePickerController 与 Web 数据源一起使用