首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ios中从UIImagePickerController中选择视频后如何避免压缩

在ios中从UIImagePickerController中选择视频后如何避免压缩
EN

Stack Overflow用户
提问于 2013-11-25 11:00:43
回答 4查看 16.8K关注 0票数 25

我正在使用UIImagePickerController从图片库选择视频,它压缩视频,我想禁用压缩,但我找不到办法做到这一点。我也尝试了ELCImagePickerController,它显示视频,但它看起来像一个图像,只有没有视频图标或持续时间,就像它在UIImagePickercontroller.How中显示的那样,我能做到吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-06 13:15:12

使用iOS 11,您可以将属性videoExportPreset设置为AVAssetExportPresetPassthrough以获得原始的:

代码语言:javascript
运行
复制
if #available(iOS 11.0, *) {
    picker.videoExportPreset = AVAssetExportPresetPassthrough
}

“视频压缩”标签只闪烁几毫秒,然后导出就完成了。

@Diego Renau几乎得到了正确的答案。

票数 30
EN

Stack Overflow用户

发布于 2014-03-08 20:04:53

看起来不可能避免使用UIImagePickerController进行压缩。见这个答案:

https://stackoverflow.com/a/5893066/406152

我尝试过使用imagePicker.videoQuality = UIImagePickerControllerQualityTypeHigh;,但它仍然可以进行压缩。呃。

编辑:

然而,你可以自己滚。这将允许访问原始视频文件:

iOS 8

代码语言:javascript
运行
复制
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文档。

下面是苹果使用PhotoKit的一个示例应用程序,可以修改为照片选择器:https://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html

下面是GitHub上的一个照片选择程序库,它使用看起来很有前途的PhotoKit,因为它为所有选定的图像/视频提供了PHAsset对象:https://github.com/guillermomuntaner/GMImagePicker

iOS 7及以下

代码语言:javascript
运行
复制
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);
}];
票数 19
EN

Stack Overflow用户

发布于 2016-09-01 07:47:59

实际上,您可以通过以下代码获得原始视频URL,非压缩版本:

代码语言:javascript
运行
复制
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    NSString *mediaType = info[UIImagePickerControllerMediaType];
    NSString *videoString = (NSString *)kUTTypeVideo;
    NSString *movieString = (NSString *)kUTTypeMovie;

    if ([mediaType isEqualToString:videoString] || [mediaType isEqualToString:movieString]) {
        NSURL *videoRef = info[UIImagePickerControllerReferenceURL];
        PHFetchResult *refResult = [PHAsset fetchAssetsWithALAssetURLs:@[videoRef] options:nil];                                                                                                                                        
        PHVideoRequestOptions *videoRequestOptions = [[PHVideoRequestOptions alloc] init];
        videoRequestOptions.version = PHVideoRequestOptionsVersionOriginal;
        [[PHImageManager defaultManager] requestAVAssetForVideo:[refResult firstObject] options:videoRequestOptions resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
            if ([asset isKindOfClass:[AVURLAsset class]]) {
                  NSURL *originURL = [(AVURLAsset *)asset URL];
                  // Now you have the URL of the original video.
            }   
        }]; 
    }
}

提醒您,requestAVAssetForVideo调用是异步的,因此,当您想要在方法调用块之外存储带有阻塞变量的url时,请小心。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20190485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档