Я использую SinkWriter для кодирования видео с использованием медиа основы.
После того, как я инициализирую SinkWriter, я хотел бы получить базовый кодер, который он использует, и распечатать его имя, чтобы я мог видеть, какой кодер он использует. (В моем случае кодировщик, скорее всего, H.264 Video Encoder входит в MF).
Я могу получить ссылки на интерфейс ICodecAPI и IMFTransform кодировщика (используя pSinkWriter->GetServiceForStream
), но я не знаю, как получить понятное имя кодировщика с помощью этих интерфейсов.
Кто-нибудь знает, как получить дружественное имя кодировщика от приемника? Или из своего ICodecAPI
или же IMFTransform
интерфейс?
Это, безусловно, эффективное решение, и я не уверен на 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
на значение передано. Но все же это очень плохо, поскольку основывается на том факте, что все кодировщики поддерживают уведомление о событии и требует изменения ненужного параметра, если моя гипотеза о генерируемом событии при построении потока неверна.
имеющий IMFTransform
у вас нет понятного имени кодировщика.
Один из вариантов, который у вас есть, — это проверить тип выходного преобразования и сравнить с хорошо известными идентификаторами GUID, чтобы идентифицировать кодировщик, в частности, у вас будет подтип MFVideoFormat_H264
с кодировщиком H264 MFT.
Другим вариантом является достижение CLSID
кодировщика (IMFTransform
не получит вас, но вы можете получить его, например, через IMFActivate
или запрос MFT_TRANSFORM_CLSID_Attribute
атрибут или через IPersist*
интерфейсы). Затем вы можете найти в реестре понятное имя или перечислить преобразования и найти свое в этом списке, сравнив CLSID.