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

时间:2014-08-25 19:22:23

标签: ios animation video avfoundation

我正在开发一款iPhone应用程序,但我遇到了AVFoundation API的问题;我已经习惯了大量的图像处理,只是想象一下我可以访问图像缓冲区;但视频API却截然不同。

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

我认为AVMutableVideoComposition是一个很好的方法;但事实证明,动画工具AVVideoCompositionCoreAnimationTool需要一种特殊的CALayer动画。它支持具有空间变换,缩放,渐变等基本功能的动画 - 但我的动画已经完成了一系列PNGS。

这可能与AVFoundation有关吗?如果是,推荐的流程是什么?

3 个答案:

答案 0 :(得分:0)

我认为您应该使用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;

答案 1 :(得分:0)

我会将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

答案 2 :(得分:0)

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