如何在 AVAssetExportSession 上正确导出位于 AVMutableComposition 顶部的 CALayer?

11
我知道这个问题之前已经被问过(例如这里这里),但我就是想不通我错在哪里了。
我有一个AVMutableComposition,用它来将一些视频剪辑与一些在其上动画的CALayer组合起来。
当我将我的AVMutableComposition与一个AVSynchronizedLayer结合起来,在AVPlayerLayer内播放时,一切都正常工作。视频正确显示,一切都按照应有的位置。
我的问题是,当我尝试导出这个东西时,我尝试使用AVVideoCompositionCoreAnimationTool而不是AVSynchronizedLayer(文档中说我们应该使用这个来导出),并使用AVAssetExportSession,但是某些东西出了问题,因为在我的导出电影中,每个CALayer都将它的坐标系统反转了。
因此,如果在播放期间,0,0点位于屏幕的左上角,那么在导出电影时,0,0点位于左下角,因此我的动画就会变得无法控制。
我阅读了所有可能的文章,还从Apple下载了AVVideoEdit示例,但我就是看不出是怎么回事...

如果你得到了答案,我很感兴趣。 - aLevelOfIndirection
我从来没有找到一个好的答案。我的做法是,在导出之前,我将包含动画的图层传递给我编写的自定义函数,该函数会递归地遍历所有子层并更改坐标... 这有点像黑客和丑陋的解决方案,但对我有用。 - Mihai Fratu
你能提供一些代码吗?我正在尝试做同样的事情,但无法完成 :( - Tim Specht
2个回答

22

如果有跟我遇到一样的问题的人,我终于找到了答案。每个CALayer都有一个名为geometryFlipped的属性,你需要在导出前将其设置为YES,然后一切就会没问题了。更多信息请看这里


为什么这是必要的? - Andy Hin

-1
Methods that fixing frames and points
- (CGRect) fixRect:(CGRect)rect inRect:(CGRect)container
{
    CGRect frame = rect;
    frame.origin.y = container.size.height - frame.origin.y - frame.size.height;
    return frame;
}
- (CGPoint) fixPoint:(CGPoint)point fromPoint:(CGSize)containerSize
{
    CGPoint frame = point;
    frame.y = containerSize.height - frame.y;
    return frame;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接