一台 iPhone 同时调用前置和后置摄像头录像,听起来像是第三方 App 才能做到的黑科技。事实上,从 iOS 13 开始,苹果就给开发者提供了 AVCaptureMultiCamSession 这个多摄 API,A12 芯片及以上的机型全都支持。真正离谱的是:苹果自己的相机 App 至今没有双录模式,没有开关,也没有隐藏手势。
这不是你绕过某个设置就能解决的问题。iOS 里有两套完全不同的逻辑:普通的 AVCaptureSession 同一时刻只能跑一个摄像头,可以在前后摄之间切换;而多摄会话 AVCaptureMultiCamSession 可以同时跑多个输入。后者是另一个对象,规则完全不同。你以前熟悉的那套玩法,套到多摄上几乎全废。
我们在一款正式上线的双录相机里,把这些坑一个个踩了一遍。下面是真实代价。
先说目标:你只想产出一个 MP4 文件,里面同时包含前后两路画面,实时合成,并且预览画面必须和最终文件一致。听起来就是常规操作:两个输入、两个输出、一个合成器、一个 AVAssetWriter。但按照老办法写,addInput 和 addOutput 会直接失败。
为什么?因为便捷 API 会隐式帮你建立连接。在多摄会话里,这是行不通的。你必须用 addInputWithNoConnections 和 addOutputWithNoConnections 添加输入输出,然后手动创建 AVCaptureConnection 来连接端口和输出。
具体的代码长这样:一个方法接收设备、输出对象和镜像参数,先创建 AVCaptureDeviceInput,判断 session 是否接受,再以无连接方式加入输入输出。然后把像素格式设为 32BGRA,把 alwaysDiscardsLateVideoFrames 设为 true,避免积压帧。最后从输入端口里找到视频端口,用 AVCaptureConnection 手动绑定到输出上。到此,第一条分支才算接好。
这还只是第一步。第二路摄像头需要重复一遍同样的流程,而且两路的分辨率、帧率、像素格式必须协调。否则合成器要么丢帧,要么时间戳对不齐,最终视频音画不同步。
更麻烦的是预览层。普通会话里,AVCaptureVideoPreviewLayer 直接绑 session 就行。多摄会话里,你要为每一路单独建一个预览层,再手动拼成画中画或分屏。如果想在预览上显示最终合成效果,你得把采集到的像素缓冲交给 Metal 做实时合成,再把合成结果同时喂给预览和 AVAssetWriter。任何一个环节的时序错位,都会让预览和文件不一致。
这些坑不是文档里随便写写,而是每一条都会让你多花几天调试。最讽刺的是,苹果的 AVCaptureMultiCamSession 从 iOS 13 活到了现在,A12 设备也跑得好好的,官方却没有一个自带入口。第三方开发者只能靠猜和试错,把本该是系统功能的东西拼出来。所以下次有人说“iPhone 双录早就能用了”,你可以把这篇甩给他:硬件能,SDK 能,苹果就是不做。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.