Проблемы с получением пути отснятого материала после эффектов SDK

Возникли проблемы с последствиями 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 во временный файл, и она всегда выдает следующее.

펐 㛻

Могу ли я получить некоторые рекомендации по этому вопросу? Спасибо!

1

Решение

У вас уже есть данные как более умные std :: wstring, почему вы преобразовали их в байтовый массив, а затем принудительно сделали их простыми std :: string? В общем, вам следует избегать преобразования строк с помощью байтовых массивов. Мои знания по C ++ STDLIB сейчас несколько лет, но проблема может быть в том классе std :: string может просто до сих пор нет поддержки UTF8.

Вы действительно должны хранить это как utf8? Если это только для регистрации, попробуйте использовать ofwstream (широкий), полностью удалить преобразование и «строку» и просто записать «wstring» непосредственно в поток.

Кроме того, вполне возможно, что все прошло правильно, и это просто ваш просмотрщик файлов, который приходит в бешенство. Изучите файл журнала с помощью hexeditor и проверьте, содержит ли начало файла маркеры формата Unicode, такие как 0xFFFE и т. Д .:

  • если он есть, и вы записали данные в неидентичной кодировке, как указывают маркеры, то это проблема
  • если его нет, попробуйте добавить правильные маркеры. Может быть, ваша программа просмотра файлов просто не заметила, что это тип Unicode, и неправильно прочитала файл. Маркеры Unicode помогают читателям правильно декодировать данные.
0

Другие решения

Я смог выяснить ответ.
http://forums.adobe.com/message/5112560#5112560

Это то, что было не так.
Это было потому, что исполняемый код был в цикле, а я не выделял строки с оператором new.

Это была линия, которая нуждалась в новом.
wchar_t footagePath [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);
}
}
}
}
0