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

Iphone 使用UIImagePickerController选择电影时避免视频压缩?,iphone,video,compression,uiimagepickercontroller,movie,Iphone,Video,Compression,Uiimagepickercontroller,Movie,我使用UIImagePickerController允许用户从资源库中选择视频 当用户选择第二个屏幕上的“选择”按钮时,视图将显示进度条和压缩视频。。。信息 为什么会这样 有什么方法可以避免这种压缩操作吗 将UIImagePickerController的videoQuality属性设置为High UIImagePickerController QualityTypeHigh=0 从SDK文档中: 如果在图像选择器中显示录制的电影,则指定不希望降低电影的视频质量 答:目前无法控制UIImageP

我使用UIImagePickerController允许用户从资源库中选择视频

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

为什么会这样

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

将UIImagePickerController的videoQuality属性设置为High UIImagePickerController QualityTypeHigh=0

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


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

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

对于那些建议使用videoQuality属性的人,文档中明确指出它是一个视频捕获选项,而不是选择器选项


正如Jack在下面提到的,它也是用于转码的。看起来我读文档读得太快了,因为我没有注意到转码的内容。

由于还没有办法避免使用UIImagePickerController进行压缩,我想介绍一些如何创建自己的图像选择器以避免压缩的想法

这将允许访问原始视频文件:

iOS 8

查看PhotoKit文档以访问收藏瞬间和其他选项

以下是一个使用PhotoKit的苹果示例应用程序,可以修改为一个照片采集器:

GitHub上有一个photo picker库,它使用的PhotoKit看起来很有前途,因为它为您提供了所有选定图像/视频的Phaset对象:

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:


这仍然会显示压缩进度条,但速度会快得多,尤其是对于较小的视频。

仍然没有找到解决方案。有人有什么想法吗?看看下面我的答案。开发人员似乎不能影响压缩。Avalancis-这是两年前回答的。有可能被接受吗?我也有同样的问题。有人知道是否有其他方法可以不使用UIImagePickerController导入视频以避免压缩吗?看起来在iPhone 4上,即使设置为高,它仍然会压缩,但质量比默认值要好得多。我可以理解为什么他们会压缩在高,因为原来的720p视频编码超过10兆位/秒!我也有类似的发现,甚至将其设置为高会导致一些压缩和“压缩视频”对话框。在UIImagePickerControllerQualityTypeHigh的文档中,最后一行表示:如果在图像选择器中显示录制的电影,则指定不希望降低电影的视频质量。。这似乎表明,对于拾取视频而不是录制视频,此属性会影响它们在图像选择器的编辑屏幕中的显示方式。我只是做了一些快速测试。我选了两次相同的视频,一次是QualityTypeHigh,一次是QualityTypeLow。复制的结果文件大小完全相同,15.1MB,帧大小为360x480,而原始文件为72.5MB,帧大小为480x640。显然,这个属性根本不影响使用的压缩。在iPhone4S上也有同样的问题。1080p视频压缩到720p。有人知道iphone5上是否也会发生这种情况吗?有什么消息吗?我非常感谢用户在选择上传视频时不必等待压缩对话框。我同意。你最好的办法是向苹果公司提交一份雷达文件。一年后的今天,一切都没有改变——iOS 6仍然不允许直接导入媒体URL:@Answerbot我完全同意。我也试过其他的质量,但它根本不会影响结果。文件上说录像和转码的质量。
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);
}];
picker.videoExportPreset = AVAssetExportPresetPassthrough