Final Cut Pro X效果插件开发总结
一、介绍
最近公司需要针对Final Cut Pro(FCP)开发一款效果插件,用于对公司自己开发的视频格式进行后期处理。Final Cut Pro是苹果公司推出的一款视频剪辑软件,因此需要在OSX平台上进行开发。目前最新版本的Final Cut Pro已经更名为Final Cut Pro X,因此也可简称FCPX。网络上针对FCPX的可用插件不少,但是相关的开发资料就显得非常匮乏,Google了半天都没找到定点信息。没办法,关键时刻还得去看看官方文档。寻寻觅觅终于还是发现了一些有用的信息。公司目前已经在Adobe Premiere Pro CC SDK的基础上开发了一款适用于Premiere Pro和After Effects的导入插件。因此,初步想法是在Final Cut Pro X上也开发一款类似的插件,用于实现自有视频格式的导入、播放、剪辑等功能。但是FCPX并没有提供类似的SDK,唯一找到的一个叫FxPlug的插件框架还是用来开发效果插件的。既然如此,就只好去使用FxPlug来尝试一下能否实现目标功能了。
Final Cut Pro是苹果公司开发的一款视频剪辑软件,因此需要在OS X平台上运行。开发前需要准备一台苹果电脑,并下载安装好Final Cut Pro及XCode。另外,在发布FxPlug之前还需要在Motion中进行处理才能让FCPX识别。Motion是苹果公司开发的另外一款效果编辑软件,类似于Adobe推出的After Effects。所以,还需要安装好Motion才能完整的配置好开发工具链。
二、FxPlug插件框架
FxPlug插件框架可以开发两种类型的插件:Filter和Generator。Filter(滤镜)需要有视频片段输入,在输入片段的基础上做视效处理再输出;Generator则不要求输入视频片段,可以合成一些视频片段。这里以Filter类型插件作为例子讲解整个开发过程。
首先需要到苹果开发者官网下载SDK:FxPlug SDK,最新版已经出到3.1了。
![Final Cut Pro X效果插件开发总结 Final Cut Pro X效果插件开发总结](https://www.0419af.com/wp-content/uploads/2023/01/1674028013-1746717c3a84417.png)
下载下来的是一个DMG镜像文件,双击加载可以看到如下三份文件:pkg文件是真正的SDK文件,点击安装后是其实就是释放一些framework;Developer文件夹下是一些模板工程,可以参考这些模板工程来编写我们自己的逻辑代码。
![Final Cut Pro X效果插件开发总结 Final Cut Pro X效果插件开发总结](https://www.0419af.com/wp-content/uploads/2023/01/1674028014-1746717c3a84417.png)
我们以模板工程CIFxPlug作为例子,在XCode中打开工程文件,可以看到总共有四个文件。其中CIFxPlug.h/CIFxPlug.m是插件的主文件,而CIFxPlugCache.h/CIFxPlugCache.m则实现了一个简单的缓存类,用于缓存CIFilter和CIContext这两个对象。这个工程演示了在FxPlug插件框架中使用Core Image来处理视频的方法。作为演示,我们直接编译生成CIFxPlug.fxplug插件文件即可。
![Final Cut Pro X效果插件开发总结 Final Cut Pro X效果插件开发总结](https://www.0419af.com/wp-content/uploads/2023/01/1674028014-1746717c3a84417-1.png)
在发布插件之前,我们需要先在Motion中进行Rig操作。这里需要在XCode进行Archive操作,签名打包后可以将得到的CIFxPlug.fxplug文件夹复制到/Library/Plug-Ins/FxPlug/目录下。如果用户从来没有装过其他外部插件,可能不存在这个路径,此时可以手动创建这些路径。
此时可以启动Motion,选择Final Cut 效果新建项目。在滤镜大类下可以看到我们新开发的CIFxPlug插件。在顶部可以看到关于插件的简单描述。
要生成简单的效果,可以简单的将CIFxPlug插件拖到右边的Drop Zone即可。然后保存发布,这里要填好模板名称和类别。类别一般是公司名称,模板名称则是效果的具体名字。因为一个公司可能开发多个效果插件,填一样的类别名称则可以将多个插件归类到一起。
发布之后即可在FCPX中实时看到新发布的插件,而无需重启FCPX。之后就可以正常的和使用内置效果插件一样,使用我们自己开发的插件了。
实际上,在Motion中进行处理有两个目的:一是为了生成可以让FCPX可以识别的文件格式,这样才能正确的被FCPX加载;二是为了做Rig操作,具体来讲就是为插件提供一些小widgets,方便用户对插件的参数进行微调。这个过程也叫作Rig。widgets主要分成三类:slider, popup, checkbox。
三、插件发布流程
(1)在XCode中编译生成FxPlug插件,在XCode中执行Archive操作,签名打包。
(2)拷贝FxPlug插件到/Library/Plug-Ins/FxPlug/目录下,必要的时候手动创建目录。
(3)打开Motion新建项目。本人项目中演示的是滤镜(Filter)插件的实现,所以选择Final Cut Effects项目。
(4)在Motion资源库中选择滤镜下,找到自己开发的滤镜插件,拖到右侧。
(5)存储当前项目,填好类别和主题,保存即可在FCPX中看到新发布的插件。(实际文件可以在用户根目录下的Movies中找到)
(6)在FCPX中使用FxPlug插件。
四、遇到的问题
(1)在FxPlug插件中调用动态库出现Code Signature Invalid异常,导致Motion崩溃。在使用dylib时,Motion崩溃退出时经常报Code Signature Invalid异常。后来经过调试发现,原来是在XCode中做Archive操作时会对dylib做签名操作。后来手动使用install_name_tool修改了dylib的path时,这时签名就发生了改变。系统在加载dylib是就会报Code Signature Invalid错误。那要修改dylib的path怎么办呢?一种解决办法就是:把所有的dylib的path修改好后放到工程目录下,在XCode中引用这些dylib,在build phase中添加Copy Files Phase,这一步可以让XCode打包时自动拷贝签名好的dylib。这样就解决了Code Signature Invalid异常问题。
(2)install_name_tool和otool工具的使用(两者只能在工程目录下的Libs下使用)。这两个工具配合起来用于修改path。otool用于查看dylib和可执行文件依赖的动态库;Install_name_tool则用于修改。
(3)Objective C和C++混合编程。OC与C/C++混合编程是一个常见的场景,在公司的项目中,需要在FxPlug插件中调用公司用C++开发的一个渲染库。渲染库以dylib和头文件的形式提供。适配的方式是,将原先的.m文件修改成.mm文件,然后在这个.mm文件中引入渲染库头文件。这样编译就没问题了。如果在.h文件中引入渲染库头文件,会产生编译错误的。因为#include预处理其实就是代码替换,这样一来C++代码和OC代码在.h文件中就混杂在一起了,因而无法编译通过。在.mm文件中包含头文件时,同样也有代码替换的这个过程,但是为什么就可以呢?因为.mm扩展名本来就允许OC和C++代码共存呀。
五、总结
苹果下的开发太封闭了,针对FCPX插件开发的资料也非常少,官方文档在某一程度上也显得语焉不详。英文文档在理解上也存在一定的差异,因此在摸索过程中碰了不少的壁。此外,Motion和Final Cut Pro自身的日志也非常少。有时候会莫名其妙的崩溃,以至于排查代码错误显得非常的困难。幸好Motion和FCPX在崩溃时有一部分调用堆栈信息,在一定程度上可以帮助缩小问题范围。这次项目中要用的插件也基本上开发完成了,初步能够实现预定的效果。整个过程虽然痛苦,但是最终还是完成了任务,算是有始有终了。