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

Dev*_*e26 22 iphone uiimagepickercontroller

我正在使用UIImagePickerController从Gallery中选择视频并压缩该视频.我想禁用压缩但我找不到这样做的方法.我也尝试使用ELCImagePickerController它显示视频,但它看起来像一个图像,只有没有视频图标或持续时间,就像在UIImagePickercontroller中显示的那样.我可以这样做吗?

谢谢.

jDu*_*ton 19

使用UIImagePickerController看起来不可能避免压缩.看到这个答案:

/sf/answers/412514651/

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

编辑:

但是,你可以自己动手.这将允许访问原始视频文件:

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
    }];
}
Run Code Online (Sandbox Code Playgroud)

查看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);
}];
Run Code Online (Sandbox Code Playgroud)


Jan*_*Jan 19

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

if #available(iOS 11.0, *) {
    picker.videoExportPreset = AVAssetExportPresetPassthrough
}
Run Code Online (Sandbox Code Playgroud)

"Video compression ..."标签只闪烁几毫秒然后导出完成.

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

  • 添加此代码后,其操作仍相同。 (2认同)

小智 7

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

- (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.
            }   
        }]; 
    }
}
Run Code Online (Sandbox Code Playgroud)

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