同时录制叠加视频的方法(AVFoundation iOS)

18

我已经完全设置了使用AVFoundation框架进行视频录制的能力,这一切都很好,但是现在我想在录制过程中添加一个叠加层(也可见于AVCaptureVideoPreviewLayer层)

我可以将此覆盖层的UIView对象添加到VideoPreviewLayer,但我不知道如何使相同的视图出现在录制的视频上。 这个UIView可以包含任何东西,从UILabelUIImageView


2
嗯,好问题。我认为你需要添加一个层而不是添加一个视图。也许还涉及将叠加层合成到视频输入上。我会思考一下... - Cocoadelica
为什么不在捕获完成后将你的UIView添加为水印呢?这里有一个相关的问题https://dev59.com/wWUo5IYBdhLWcg3wkQNq - Gabriele Petronella
@GabrielePetronella 不需要在录制时添加时间和其他数据。这不是水印。例如,在该帧上添加设备标题等。 - theiOSDude
然后这个答案给出了一些如何继续的指针。您需要提取帧并将它们写回输出缓冲区。https://dev59.com/6Ww05IYBdhLWcg3wfx40 - Gabriele Petronella
@burrows111 我也卡在同样的功能上了。你能录制带有叠加层的视频吗? - iRoid Solutions
显示剩余5条评论
4个回答

10

我不确定这是否是你正在寻找的东西,但我猜你可以使用Brad Larson的GPU库,其中有一个名为GPUImageElement的类,它可以让你添加覆盖和视图。请查看示例,特别是称为Filter showcase的示例,并滚动到称为UIElement的内容。

以下是一些示例代码:

 else if (filterType == GPUIMAGE_UIELEMENT)
        {
            GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
            blendFilter.mix = 1.0;

            NSDate *startTime = [NSDate date];

            UILabel *timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 240.0f, 320.0f)];
            timeLabel.font = [UIFont systemFontOfSize:17.0f];
            timeLabel.text = @"Time: 0.0 s";
            timeLabel.textAlignment = UITextAlignmentCenter;
            timeLabel.backgroundColor = [UIColor clearColor];
            timeLabel.textColor = [UIColor whiteColor];

            uiElementInput = [[GPUImageUIElement alloc] initWithView:timeLabel];

            [filter addTarget:blendFilter];
            [uiElementInput addTarget:blendFilter];

            [blendFilter addTarget:filterView];

            __unsafe_unretained GPUImageUIElement *weakUIElementInput = uiElementInput;

            [filter setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){
                timeLabel.text = [NSString stringWithFormat:@"Time: %f s", -[startTime timeIntervalSinceNow]];
                [weakUIElementInput update];
            }];
        }

好的,我现在开始尝试,完成后会告诉你!谢谢 - theiOSDude
不错的发现伙计,它让我走上了正确的道路!谢谢你。 - theiOSDude
我正在通过增加值来记录用户在视图中的触摸和点击。有没有可能也记录该视图? - Muruganandham K
如何记录动态标签,其中文本不断变化? - Yaroslav Dukal

6
您想要叠加UIView,但如果您不介意使用CALayer,则可以在导出后使用AVAssetExportSessionAVVideoComposition属性添加覆盖层。它有一个属性AVVideoCompositionCoreAnimationTool *animationTool,可让您将动画CALayer添加到输出中,尽管我认为如果您的覆盖层外观无法由CABasicAnimation描述,则会失去运气。您提供的显示标题的示例可能是可能的,但我想像当前时间计数器这样简单的东西可能不行。如果您可以接受此限制,则WWDC 2010代码示例“AVEditDemo”是一个很好的起点。
如果需要更多控制,则可以手动将覆盖UIView渲染到捕获帧上,使用[view.layer renderInContext:contextToThenRenderToFrame],然后使用AVAssetWriter将这些帧写入文件(一旦您将帧捕获到内存中,您将无法再使用AVCaptureMovieFileOutput)。
警告:您捕获的帧可能不以统一速率到达,并且取决于环境光线甚至系统负载。如果您的覆盖层更改速度高于捕获视频,则需要在第二个解决方案中重复帧。这由第一个解决方案中的AVVideoComposition为您处理。
附:第二种解决方案有点棘手,但不详细说明,iOS7似乎已经使其变得更加容易。

1

您可以在AVFoundation编程指南的编辑部分找到它。

有一个部分涉及图像叠加。我将尝试发布示例代码/项目。


请注意,仅链接答案是不被鼓励的,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的摘要,将链接作为参考。 - kleopatra

0

1
谢谢,这些教程只展示了在我完成录制后如何进行操作,但我需要在录制时就进行操作(即在那一帧设备朝向)。 - theiOSDude
好的。我发现苹果开发者文档非常有帮助。以下是AVFoundation的文档链接:https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/00_Introduction.html 希望这个能帮到你! - PoKoBros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接