ios - AVFoundation 使用 customVideoCompositorClass 和 animationTool 导出

标签 ios ios7 core-animation avfoundation

我正在使用 AVFoundation 通过自定义视频合成器来编辑电影,但我似乎无法使用核心动画来实现这一点。播放效果很好,但当我尝试导出时,我得到了意想不到的结果。

我的代码是这样的:

AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
videoComposition.instructions = videoInstructions;
videoComposition.frameDuration = CMTimeMake(1, videoTrackA.naturalTimeScale);
videoComposition.renderSize = size;
videoComposition.customVideoCompositorClass = self.project.videoEdits.editClass;

if( isExport )
    videoComposition.animationTool = [self createAnimationToolForSize:size];

其中 createAnimationToolForSize:看起来像这样:

-(AVVideoCompositionCoreAnimationTool *) createAnimationToolForSize:(CGSize) size
{
    CATextLayer *titleLayer = [CATextLayer layer];
    titleLayer.string = @"Text goes here";
    titleLayer.font = (__bridge CFTypeRef)(@"Helvetica");
    titleLayer.fontSize = size.height / 20;
    titleLayer.cornerRadius = size.height / 50;
    titleLayer.foregroundColor = [UIColor blackColor].CGColor;
    titleLayer.backgroundColor = [UIColor whiteColor].CGColor;
    titleLayer.frame = CGRectMake(size.width/4, size.height/4, size.width/2, size.height/2 );
    titleLayer.opacity = .5;

    //CALayer *parentLayer = [CALayer layer];
    //CALayer *videoLayer = [CALayer layer];
    //parentLayer.frame = CGRectMake(0, 0, size.width, size.height);
    //videoLayer.frame = CGRectMake(0, 0, size.width, size.height);
    //[parentLayer addSublayer:videoLayer];
    //[parentLayer addSublayer:titleLayer];

    //return [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];

    return [AVVideoCompositionCoreAnimationTool
        videoCompositionCoreAnimationToolWithAdditionalLayer:
        titleLayer
        asTrackID:2];
}

所写的代码导出了一个黑色背景和一个没有文本的白色圆角矩形的视频。原本应该在背景中看到的原始视频,在边缘附近是不可见的。

如果我用注释行替换最后一行,我只会得到没有动画的原始图像。

是否可以同时获取电影和动画(包括文字)?难道我做错了什么?我是否需要以某种方式考虑我的合成器中的动画层,或者这是一个阻止您在 AVFoundation 中将 core animation 与自定义合成器一起使用的错误?

最佳答案

如果我为它创建一个新轨道,我能够让动画显示,但是我的自定义渲染器需要能够处理不同数量的轨道(n 在实时渲染时,因为动画在 CALayer 中,与电影和导出时 n+1 分开,因为该层现在作为轨道存在)。这当然是可行的,即使它很复杂,但它留下了一些 Unresolved 问题:例如,我从来没有弄清楚为什么我的文本没有显示在我的 CATextLayer 中。

因此,即使我确实重写了我的代码,我也不清楚这个策略是否有效。

关于ios - AVFoundation 使用 customVideoCompositorClass 和 animationTool 导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23682147/

相关文章:

ios - ARKit - 相对于世界原点在世界中定位一个节点

iphone - 跟踪 UIButton 上的手指触摸并执行它的操作

ios - 以程序方式动画化 2D 植物的生长

objective-c - objective-c : CGAffineTransformMakeRotation

ios - 带圆点的动画线图

ios - 在 initWithCoder 中设置 UIImageView 框架

ios - Swift:除了单例,还有什么其他方式来存储 currentUser?

ios - drawViewHierachyInRect 以错误的方向绘制 iPad

ios - 可以从我的应用程序iOS 7中打开“联系人”应用程序

ios - BarButtonItem 上的箭头