weixin_49709007 2024-07-19 13:55 采纳率: 0%
浏览 9
已结题

AE SDK插件开发,获取关键帧值得问题

我用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;
}

img

img

  • 写回答

28条回答 默认 最新

  • 阿里嘎多学长 2024-07-19 13:55
    关注
    获得0.30元问题酬金

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    从你提供的信息和代码来看,你在使用Adobe After Effects SDK开发插件时遇到了一些挑战。以下是一些可能帮助你解决问题的建议:

    1. 理解错误代码3

    错误代码3通常表示“无效的参数”(Invalid Parameter)。这可能意味着你传递给某个函数的参数不正确或不符合预期。在你的代码中,可能需要检查以下几个方面:

    • plugin_id:确保这个参数是有效的插件ID。
    • streamHj:确保这些参数在调用AEGP_GetNewKeyframeValue时是有效的。

    2. 检查代码逻辑

    你的代码逻辑看起来是合理的,但有一些细节可能需要注意:

    • 确保plugin_id是正确初始化的。
    • 在调用AEGP_GetNewKeyframeValue之前,确保streamHj都是有效的。

    3. 参考错误截图

    从你提供的截图来看,错误信息是“AE内部错误,no current context”。这通常意味着在调用某个函数时,当前的上下文环境不正确。可能的原因包括:

    • 当前没有选中任何图层或关键帧。
    • 调用函数时,相关的上下文(如合成、图层等)已经被释放或不再有效。

    4. 代码优化建议

    以下是一些可能帮助你优化代码的建议:

    • 资源管理:确保所有资源在使用后都被正确释放。例如,使用完streamH后,调用AEGP_DisposeStream释放资源。
    • 错误处理:在每个关键步骤后,检查错误代码,并在必要时释放资源并返回错误。

    5. 参考文档和社区

    • Adobe After Effects SDK文档:这是最重要的资源,确保你理解每个函数的参数和返回值。
    • Adobe Developer Connection论坛:这里有许多经验丰富的开发者,他们可能遇到过类似的问题。
    • Stack Overflow:虽然主要是面向Web开发,但也有许多关于Adobe SDK的问题和解决方案。

    6. 调试技巧

    • 断点调试:在关键函数调用前后设置断点,检查变量的值和状态。
    • 日志记录:在关键步骤添加日志输出,记录函数调用的结果和错误代码。

    示例代码优化

    以下是一些代码优化的示例:

    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);
            i_sp.ItemSuite1()->AEGP_ReleaseItem(activeItemH); // 释放资源
            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);
                i_sp.ItemSuite1()->AEGP_ReleaseItem(activeItemH); // 释放资源
                return A_Err_GENERIC;
            }
        }
        else {
            MessageBox(NULL, "活动项目不是合成类型", "错误", MB_OK);
            i_sp.ItemSuite1()->AEGP_ReleaseItem(activeItemH); // 释放资源
            return A_Err_GENERIC;
        }
    
        err = i_sp.CompSuite10()->AEGP_GetNewCollectionFromCompSelection(NULL, compH, &collectionPH);
        if (err != A_Err_NONE || collectionPH == NULL) {
            MessageBox(NULL, "无法获取选中的图层集合", "错误", MB_OK);
            i_sp.CompSuite9()->AEGP_ReleaseComp(compH); // 释放资源
            i_sp.ItemSuite1()->AEGP_ReleaseItem(activeItemH); // 释放资源
            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);
            i_sp.CompSuite10()->AEGP_DisposeCollection(collectionPH); // 释放资源
            i_sp.CompSuite9()->AEGP_ReleaseComp(compH); // 释放资源
            i_sp.ItemSuite1()->AEGP_ReleaseItem(activeItemH); // 释放资源
            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); // 确保资源释放
        }
    
        if (compH != NULL) {
            i_sp.CompSuite9()->AEGP_ReleaseComp(compH); // 释放资源
        }
    
        if (activeItemH != NULL) {
            i_sp.ItemSuite1()->AEGP_ReleaseItem(activeItemH); // 释放资源
        }
    
        return err;
    }
    

    希望这些建议能帮助你解决问题。如果问题仍然存在,建议进一步查阅Adobe After Effects SDK的文档,或者在相关开发者社区中寻求帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月27日
  • 创建了问题 7月19日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?