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

问题描述 投票:18回答:5

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

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

为什么会这样?

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

iphone video compression uiimagepickercontroller movie
5个回答
16
投票

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

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


4
投票

将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


3
投票

由于使用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);
}];

0
投票

对于那些提供使用videoQuality属性的建议的人,文档清楚地说明它是一个视频捕获选项,而不是选择器选项。

正如杰克在下面提到的那样,它也用于转码。看起来我读得太快,因为我没有注意到转码提及。


0
投票

从iOS 11开始,您可以指定videoExportPreset并将其设置为AVAssetExportPresetPassthrough

picker.videoExportPreset = AVAssetExportPresetPassthrough

这仍将显示“压缩”进度条,但会更快,特别是对于较小的视频。

© www.soinside.com 2019 - 2024. All rights reserved.