AE 插件開發-經驗分享 (一) AE插件是什么
插件的本質
插件的本質就是一個動態庫,只不過文件擴展名不是DLL而是aex;只要把做好的動態庫放到AE指定的文件夾下(一般是AE安裝文件夾下的Plug-ins),AE啟動時就會找到插件並加載它。
入口點函數
DllExport
PF_Err
EntryPointFunc (
PF_Cmd cmd,
PF_InData *in_data,
PF_OutData *out_data,
PF_ParamDef *params[],
PF_LayerDef *output )
所有插件必需實現入口點函數,插件在使用過程中,入口點函數會被多次調用,不同時刻調用時可能有不同的參數,如果插件被加載時 cmd 的值就是 PF_Cmd_GLOBAL_SETUP,打開關於對話框時 cmd的值就是PF_Cmd_ABOUT。關於入口點函數的名稱,上面用的是EntryPointFunc,這個名稱是可以指定的,指定入口點函數名稱是在資源文件中指定的。
資源文件
樣本插件的源文件夾中都有一個擴展名為“.r”的文件,這個文件是一個文本文件,里面定義了許多插件需要的參數,比如入口點函數的名稱,插件的類別,插件的名稱,版本,待待一些參數,這些參數也是非常重要的,如果設置不正確可能插件也不能加載。這件文件編譯是會用AE SDK中的專門編譯工具PiPLtool.exe生成一個 .rc 的VC中的資源文件,最終編譯鏈接后被放入DLL(aex)文件中。下面是一個樣本插件中的 .r 文件,有些作用我也不太懂,有些知道的我注釋在文件中了
#include "AEConfig.h"
#include "AE_EffectVers.h"
#ifndef AE_OS_WIN
#include "AE_General.r"
#endif
resource 'PiPL' (16000) {
{ /* array properties: 12 elements */
/* [1] */
Kind {
AEEffect /* 插件種類 有效果插件,輸入輸出插件,通用插件,等等*/
},
/* [2] */
Name {
"Checkout" /* 插件的名稱,顯示的名稱 */
},
/* [3] */
Category {
"Sample Plug-ins" /* 分類,效果插件有些插件可以顯示到一個分組里面 */
},
#ifdef AE_OS_WIN
#ifdef AE_PROC_INTELx64
CodeWin64X86 {"EntryPointFunc"}, /* 此處和以下就是入口點函數的定時,用宏定義區分了不同平台 */
#else
CodeWin32X86 {"EntryPointFunc"},
#endif
#else
#ifdef AE_OS_MAC
CodeMachOPowerPC {"EntryPointFunc"},
CodeMacIntel32 {"EntryPointFunc"},
CodeMacIntel64 {"EntryPointFunc"},
#endif
#endif /* 插件版本 */
AE_PiPL_Version {
2,
0
},
/* [7] */
AE_Effect_Spec_Version {
PF_PLUG_IN_VERSION,
PF_PLUG_IN_SUBVERS
},
/* [8] */
AE_Effect_Version {
1048576 /* 2.0 */
},
/* [9] */
AE_Effect_Info_Flags {
0
},
/* 全局輸出參數,需要與代碼中的值一致 */
AE_Effect_Global_OutFlags {
34
},
AE_Effect_Global_OutFlags_2 {
0
},
/* 我的理解是這個名字才是區別其它插件的標志,顯示名可以不同 */
AE_Effect_Match_Name {
"ADBE Checkout"
},
/* [12] */
AE_Reserved_Info {
0
}
}
};
開發環境
VS 2013下載並安裝好
AE_SDK下載需要注冊一下好象才可以下載,開發包下載來以后,解壓,內部有多個不同種類的樣關插件,最省事的開發方式就是找一個相似的插件,在這個插件的基礎上修改名稱等等參數,把不必要的代碼刪除,添加自己的功能代碼。這樣的話開發環境的各種頭文件包含和上邊資源文件的生成等等所有事都省了。
這里我發現一個問題,VS 2013打開項目編譯一切正常,但VS 2015編譯 Release版本是不成功,我還沒有找到原因。
2019.10.10 VS2017一切正常