Этот код для применения фильтра CBR к ASF Writer не работает, почему?

Я пытаюсь применить профиль CBR к устройству записи ASF, чтобы уменьшить задержку при потоковой передаче видео / аудио.

Вот что я делал до сих пор:

  1. Используя Media Encoder, я создал профиль CBR по умолчанию.
  2. Сохранил профиль в файл prx

Использовал этот код для применения профиля к ASF Writer:

 // Initialize a new Profile Manager
 IWMProfileManager* pIPM = 0;
 WMCreateProfileManager(&pIPM);

FILE * file = fopen("lowprofile.prx", "rb");

 fseek(file, 0, SEEK_END);
 long length = ftell(file);
 fseek(file, 0, SEEK_SET);

 wchar_t * buffer = new wchar_t[length];
 size_t numRead = fread(buffer, sizeof(wchar_t), length, file);
 buffer[numRead] = NULL;
 fclose(file);

 IWMProfile* pProxProfile = 0;
 hr = pIPM->LoadProfileByData(buffer, &pProxProfile);

 // Set the profile for the writer
 CComQIPtr<IConfigAsfWriter2> pConfigWriter;
 pConfigWriter = m_pWMASFWritter;

 hr = pConfigWriter->SetParam(AM_CONFIGASFWRITER_PARAM_DONTCOMPRESS, TRUE, 0);

 hr = pConfigWriter->ConfigureFilterUsingProfile(pProxProfile); // THIS LINE FAILS, hr = E_FAIL

 hr=m_pGraph->AddFilter(m_pWMASFWritter,L"ASF Writter");
 if(FAILED(hr)) 
  return FALSE;

//etc..

Что не так с этим кодом? Я что-то недопонял ??

К сожалению, для меня нет кода в медиаформате sdk или доступного в Интернете кода, который помог бы мне применить такой фильтр. Я пытаюсь внимательно прочитать документацию, доступную на msdn, но она определенно не так ясна, как хороший образец кода.

Кто-нибудь может мне подсказать, пожалуйста?


person Paul Andrews    schedule 16.01.2011    source источник


Ответы (2)


Выглядит нормально, у меня код, близкий к этому, работает нормально - попробуйте настроить файл профиля для использования стандартных аудио / видео кодеков, чтобы проверить, работает ли код, а затем просто определить проблему и / или закомментировать вызов SetParam.

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

person BrokenGlass    schedule 17.01.2011
comment
Спасибо, brokenglass, это было невероятно добавление первого ASF Writer к графу и ТОГДА настройка с правильным профилем. Теперь работает нормально. - person Paul Andrews; 18.01.2011

Здесь вы вычисляете размер файла в байтах:

fseek(file, 0, SEEK_END);
long length = ftell(file);
fseek(file, 0, SEEK_SET);

Но тогда вы рассматриваете это как размер в символах:

wchar_t * buffer = new wchar_t[length];
size_t numRead = fread(buffer, sizeof(wchar_t), length, file);
buffer[numRead] = NULL;

Вы можете использовать следующее исправление:

long length = ftell(file) / sizeof(wchar_t);
person wimh    schedule 17.01.2011