我用AE SDK开发插件的时候,我想获取鼠标选中的关键帧的值,然后我写了一段代码,但是当代码运行到AEGP_GetNewKeyframeValue这个函数的时候,就报错,其中err返回错误代码3.并且在AE中也报错显示:AE内部错误,no current context。完整的代码在下方,报错的截图也在下方。各位帮我解决下,感谢
A_Err PanelatorUI_Plat::GetKeyframe() {
A_Err err = A_Err_NONE;
AEGP_CompH compH = NULL;
AEGP_ItemH activeItemH = NULL;
AEGP_SuiteHandler i_sp = sP;
AEGP_Collection2H collectionPH = NULL;
A_u_long num_itemsPL = 0;
// 获取当前活动的项目(item),可能是合成,也可能是其他类型的项目
err = i_sp.ItemSuite1()->AEGP_GetActiveItem(&activeItemH);
if (err != A_Err_NONE || activeItemH == NULL) {
MessageBox(NULL, "无法获取活动项目", "错误", MB_OK);
return A_Err_GENERIC;
}
// 定义一个结构体用来存储合成的句柄
AEGP_ItemType itemType;
// 获取选中的东西的类型,存放在itemType
err = i_sp.ItemSuite1()->AEGP_GetItemType(activeItemH, &itemType);
if (err != A_Err_NONE) {
MessageBox(NULL, "无法获取项目类型", "错误", MB_OK);
return A_Err_GENERIC;
}
if (itemType == AEGP_ItemType_COMP) {
err = i_sp.CompSuite9()->AEGP_GetCompFromItem(activeItemH, &compH);
if (err != A_Err_NONE || compH == NULL) {
MessageBox(NULL, "无法获取合成句柄", "错误", MB_OK);
return A_Err_GENERIC;
}
}
else {
MessageBox(NULL, "活动项目不是合成类型", "错误", MB_OK);
return A_Err_GENERIC;
}
err = i_sp.CompSuite10()->AEGP_GetNewCollectionFromCompSelection(NULL, compH, &collectionPH);
if (err != A_Err_NONE || collectionPH == NULL) {
MessageBox(NULL, "无法获取选中的图层集合", "错误", MB_OK);
return A_Err_GENERIC;
}
err = i_sp.CollectionSuite2()->AEGP_GetCollectionNumItems(collectionPH, &num_itemsPL);
if (err != A_Err_NONE || num_itemsPL == 0) {
MessageBox(NULL, "选中的图层集合为空", "错误", MB_OK);
return A_Err_GENERIC;
}
for (A_u_long i = 0; i < num_itemsPL && err == A_Err_NONE; ++i) {
AEGP_LayerH layerH = NULL;
AEGP_CollectionItemV2 collection_itemP;
err = i_sp.CollectionSuite2()->AEGP_GetCollectionItemByIndex(collectionPH, i, &collection_itemP);
if (err != A_Err_NONE) break;
if (collection_itemP.type == AEGP_CollectionItemType_LAYER) {
layerH = collection_itemP.u.layer.layerH;
if (layerH == NULL) {
MessageBox(NULL, "无效的图层句柄", "错误", MB_OK);
err = A_Err_GENERIC;
break;
}
AEGP_StreamRefH streamH = nullptr;
err = i_sp.StreamSuite5()->AEGP_GetNewLayerStream(NULL, layerH, AEGP_LayerStream_POSITION, &streamH);
if (err != A_Err_NONE || streamH == nullptr) {
MessageBox(NULL, "获取属性流失败", "错误", MB_OK);
err = A_Err_GENERIC;
break;
}
A_long keyframe_count = 0;
err = i_sp.KeyframeSuite3()->AEGP_GetStreamNumKFs(streamH, &keyframe_count);
if (err != A_Err_NONE || keyframe_count == 0) {
MessageBox(NULL, "获取关键帧数量失败或关键帧数量为零", "错误", MB_OK);
i_sp.StreamSuite4()->AEGP_DisposeStream(streamH); // 确保资源释放
err = A_Err_GENERIC;
break;
}
for (A_long j = 0; j < keyframe_count; j++) {
A_Time keyframe_time = { 0, 1 };
err = i_sp.KeyframeSuite3()->AEGP_GetKeyframeTime(streamH, j, AEGP_LTimeMode_LayerTime, &keyframe_time);
if (err != A_Err_NONE) {
MessageBox(NULL, "获取关键帧时间失败", "错误", MB_OK);
break;
}
AEGP_StreamValue value;
AEFX_CLR_STRUCT(value);
err = i_sp.KeyframeSuite3()->AEGP_GetNewKeyframeValue(plugin_id, streamH, j, &value);
if (err != A_Err_NONE) {
MessageBox(NULL, "获取关键帧值失败", "错误", MB_OK);
break;
}
err = i_sp.StreamSuite2()->AEGP_DisposeStreamValue(&value);
if (err != A_Err_NONE) break;
}
i_sp.StreamSuite4()->AEGP_DisposeStream(streamH); // 确保资源释放
if (err != A_Err_NONE) break;
}
}
if (collectionPH != NULL) {
i_sp.CollectionSuite2()->AEGP_DisposeCollection(collectionPH); // 确保资源释放
}
return err;
}