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了。

 

      下載下來的是一個DMG鏡像文件,雙擊加載可以看到如下三份文件:pkg文件是真正的SDK文件,點擊安裝后是其實就是釋放一些framework;Developer文件夾下是一些模板工程,可以參考這些模板工程來編寫我們自己的邏輯代碼。

      我們以模板工程CIFxPlug作為例子,在XCode中打開工程文件,可以看到總共有四個文件。其中CIFxPlug.h/CIFxPlug.m是插件的主文件,而CIFxPlugCache.h/CIFxPlugCache.m則實現了一個簡單的緩存類,用於緩存CIFilterCIContext這兩個對象。這個工程演示了在FxPlug插件框架中使用Core Image來處理視頻的方法。作為演示,我們直接編譯生成CIFxPlug.fxplug插件文件即可。

      在發布插件之前,我們需要先在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_toolotool工具的使用(兩者只能在工程目錄下的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在崩潰時有一部分調用堆棧信息,在一定程度上可以幫助縮小問題范圍。這次項目中要用的插件也基本上開發完成了,初步能夠實現預定的效果。整個過程雖然痛苦,但是最終還是完成了任務,算是有始有終了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM