вызов функции avio_open с неанглийским именем файла недействителен - PullRequest
0 голосов
/ 07 июня 2011

Я пишу Unicode-программу с libav, и я хочу сделать через libav какой-нибудь файл с именем "中 .mp4".

это имя файла не английское, и когда я вызываю, функция возвращает положительное целое число (не сбой).

но вместо "中 .mp4" есть "mp.mp4". (неверное имя файла.)

в чем дело?

char * szFilenameA = 0;

#ifdef _UNICODE
    CSHArray<char> aFilenameBuffer;
    aFilenameBuffer.Alloc(lstrlen(szFileName) * 2);
    ZeroMemory(aFilenameBuffer, aFilenameBuffer.GetSize());
    WideCharToMultiByte(CP_ACP, 0, szFileName, lstrlen(szFileName), aFilenameBuffer, aFilenameBuffer.GetSize(), NULL, NULL);
    szFilenameA = aFilenameBuffer;
#else
    szFilenameA = (TCHAR *)szFileName;
#endif

    ZeroMemory(m_pOutputFormatCtx->filename,1024);
    _snprintf(m_pOutputFormatCtx->filename, strlen(szFilenameA), "%s", szFilenameA);

    avio_open(&m_pOutputFormatCtx->pb, szFilenameA, AVIO_FLAG_WRITE)

1 Ответ

2 голосов
/ 10 июня 2011

наконец-то! это из-за кодировки.

конвертирует ANSI-файл в UTF8, и тогда он работает нормально.

int ANSIToUTF8(char *pszCode, char *UTF8code)
{
  WCHAR Unicode[100]={0,}; 
  char utf8[100]={0,};

  // read char Lenth
  int nUnicodeSize = MultiByteToWideChar(CP_ACP, 0, pszCode, strlen(pszCode), Unicode, sizeof(Unicode)); 

  // read UTF-8 Lenth
  int nUTF8codeSize = WideCharToMultiByte(CP_UTF8, 0, Unicode, nUnicodeSize, UTF8code, sizeof(Unicode), NULL, NULL); 

  // convert to UTF-8 
  MultiByteToWideChar(CP_UTF8, 0, utf8, nUTF8codeSize, Unicode, sizeof(Unicode)); 
  return nUTF8codeSize;
}
...