AE插件开发示例
????????如上一篇文章🔗搭建AE插件開發框架?介紹,功能實現需在鉤子函數?CommandHook() 中開發,那來看看怎么獲取圖層的曝光值吧!
????????先獲取當前圖層:
AEGP_LayerH layerH = NULL; ERR(suites.LayerSuite8()->AEGP_GetActiveLayer(&layerH));????????再根據圖層獲取對應的效果空間,如曝光度對應的 effect_key 是 825:
AEGP_InstalledEffectKey effect_key = 825; AEGP_EffectRefH effectH; ERR(suites.EffectSuite4()->AEGP_ApplyEffect(S_my_id, layerH, effect_key, &effectH));????????如果僅此,那么插件每執行一次,效果控件面板就會增加一個曝光度面板:
?????????可以通過如下代碼在應用該效果前做個判斷:
A_long num_effectsL = 0; Boolean is_apply = false; ERR(suites.EffectSuite4()->AEGP_GetLayerNumEffects(layerH, &num_effectsL)); for (A_long i = 0; i < num_effectsL; ++i) {ERR(suites.EffectSuite4()->AEGP_GetLayerEffectByIndex(S_my_id, layerH, i, &effectH));ERR(suites.EffectSuite4()->AEGP_GetInstalledKeyFromLayerEffect(effectH, ¤t_key));if (current_key == effect_key) {is_apply = true;break;} } if (!is_apply) {ERR(suites.EffectSuite4()->AEGP_ApplyEffect(S_my_id, layerH, effect_key, &effectH)); }????????打開曝光度面板后,可以看到有多個參數,如主要通道下的曝光度、偏移,還有單個通道包括紅綠藍的曝光度等等,每個參數都有對應的的一個標記以及值,可以通過方法?AEGP_GetEffectNumParamStreams() 獲取:
ERR(suites.StreamSuite5()->AEGP_GetEffectNumParamStreams(effectH, &num_paramsL)); // 列出 effect 下所有 stream for (A_long i = 1; i < num_paramsL; ++i) {ERR(suites.StreamSuite5()->AEGP_GetNewEffectStreamByIndex(S_my_id, effectH, i, &streamH));ERR(suites.DynamicStreamSuite4()->AEGP_GetMatchName(streamH, stream_name));ERR(suites.StreamSuite5()->AEGP_GetStreamType(streamH, &stream_type));ERR(suites.StreamSuite5()->AEGP_GetStreamProperties(streamH, &flags, &min, &max));s = "stream index:" + std::to_string(i) + ", name:" + stream_name + ", type:" + std::to_string(stream_type) + ", min:" + std::to_string(min) + ", max:" + std::to_string(max);writeLog(s); }????????打印結果如下:
????????這里打印出的都是些相關屬性,包括 stream 匹配名稱、類型、最大值、最小值等,如果要獲取具體曝光值,可以調用?AEGP_GetNewStreamValue() 方法:
AEGP_LTimeMode time_mode = AEGP_LTimeMode_LayerTime; A_Time timeT = {0, 1}; AEGP_StreamValue2 stream_value; AEFX_CLR_STRUCT(stream_value); ERR(suites.StreamSuite5()->AEGP_GetNewStreamValue(S_my_id, streamH, time_mode, &timeT, TRUE, &stream_value));????????stream_value 就記錄了具體值,注意到它是 AEGP_StreamValue2 類型,定義如下:
typedef union {AEGP_FourDVal four_d;AEGP_ThreeDVal three_d;AEGP_TwoDVal two_d;AEGP_OneDVal one_d;AEGP_ColorVal color;AEGP_ArbBlockVal arbH;AEGP_MarkerValP markerP;AEGP_LayerIDVal layer_id;AEGP_MaskIDVal mask_id;AEGP_MaskOutlineValH mask;AEGP_TextDocumentH text_documentH; } AEGP_StreamVal2;typedef struct {AEGP_StreamRefH streamH;AEGP_StreamVal2 val; } AEGP_StreamValue2;????????這時候前面打印的? stream_type 字段就派上用場了,這是取曝光值的關鍵。看下 stream_type 一共有哪些:
enum {AEGP_StreamType_NO_DATA,AEGP_StreamType_ThreeD_SPATIAL,AEGP_StreamType_ThreeD,AEGP_StreamType_TwoD_SPATIAL,AEGP_StreamType_TwoD,AEGP_StreamType_OneD,AEGP_StreamType_COLOR,AEGP_StreamType_ARB,AEGP_StreamType_MARKER,AEGP_StreamType_LAYER_ID,AEGP_StreamType_MASK_ID,AEGP_StreamType_MASK,AEGP_StreamType_TEXT_DOCUMENT }; typedef A_long AEGP_StreamType;?????????stream_type 值為 5 的話,也就是?AEGP_StreamType_OneD 類型,再根據?AEGP_StreamVal2 中類型定義,通過?stream_value.val.one_d 就可以取到相應值啦!
????????如果要修改曝光值呢?譬如修改主要通道曝光值為 0.6,將其賦值給 stream_value.val.one_d ,再直接調用方法 AEGP_SetStreamValue() 即可:
stream_index = 3; stream_value.val.one_d = 0.6; ERR(suites.StreamSuite5()->AEGP_GetNewEffectStreamByIndex(S_my_id, effectH, stream_index, &streamH)); ERR(suites.StreamSuite5()->AEGP_SetStreamValue(S_my_id, streamH, &stream_value));????????以上,歡迎交流~
總結
- 上一篇: JC机制与JVM内存区域
- 下一篇: 在线视频编辑 剪辑系统源码 支持AE所有