如何在视频之上叠加不同的 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】:我认为你应该使用UIImageView
和animationImages
:
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 通道动画?的主要内容,如果未能解决你的问题,请参考以下文章