如何在视频之上叠加不同的 Alpha 通道动画?

Posted

技术标签:

【中文标题】如何在视频之上叠加不同的 Alpha 通道动画?【英文标题】:How to layer a distinct alpha channel animation on top of video? 【发布时间】:2014-10-19 00:30:42 【问题描述】:

我正在开发一个 iphone 应用程序,但遇到了 AVFoundation API 的问题;我已经习惯了很多图像处理,只是想我可以访问图像缓冲区;但视频 API 完全不同。

我想拍摄一个 30 帧/秒的动画,该动画生成为具有透明通道的 PNG,并将其叠加到 AVMutableComposition 内合成的任意数量的视频剪辑上。

我认为 AVMutableVideoComposition 将是解决此问题的好方法;但事实证明,动画工具 AVVideoCompositionCoreAnimationTool 需要一种特殊的 CALayer 动画。它支持包含空间变换、缩放、褪色等基本内容的动画——但我的动画已经完成为一系列 PNGS。

这可以通过 AVFoundation 实现吗?如果是,推荐的流程是什么?

【问题讨论】:

【参考方案1】:

您需要将每组输入图像(背景和前景)压缩为单个像素缓冲区,然后将这些缓冲区一次编码为 H.264 视频一帧。请注意,这不会很快,因为创建 H.264 需要大量的内存写入和编码时间。您可以查看AVRender 以查看此处描述的方法的工作示例。如果您想推出自己的 impl,请查看此 tutorial,其中包含可以帮助您入门的源代码。

【讨论】:

【参考方案2】:

我会使用AVVideoCompositing 协议和AVAsynchronousVideoCompositionRequest。使用[AVAsynchronousVideoCompositionRequest sourceFrameByTrackID:] 获取视频帧的CVPixelBufferRef。然后根据您想要的时间使用适当的 png 创建一个CIImage。然后将视频帧渲染到GL_TEXTURE,将CIImage渲染到GL_TEXTURE,然后将这些全部绘制到您的目标CVPixelBufferRef,您应该会得到您想要的效果。

类似的东西:

CVPixelBufferRef foregroundPixelBuffer;
CIImage *appropriatePNG = [CIImage imageWithURL:pngURL];
[someCIContext render:appropriatePNG toCVPixelBuffer:foregroundPixelBuffer]

CVPixelBufferRef backgroundPixelBuffer = [asynchronousVideoRequest sourceFrameByTrackID:theTrackID];

//... GL Code for rendering using CVOpenGLESTextureCacheRef

【讨论】:

【参考方案3】:

我认为你应该使用UIImageViewanimationImages

UIImageView *anImageView = [[UIImageView alloc] initWithFrame:frame];
NSMutableArray *animationImages = [NSMutableArray array];
for (int i = 0; i < 500; i++) 
    [animationImages addObject:[UIImage imageNamed:[NSString stringWithFormat:@"image%d", i]]];

anImageView.animationImages = animationImages;
anImageView.animationDuration = 500/30;

【讨论】:

对 PNG 序列来说没问题。抱歉,我并不清楚我的意图,但目标是导出两者的视频合成。我可以很好地播放它们,但我需要以合理的文件大小保存它们,并且为了便于共享,它需要是标准资产格式(视频)。

以上是关于如何在视频之上叠加不同的 Alpha 通道动画?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 上视频的动画叠加

字节开源视频动画特效 SDKAlphaPlayer

ffmpeg:如何使用 ffmpeg 在视频中仅放置颜色叠加视频或应用不同类型的滤色器(如 instagram)

使用 maskView 设计动画

在其他视频之上叠加透明视频

VFW(Windows 视频)API 是不是支持 Alpha 通道透明度?