【问题标题】:Trouble getting footage path after effects sdk在效果 sdk 后无法获取素材路径
【发布时间】:2013-02-25 23:38:51
【问题描述】:

在使用后效 sdk 时遇到问题。 基本上,我正在遍历所有素材项目项目并尝试从中获取素材路径。这是我在循环中的代码。

AEGP_ItemType itemType = NULL;
ERR(suites.ItemSuite6()->AEGP_GetNextProjItem(projH, itemH, &itemH));
if (itemH == NULL) {
  break;
}
ERR(suites.ItemSuite6()->AEGP_GetItemType(itemH, &itemType));
if (itemType == AEGP_ItemType_FOOTAGE) {
          numFootage++;
          AEGP_FootageH footageH;
          ERR(suites.FootageSuite5()->AEGP_GetMainFootageFromItem(itemH, &footageH));
          A_char newItemName[AEGP_MAX_ITEM_NAME_SIZE] = {""};
          wchar_t footagePath[AEGP_MAX_PATH_SIZE];
          ERR(suites.ItemSuite6()->AEGP_GetItemName(itemH, newItemName));
          AEGP_MemHandle pathH = NULL;
          ERR(suites.FootageSuite5()->AEGP_GetFootagePath(footageH, 0, AEGP_FOOTAGE_MAIN_FILE_INDEX, &pathH));
          ERR(suites.MemorySuite1()->AEGP_LockMemHandle(pathH, reinterpret_cast<void**>(&footagePath)));
          std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
          const std::string utf8_string = converter.to_bytes(footagePath);
          std::ofstream tempFile;
          tempFile.open ("C:\\temp\\log1.txt");
          tempFile << utf8_string;
          tempFile.close();
          ERR(suites.MemorySuite1()->AEGP_UnlockMemHandle(pathH));
          ERR(suites.MemorySuite1()->AEGP_FreeMemHandle(pathH));
}

我正在获取素材路径

然后我将 UTF-16 (wchar_t) 指针转换为 UTF-8 字符串

然后我将该 UTF-8 字符串写入临时文件,它总是输出以下内容。

㎐㛻

我可以请您对此提供一些指导吗?谢谢!

【问题讨论】:

    标签: c++ sdk after-effects


    【解决方案1】:

    您已经将数据作为更智能的 std::wstring,为什么要将其转换为字节数组,然后将其强制为简单的 std::string?通常,您应该避免通过字节数组转换字符串。我对 C++ STDLIB 的了解已经有几年了,但问题可能在于 std::string 类可能仍然没有任何 UTF8 支持。 p>

    您真的需要将其存储为 utf8 吗?如果只是用于日志记录,请尝试使用 ofwstream(宽的),完全删除转换和“字符串”,直接将“wstring”写入流。

    此外,完全有可能一切正常,只是您的文件查看器发疯了。使用 hexeditor 检查您的日志文件,并检查文件开头是否包含 Unicode 格式标记,如 0xFFFE 等:

    • 如果它有一些,并且您以标记指示的不同编码写入数据,那么这就是问题
    • 如果没有,请尝试添加正确的标记。也许您的文件查看器根本没有注意到它是那种类型的 unicode 并误读了文件。 Unicode 标记可帮助读者正确解码数据。

    【讨论】:

      【解决方案2】:

      我能够找出答案。 http://forums.adobe.com/message/5112560#5112560

      这是错误的。 这是因为执行代码在循环中,我没有使用 new 运算符分配字符串。

      这条线需要一个新的。 wchar_t 素材路径[AEGP_MAX_PATH_SIZE];

      另一条有用的信息是并非所有素材项目都有路径。

      如果没有路径,它将返回空字符串。 这是我最终得到的代码。

      if (itemType == AEGP_ItemType_FOOTAGE) {
                A_char* newItemName = new A_char[AEGP_MAX_ITEM_NAME_SIZE];
                ERR(suites.ItemSuite6()->AEGP_GetItemName(newItemH, newItemName));
                AEGP_MemHandle nameH = NULL;
                AEGP_FootageH footageH = NULL;
                char* footagePathStr = new char[AEGP_MAX_PATH_SIZE];
                ERR(suites.FootageSuite5()->AEGP_GetMainFootageFromItem(newItemH, &footageH));
                if (footageH) {
                                  suites.FootageSuite5()->AEGP_ GetFootagePath(footageH, 0, AEGP_FOOTAGE_MAIN_FILE_INDEX, &nameH);
                                  if(nameH) {
                                             tries++;
                                             AEGP_MemSize size = 0;
                                             A_UTF16Char *nameP = NULL;
                                             suites.MemorySuite1()->AEGP_GetMemHandleSize(nameH, &size);
                                             suites.MemorySuite1()->AEGP_LockMemHandle(nameH, (void **)&nameP);
                                             std::wstring test = L"HELLO";
                                             std::string output;
                                             int len = WideCharToMultiByte(CP_OEMCP, 0, (LPCWSTR)nameP, -1, NULL, 0, NULL, NULL);
                                             if (len > 1) {
                                                        footagePathStr = new char[len];
                                                        int len2 = WideCharToMultiByte(CP_OEMCP, 0, (LPCWSTR)nameP, -1, footagePathStr, len, NULL, NULL);
                                                        ERR(suites.MemorySuite1()->AEGP_UnlockMemHandle(nameH));
                                                        suites.MemorySuite1()->AEGP_FreeMemHandle(nameH);
                                             }
                                  }
                }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-03
        • 2016-01-11
        • 1970-01-01
        相关资源
        最近更新 更多