Получить имя кодировщика из SinkWriter или ICodecAPI или IMFTransform

Я использую SinkWriter для кодирования видео с использованием медиа основы.

После того, как я инициализирую SinkWriter, я хотел бы получить базовый кодер, который он использует, и распечатать его имя, чтобы я мог видеть, какой кодер он использует. (В моем случае кодировщик, скорее всего, H.264 Video Encoder входит в MF).

Я могу получить ссылки на интерфейс ICodecAPI и IMFTransform кодировщика (используя pSinkWriter->GetServiceForStream), но я не знаю, как получить понятное имя кодировщика с помощью этих интерфейсов.

Кто-нибудь знает, как получить дружественное имя кодировщика от приемника? Или из своего ICodecAPI или же IMFTransform интерфейс?

2

Решение

Это, безусловно, эффективное решение, и я не уверен на 100%, что оно работает, но что можно сделать, это:

1) При запуске перечислите все кодеки, которые можно использовать (как я понимаю, в этом случае кодеры H264) и подпишитесь на событие изменения настроек

MFT_REGISTER_TYPE_INFO TransformationOutput = { MFMediaType_Video, MFVideoFormat_H264 };
DWORD nFlags = MFT_ENUM_FLAG_ALL;
UINT32 nCount = 0;
CLSID* pClsids;
MFTEnum( MFT_CATEGORY_VIDEO_ENCODER, nFlags, NULL, &TransformationOutput, NULL, &pClsids, &nCount);
// Ok here we assume nCount is 1 and we got the MS encoder
ICodecAPI *pMsEncoder;
hr = CoCreateInstance(pClsids[0], NULL, CLSCTX_INPROC_SERVER, __uuidof(ICodecAPI), (void**)&pMsEncoder);
// nCodecIds is supposed to be an array of identifiers to distinguish the sender
hr = pMsEncoder->RegisterForEvent(CODECAPI_AVEncVideoOutputFrameRate, (LONG_PTR)&nCodecIds[0]);

2) Не уверен на 100%, если настройка частоты кадров также установлена, когда установлен тип носителя для потока, но в любом случае вы можете попытаться установить то же свойство на ICodecAPI вы извлекли из SinkWriter, Затем после получения события вы сможете идентифицировать кодек, сравнивая lParam1 на значение передано. Но все же это очень плохо, поскольку основывается на том факте, что все кодировщики поддерживают уведомление о событии и требует изменения ненужного параметра, если моя гипотеза о генерируемом событии при построении потока неверна.

1

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

имеющий IMFTransform у вас нет понятного имени кодировщика.

Один из вариантов, который у вас есть, — это проверить тип выходного преобразования и сравнить с хорошо известными идентификаторами GUID, чтобы идентифицировать кодировщик, в частности, у вас будет подтип MFVideoFormat_H264 с кодировщиком H264 MFT.

Другим вариантом является достижение CLSID кодировщика (IMFTransform не получит вас, но вы можете получить его, например, через IMFActivate или запрос MFT_TRANSFORM_CLSID_Attribute атрибут или через IPersist* интерфейсы). Затем вы можете найти в реестре понятное имя или перечислить преобразования и найти свое в этом списке, сравнив CLSID.

0

По вопросам рекламы [email protected]