18

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

我可以将此叠加UIView对象添加到 VideoPreviewLayer,但我正在努力如何在录制的视频上获得相同的视图。UIView这可能包含从UILabels 到UIImageViews 的任何内容。

4

4 回答 4

10

我不确定这是否是您正在寻找的东西,但我想您可以使用 Brad Larson 的 GPU 库,有一个名为 GPUImageElement 的类可让您添加叠加层和视图。请查看示例,尤其是名为 Filter 展示的示例并滚动到一个叫做 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];
            }];
        }
于 2013-09-05T12:53:28.497 回答
6

您想要覆盖UIView's,但如果您不介意使用s,您可以在使用'属性CALayer导出后添加覆盖。它有一个属性,可以让你在输出中添加动画,但我认为如果你的叠加层的外观不能用. 您的显示标题示例可能是可能的,尽管我想像当前时间计数器这样简单的东西不会。如果您可以接受此限制,WWDC 2010 代码示例“AVEditDemo”是一个很好的起点。AVAssetExportSessionAVVideoCompositionAVVideoCompositionCoreAnimationTool *animationToolCALayerCABasicAnimation

如果您需要更多控制,您可以手动将叠加层渲染UIView到捕获帧上,使用[view.layer renderInContext:contextToThenRenderToFrame]然后将这些帧写入文件使用AVAssetWriter(一旦将帧捕获到内存,您就不能再使用了AVCaptureMovieFileOutput)。

警告:您正在捕获的帧可能不会以统一的速率到达,并且取决于环境照明甚至系统负载。如果您的叠加层以比捕获视频更高的速率变化,那么您将需要在第二种解决方案中重复帧。这是AVVideoComposition在第一个解决方案中为您处理的。

PS 解决方案二很繁琐,但不详细说明,iOS7 似乎让这变得容易了很多。

于 2013-09-02T05:42:30.530 回答
1

您可以在编辑部分 的 AVFoundation Programming Guide 中找到它

有一个部分处理图像的叠加。我将尝试放置一个示例代码/项目。

于 2013-09-05T14:03:51.080 回答
0

要找出您的问题,在 raywenderlich 教程网站上有两个非常详细的解释。这是一个两部分的教程。

第一个在这里:http ://www.raywenderlich.com/13418/how-to-play-record-edit-videos-in-ios

第二个在这里: http ://www.raywenderlich.com/30200/avfoundation-tutorial-adding-overlays-and-animations-to-videos

祝你好运,希望这能帮到你!!

于 2013-09-06T01:44:33.270 回答