iOS相机预览帧时长不稳定:如何实现33.3ms稳定显示?
相机预览帧时长不稳定问题解决咨询
Apple提供的iOS示例项目AVCamFilter,使用MTKView渲染相机预览。当前遇到帧时长不稳定的问题:相机流固定30FPS输出(每33.3ms生成一帧),理论上单帧应稳定显示33.3ms,但实际多数时候显示时长为33.3ms,偶尔会变为16.7ms或50.1ms。
根据文档,MTKView默认以60FPS(每16.7ms绘制一帧)渲染屏幕,因此每个相机帧本该被绘制两次后才被下一帧替换。问题根源在于MTKView的绘制循环与相机的捕获循环未同步:两者的时间差会逐渐偏移,导致相机帧有时在绘制前捕获,有时在绘制后捕获,进而出现部分帧被绘制3次或1次(而非预期的2次)。
尝试过禁用MTKView默认行为,在新相机帧到达时手动调用draw(),虽能同步MTKView与相机,但未与设备自身60FPS的显示循环同步,核心时序问题依然存在。已知CADisplayLink用于同步显示相关操作,但无法直接用于捕获流。
请问如何实现相机预览33.3ms的稳定帧时长?这种不稳定现象是否属于预期行为,没有解决办法?
补充说明
对AVCamFilter项目在不同MTKView设置下的行为观察:所有场景中,相机帧的总显示时长(frame duration * draws per frame)均无法稳定在33.3ms:
- 原始代码:帧时长为16.7ms,每帧绘制次数为1、2或3;
- 设置
preferredFramesPerSecond = 30:帧时长多为33.3ms,偶尔出现16.7ms或50.1ms,每帧绘制次数为1或2,频繁出现帧被丢弃(覆盖); - 上述设置基础上添加
commandBuffer.present(drawable, afterMinimumDuration: 1.0 / 30.0):帧时长为33.3ms,每帧绘制次数为1或2,偶尔出现帧被丢弃(覆盖); - 设置
isPaused = true,新相机帧到达时手动调用draw():帧时长为16.7ms、33.3ms、50.1ms或66.9ms,每帧绘制次数为1; - 上述设置基础上添加
commandBuffer.present(drawable, afterMinimumDuration: 1.0 / 30.0):帧时长为33.3ms、50.1ms或66.9ms,每帧绘制次数为1。
内容的提问来源于stack exchange,提问作者bd1170
相关产品推荐
相关产品推荐

