UIImagePickerController返回H.265而不是H.264

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

我有一个使用UIImagePickerController对象获取视频文件进行共享的应用程序。

我正在设置媒体类型(picker.mediaTypes = [kUTTypeMovie as String])并使用字段UIImagePickerControllerMediaURL来获取视频详细信息。这可以正常工作,并且当所有设备都是H.264实时编码或所有设备都是H.265实时解码时都没有问题。

问题是我需要支持无法播放H.265内容的设备。我想采取“创建单一兼容文件”的路线。无论录音设备的功能如何,我如何告诉UIImagePickerController给我一个H.264视频?

ios swift ios11
1个回答
1
投票

这对我有用。我使用AVAssetExportSession来获得以H.264格式导出的H.265视频。

也许上面的解决方案可以通过选择AVAssetExportPresetHighestQuality作为UIImagePickerController的videoExportPreset属性来实现。我的方法的奖金是iOS 9/10兼容性。也许是一个更快捷的用户界面,因为你可以在后台线程上进行导出。

我不能使用UIImagePickerController,因为我的应用程序中的相同选择器工作流允许用户选择倍数,所以我使用CTAssetsPickerController,这需要使用PHAsset返回媒体对象。

Ezekiel和nathan的讨论使我得到了这个解决方案,所以在这里分享。

PHAsset *phasset = <fetched-asset>;
NSURL *assetURL = <where-to-store-exported-asset>;

if(PHAssetMediaTypeVideo == phasset.mediaType) {
    [[PHImageManager defaultManager] requestAVAssetForVideo: phasset
        options: nil resultHandler:^(AVAsset * _Nullable avasset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
        AVAssetExportSession *exportSession =
            [AVAssetExportSession exportSessionWithAsset: avasset presetName: AVAssetExportPresetHighestQuality];
        exportSession.outputURL = assetURL;
        exportSession.outputFileType = AVFileTypeMPEG4;
        [exportSession exportAsynchronouslyWithCompletionHandler:^{
            if(exportSession.status == AVAssetExportSessionStatusCompleted) {
                //
                // success!
                //
            }
        }];
    }];
}
© www.soinside.com 2019 - 2024. All rights reserved.