录制时在iPhone上切换相机

马里亚诺·阿卜杜拉(Mariano Abdala)

不久前,有人问我是否可以在iPhone上从前向后切换相机时连续录制视频。 标准相机应用程序或标准相机控件均不允许这种行为,但是我怀疑我们可以使用定制解决方案来做到这一点。

作为概念验证,我的方法是,每当用户要切换时,我都会停止在一个摄像机上进行录制,而在另一个摄像机上开始录制。 录制完成后,我便将视频拼接在一起。 这不是最优雅的解决方案:从一台摄像机切换到另一台摄像机留出很小的空隙,最后的拼接步骤需要一段时间才能完成。 尽管如此,对于我的用例来说已经足够了,所以让我们对其进行更详细的研究。

该示例应用程序将包含两个主要组件,一个用于记录,一个用于缝合。 录音可能是最简单的录音。 如果我们可以从前置摄像头录制,也可以从后置摄像头录制,则可以交替录制。 这意味着设置两个不同的AVCaptureSession ,它们仅在AVCaptureDevice.Position.back.front )上有所不同。 然后管理屏幕状态,并将输出设置到一个临时文件夹,为视频加上时间戳,以便我们以后可以轻松列出正确排序的视频。

然后是拼接,或更确切地说是编辑 。 iOS中的视频编辑功能非常强大,但是很容易失去其所有功能和配置范围。 主要入口是AVMutableComposition ,您可以在其中添加AVMutableComposition轨道(音频或视频),然后可以在这些轨道上添加AVAsset ,后者可以是音频或视频文件,并使用音量,大小和大小对其进行配置。转换(例如缩放,旋转等)。

让我们看一下添加两个主要音轨的样子:

对于本练习,配置非常简单。 遍历临时文件夹中的所有文件,并将音频和视频资产按顺序添加到音频和视频轨道,然后配置最小大小(因为前后摄像头具有不同的分辨率)并旋转视频以使其保持纵向模式。

现在,我们已经按照指令配置了所有输出轨道,让我们使用AVAssetExportSession将它们导出到视频文件中,并进行一些其他配置:

…最后,是:导出,并且可以播放了

尽管此方法表明仅通过轻按翻转按钮就可以在同一会话中继续记录是可行的,但它的缺点是在切换相机时会有间隙。 在我对iPhone 6的测试中,差距约为1.5秒。 这可能适合您的用例,也可能不足。

在致力于构建完善的解决方案之前,我们还可以测试其他更优雅的方法。

  • 始终保持两个AVCaptureSession处于活动状态。 只需显示或记录适当的内容即可。 尽管这大大减少这种差距,但肯定会增加电池消耗,这对于长时间的录制会话来说是不明智的。
  • 从单个AVCaptureSession添加和删​​除前后摄像头的AVCaptureSession 。 这种方法似乎是最简单的方法,并且API允许它使用,但我找不到能做到这一点的示例。 取而代之的是,大多数示例都将通过切换摄像机创建一个新会话,我怀疑这是有充分理由的。
  • 第三个连续的AVCaptureSession用于音频,该音频不会翻转或切换或更改输入设备。 这不会阻止视频间隙,但是会通过提供真正恒定的音频来提供真正的连续感。 然后,最困难的部分将是找到一种音频和视频同步的方法,但是由于来自三个来源(前,后和连续音频)的声音是相同的,因此无需任何用户交互就可以做到这一点。 。
  • 不必立即停止活动的摄像机,而要在新创建的AVCaptureSession上注意符合KVO的isRunning属性。 方便了,使旧的会话保持活动状态,直到新会话启动并运行为止。 这不会完全消除差距,甚至可能会引入一些重叠。 我们需要更多的研究来支持这一说法。

虽然我们似乎无法完全避免视频间隙,但可以通过添加过渡效果(例如模糊,淡入淡出等)来填补这些空白,从而减轻视频间隙或使其无意通过。

我期待深入探讨此问题,因为它显然是iOS工具集上缺少的东西,并且可以为每个人的利益而组成。


最初于 2018 年3月13日 发布在 bits.citrusbyte.com