最近遇到一个 bug,场景是这样的:

应用中有两个相机相关的页面,直播页和直播封面拍摄页(两个页面相机实例不是同一个),进入直播页时,设置了 preset1(16:9),点击进入封面拍摄,会使用 preset2(4:3)。如果直播页和封面拍摄页的摄像头位置一致,从封面拍摄页返回到直播页时,会导致相机输出的画面内容变形。后面断点查看,在摄像头位置一致的情况下,从封面拍摄页返回到直播页时,直播页 AVCaptureSessionpreset 变为了 AVCaptureSessionPresetInputPriority ,而不再是之前的设置的 preset1

通过官方文档以及 Google 出的资料,AVCaptureSessionPresetInputPriority 代表 capture session 不去控制音频与视频输出设置。而是通过已连接的捕获设备的 activeFormat 来反过来控制 capture session 的输出质量等级。放到我们上面的场景,也就是最终回到直播拍摄页时,preset 变成了封面拍摄时的 preset(即 4:3preset2 ),进而导致了输出画面变形。其实想想也对,设备全局是同一个摄像头,上一次的更改的参数值,应该是会被保留到下一次的,所以下一次在用之前最好做一次判断是否要重新设值。

解决方案就是每次相机页面 viewDidAppear 的时候判断一下 captureSessionpreset 和预设的值是否一致,不一致,再设回来即可。

以上,如有错误,欢迎指出,一起交流探讨。

参考链接:http://t.cn/R8fAZ37