2

After Effects 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 文字列を一時ファイルに書き込むと、常に次のように出力されます。

펐㛻

これについてのガイダンスをお願いできますか?ありがとう!

4

2 に答える 2

0

あなたはすでによりスマートなstd::wstringとしてデータを持っています、なぜそれをバイト配列に変換してからそれを単純なstd :: stringとして強制したのですか?一般に、バイト配列を介した文字列の変換は避けてください。C ++ STDLIBに関する私の知識はもう数年先ですが、問題std::stringクラスまだUTF8をサポートしていない可能性があることです。

本当にutf8として保存する必要がありますか?ロギング専用の場合は、ofwstream(ワイドのもの)を使用して、変換と「文字列」を完全に削除し、代わりに「wstring」をストリームに直接書き込みます。

また、すべてが正しく行われた可能性は完全にあり、猛威を振るうのはファイルビューアだけです。hexeditorを使用してログファイルを調べ、ファイルの先頭に0xFFFEなどのUnicode形式のマーカーが含まれているかどうかを確認します。

  • いくつかあり、マーカーが示すように同一ではないエンコーディングでデータを書き込んだ場合、それが問題です
  • ない場合は、正しいマーカーを追加してみてください。たぶん、あなたのファイルビューアは、それがそのタイプのユニコードであることに気づかず、ファイルを誤読したのかもしれません。Unicodeマーカーは、リーダーがデータを適切にデコードするのに役立ちます。
于 2013-02-27T01:23:30.510 に答える
0

答えを導き出すことができました。 http://forums.adobe.com/message/5112560#5112560

これが間違っていました。これは、実行中のコードがループしていて、new 演算子で文字列を割り当てていなかったためです。

これは、新しいものが必要なラインでした。wchar_t フッテージパス[AEGP_MAX_PATH_SIZE];

知っておくと便利なもう 1 つの情報は、すべてのフッテージ アイテムにパスがあるわけではないということです。

パスがない場合、空の文字列が返されます。これは私が最終的に得たコードです。

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);
                                       }
                            }
          }
}
于 2013-03-01T04:24:38.863 に答える