Перечисление всех установленных кодеков Windows Media
[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Она была заменена средствами чтения источника и модуля записи приемников. Средство чтения источника и модуль записи приемников оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде средство чтения исходного кода и модуль записи приемников вместо пакета SDK для Windows Media Format 11, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
Все информационные интерфейсы кодеков используют индексы кодеков для идентификации отдельных кодеков. Кодеки индексируются независимо для аудио и видео. В пределах одного типа кодека индексы варьируются от 0 до одного меньше, чем число кодеков этого типа.
В следующем примере кода показано, как получить индекс, связанный с каждым кодеком. Чтобы скомпилировать этот код в приложении, добавьте stdio.h.
HRESULT GetCodecNames(IWMCodecInfo3* pCodecInfo)
{
HRESULT hr = S_OK;
DWORD cCodecs = 0;
WCHAR* pwszCodecName = NULL;
DWORD cchCodecName = 0;
// Retrieve the number of supported audio codecs on the system.
hr = pCodecInfo->GetCodecInfoCount(WMMEDIATYPE_Audio, &cCodecs);
if(SUCCEEDED(hr))
printf("Number of audio codecs: %d\n\n", cCodecs);
else
{
printf("Could not get the count of audio codecs.\n");
return hr;
}
// Loop through all the audio codecs.
for(DWORD dwCodecIndex = 0; dwCodecIndex < cCodecs; dwCodecIndex++)
{
// Get the codec name:
// First, get the size of the name.
hr = pCodecInfo->GetCodecName(WMMEDIATYPE_Audio,
dwCodecIndex,
NULL,
&cchCodecName);
if(FAILED(hr))
{
printf("Could not get the size of the codec name.\n");
return hr;
}
// Allocate a string of the appropriate size.
pwszCodecName = new WCHAR[cchCodecName];
if(pwszCodecName == NULL)
{
printf("Could not allocate memory.\n");
return E_OUTOFMEMORY;
}
// Retrieve the codec name.
hr = pCodecInfo->GetCodecName(WMMEDIATYPE_Audio,
dwCodecIndex,
pwszCodecName,
&cchCodecName);
if(FAILED(hr))
{
delete[] pwszCodecName;
printf("Could not get the codec name.\n");
return hr;
}
// Print the codec name.
printf("%d %S\n", dwCodecIndex, pwszCodecName);
// Clean up for the next iteration.
delete[] pwszCodecName;
pwszCodecName = NULL;
cchCodecName = 0;
}
// Retrieve the number of supported video codecs on the system.
hr = pCodecInfo->GetCodecInfoCount(WMMEDIATYPE_Video, &cCodecs);
if(SUCCEEDED(hr))
printf("\n\nNumber of video codecs: %d.\n\n", cCodecs);
else
{
printf("Could not get the count of video codecs.\n");
return hr;
}
// Loop through all the video codecs.
for(dwCodecIndex = 0; dwCodecIndex < cCodecs; dwCodecIndex++)
{
// Get the codec name:
// First, get the size of the name.
hr = pCodecInfo->GetCodecName(WMMEDIATYPE_Video,
dwCodecIndex,
NULL,
&cchCodecName);
if(FAILED(hr))
{
printf("Could not get the size of the codec name.\n");
return hr;
}
// Allocate a string of the appropriate size.
pwszCodecName = new WCHAR[cchCodecName];
if(pwszCodecName == NULL)
{
printf("Could not allocate memory.\n");
return E_OUTOFMEMORY;
}
// Retrieve the codec name.
hr = pCodecInfo->GetCodecName(WMMEDIATYPE_Video,
dwCodecIndex,
pwszCodecName,
&cchCodecName);
if(FAILED(hr))
{
printf("Could not get the codec name.\n");
return hr;
}
// Print the codec name.
printf("%d %S\n", dwCodecIndex, pwszCodecName);
delete[] pwszCodecName;
pwszCodecName = NULL;
cchCodecName = 0;
}
return S_OK;
}
Связанные темы