AVVideoPreviewLayer保留4:3相机最大分辨率时黑条置底的实现咨询
解答
认知正误确认
你对AVLayerVideoGravityResizeAspectFill的认知是部分准确的:
- 该枚举值的作用仅修改预览层的展示规则,本身不会修改AVCaptureSession配置的采集分辨率,只要你session preset固定为4:3最大分辨率,采集到的buffer始终是完整4:3分辨率。
- 如果你需要预览层完整展示全部4:3采集内容,使用
.resizeAspectFill确实不符合需求,该模式会裁剪掉左右两侧的内容来填满全屏预览层,你只能看到中间裁剪后的部分内容。
顶对齐仅底部留黑边的实现方案
有两种常用的实现方式,均不会修改采集分辨率,可完整保留4:3最大采集流:
方案1:直接调整预览层frame
按4:3比例计算预览层高度,固定顶部对齐,底部超出的屏幕区域自然显示为父视图背景即可:
let screenBounds = UIScreen.main.bounds // 竖屏场景下4:3内容的高度计算,横屏场景可自行按比例调整计算逻辑 let previewHeight = screenBounds.width * 4 / 3 previewLayer.frame = CGRect(x: 0, y: 0, width: screenBounds.width, height: previewHeight) previewLayer.videoGravity = .resizeAspect
方案2:调整contentsRect属性
如果需要保留预览层全屏frame的前提下,可修改contentsRect实现内容偏移:
previewLayer.frame = UIScreen.main.bounds previewLayer.videoGravity = .resizeAspect let screenRatio = UIScreen.main.bounds.height / UIScreen.main.bounds.width let contentRatio = 4.0 / 3.0 let contentHeightScale = 1 / (screenRatio / contentRatio) previewLayer.contentsRect = CGRect(x: 0, y: 0, width: 1, height: contentHeightScale)
注意事项
- 需提前设置
previewLayer.connection?.videoOrientation和当前设备方向保持一致,避免比例计算错误 - 确保AVCaptureSession的preset固定为4:3最大分辨率档位(如
.photo预设)即可保证采集流分辨率不变
内容的提问来源于stack exchange,提问作者Kapil
相关产品推荐
相关产品推荐

