ios - 使用动画 UIView 覆盖从相机录制视频

标签 ios objective-c avfoundation

我目前有一台摄像机设置了一个 AVCaptureVideoDataOutput,其示例缓冲区委托(delegate)是这样实现的:

- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection
{
    NSArray *detectedFaces = [self detectFacesFromSampleBuffer:sampleBuffer];
    [self animateViewsForFaces:detectedFaces];
}

样本缓冲区被处理,如果检测到任何面孔,它们的边界将显示为 AVCaptureVideoPreviewLayer 的 View ,该层显示实时视频输出(面孔上方的矩形)。 View 是动画的,因此它们在面部检测之间平滑移动。是否有可能以某种方式记录预览层中显示的内容并将其与覆盖它的动画 UIView 合并,最终结果是一个视频文件?

最佳答案

通常,您可以使用低级方法制作视频流,然后将其写入文件。我不是视频格式、编解码器等方面的专家,但方法是:

— 设置 CADisplayLink用于在屏幕重绘的每一帧触发回调。也许好的决定是将帧间隔设置为 2,以将目标视频帧速率降低到 ~30 fps。

— 每次屏幕重绘需要一个 snapshot预览层和叠加层。

— 处理收集的图像:压缩一帧的每两个图像,然后从合并的帧序列中制作视频流。我假设,iOS 具有内置工具,可或多或少地以简单的方式执行此操作。

当然,分辨率和质量受图层参数的限制。如果您需要来自相机的原始视频流,您应该捕获该流,然后直接在您捕获的视频帧中绘制叠加数据。

关于ios - 使用动画 UIView 覆盖从相机录制视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38108956/

相关文章:

ios - 无法将字符串传递给另一个 Controller

ios - 加载 ViewController 时 UISlider 的 AVPlayer currentTime 更新

ios - 是否可以在 iOS 中访问扬声器输出?

ios - 在 NSString 中添加空格?

ios - UIAlert Controller 上的图标

ios - 我的两个词应用程序名称显示为一个词

ios - UIImagePickerController 不调用委托(delegate)方法

ios - UIButton - 带图标的引导文本

ios - 从 AVAssetImageGenerator 生成图像在不同时间提供相同的图像副本

ios - 检查 CMTime 是否在 CMTimeRange 中