使用UIImagePickerController选择电影时避免视频压缩?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用UIImagePickerController选择电影时避免视频压缩?相关的知识,希望对你有一定的参考价值。

我正在使用UIImagePickerController来允许我的用户从资产库中选择一个视频。

当用户选择第二个屏幕上的“选择”按钮时,视图显示进度条和“压缩视频...”消息。

为什么会这样?

有什么办法可以避免这种压缩操作吗?

答案

答:目前无法控制UIImagePickerController如何压缩拾取的视频。

我刚做了一些快速测试。使用我创建的测试应用程序,我选择了相同的视频两次 - 一次将videoQuality属性设置为UIImagePickerControllerQualityTypeHigh,一次将其设置为UIImagePickerControllerQualityTypeLow。复制的结果文件大小完全相同,15.1MB,帧大小为360x480。原版为72.5MB,框架尺寸为480x640。显然,此属性不会影响所使用的压缩。

另一答案

将UIImagePickerController的videoQuality属性设置为“High”(UIImagePickerControllerQualityTypeHigh = 0)

从SDK文档:“如果在图像选择器中显示录制的电影,则指定您不希望降低电影的视频质量。”

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html#//apple_ref/doc/c_ref/UIImagePickerControllerQualityType

另一答案

由于使用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 数据源一起使用

无法使用 UIImagePickerController 定位图像

iOS SDK - 使用 UIImagePickerController 时如何恢复状态栏?