我正在开发一款iPhone应用程序,但我遇到了AVFoundation API的问题;我已经习惯了大量的图像处理,只是想象一下我可以访问图像缓冲区;但视频API却截然不同。
我想拍摄30帧/秒的动画,该动画是以带有透明度通道的PNG生成的,并将其叠加到AVMutableComposition内合成的任意数量的视频剪辑上。
我认为AVMutableVideoComposition是一个很好的方法;但事实证明,动画工具AVVideoCompositionCoreAnimationTool需要一种特殊的CALayer动画。它支持具有空间变换,缩放,渐变等基本功能的动画 - 但我的动画已经完成了一系列PNGS。
这可能与AVFoundation有关吗?如果是,推荐的流程是什么?
答案 0 :(得分:0)
我认为您应该使用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;
答案 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)