如何将通过UIImagePicker调用的原生相机拍摄质量调整为4K?
现有代码问题根源
UIImagePickerController的videoQuality属性的.typeHigh枚举值并未绑定4K分辨率,在绝大多数iOS设备上该值默认对应1920x1080/30fps的视频规格,无法通过该参数直接触发4K录制。- 从iOS 13开始
videoExportPreset正式被弃用,系统不再响应该属性的配置,所以你原来设置AVAssetExportPreset3840x2160的逻辑完全无效。
解决方案
方案一:依赖系统配置的UIImagePicker兼容方案
仅作为临时过渡方案,可控性极低:
- 引导用户提前在系统「设置-相机-录制视频」选项中,手动选择4K分辨率的录制规格,
UIImagePicker默认会复用系统相机的全局配置,此时再使用.typeHigh参数有可能拿到4K视频。 - 该方案完全依赖用户的系统设置,无法保证所有用户都能输出4K视频,仅适合小范围内部测试使用。
方案二:使用AVFoundation自定义相机(推荐)
这是实现稳定4K录制的唯一可靠方案,完全可控不受系统全局配置影响,实现步骤如下:
- 首先导入
AVFoundation框架,创建AVCaptureSession实例,指定会话预设为4K规格:
let captureSession = AVCaptureSession() // 优先设置4K预设 if captureSession.canSetSessionPreset(.hd4K3840x2160) { captureSession.sessionPreset = .hd4K3840x2160 } else { // 设备不支持4K时降级到1080P captureSession.sessionPreset = .hd1920x1080 }
- 配置相机输入、音频输入:获取后置/前置相机设备,创建
AVCaptureDeviceInput实例,添加到会话中,同时添加音频输入实现有声录制。 - 添加输出源:如果需要直接录制视频文件,使用
AVCaptureMovieFileOutput作为输出,可直接输出指定分辨率的视频文件;如果需要逐帧处理画面,使用AVCaptureVideoDataOutput。 - 配置预览层:创建
AVCaptureVideoPreviewLayer绑定到会话,添加到你的自定义界面的View层上,实现拍摄画面实时预览。 - 自定义录制交互:自己实现开始录制、结束录制、切换摄像头等交互按钮,调用输出源对应的启停方法即可。
注意事项
- 提前在Info.plist中添加
NSCameraUsageDescription(相机权限)和NSMicrophoneUsageDescription(麦克风权限)的申请描述,否则应用会在调用相机时直接崩溃。 - 所有AVFoundation的会话配置、启停操作都建议放到子线程执行,避免阻塞主线程导致UI卡顿。
内容的提问来源于stack exchange,提问作者Ellyn_Philip
相关产品推荐
相关产品推荐

