Я начинаю работать с MS Media Foundation, поэтому я только что ввел код из Учебное пособие: Кодирование файла MP4 .При этом используется Source Resolver для создания источника мультимедиа и функция MFCreateTranscodeTopology () для создания топологии, включающей кодер H.264, как описано в справочном руководстве.
Затем я хотел проверить свое новое понимание средыФундаментные структуры путем анализа топологии.Я создал следующую функцию, которую я вызываю из примера кода непосредственно перед их вызовом StartEncodingSession () в учебном пособии.
HRESULT GetTopologyInfo(IMFTopology *pTopology)
{
HRESULT hr = 0;
WORD num_nodes = 0;
hr = pTopology->GetNodeCount(&num_nodes);
if (SUCCEEDED(hr))
{
for (WORD i = 0; i < num_nodes; i++)
{
IMFTopologyNode *pNode = NULL;
IUnknown *pNodeObject = NULL;
IMFAttributes *pAttribute = NULL;
IMFTransform *pTransform = NULL;
MF_TOPOLOGY_TYPE type;
hr = pTopology->GetNode(i, &pNode);
if (SUCCEEDED(hr))
{
hr = pNode->GetNodeType(&type);
// Get the node object's pointer.
hr = pNode->GetObject(&pNodeObject);
if (SUCCEEDED(hr))
{
hr = pNodeObject->QueryInterface(IID_PPV_ARGS(&pAttribute));
if (SUCCEEDED(hr))
{
GUID guid;
LPWSTR szGuid = NULL;
LPWSTR szFriendlyName = NULL;
hr = pAttribute->GetGUID(MFT_TRANSFORM_CLSID_Attribute, &guid);
if (SUCCEEDED(hr))
{
hr = StringFromIID(guid, &szGuid);
std::wcout << szGuid << std::endl;
}
hr = pAttribute->GetAllocatedString(MFT_FRIENDLY_NAME_Attribute, &szFriendlyName, NULL);
if (SUCCEEDED(hr))
{
std::wcout << szFriendlyName << std::endl;
}
}
hr = pNodeObject->QueryInterface(IID_PPV_ARGS(&pTransform));
if (SUCCEEDED(hr))
{
std::cout << "got transform interface" << std::endl;
}
else
{
std::cout << std::hex << hr << std::endl;
}
}
}
}
}
return hr;
}
Эта функция находит 3 узла в топологии: MF_TOPOLOGY_SOURCESTREAM_NODE, MF_TOPOLOGY_TRANSFORM_NODE и aMF_TOPOLOGY_OUTPUT_NODE.
Эта функция вызывает много вопросов о вещах, которые, кажется, не работают правильно.
Прежде всего,
- Вызов QueryInterface () для полученияИнтерфейс IMFTransform на среднем узле (который имеет тип MF_TOPOLOGY_TRANSFORM_NODE) завершается с ошибкой E_NOINTERFACE.Тем не менее, когда я запрашиваю CLSID и имя преобразования из интерфейса IMFAttributes, я получаю «H264 Encoder MFT».Предполагается, что это преобразование предоставляет интерфейс IMFTransform для документации по видеокодеру H.264 .Кто-нибудь может увидеть, что я делаю не так?
Дополнительные вопросы: вывод этой функции
{6CA50344-051A-4DED-9779-A43305165E35}
H264 Encoder MFT
80004002
80004002
Сбой вызова GetObject для первого узла (который имеет тип MF_TOPOLOGY_SOURCESTREAM_NODE).Как узлу топологии не удается вернуть объект узла? Вызов QueryInterface () для получения интерфейса IMFAttributes также не выполняется на третьем узле (который имеет тип MF_TOPOLOGY_OUTPUT_NODE).Разве не каждый узел должен предоставлять интерфейс IMFAttributes? Где находится декодер H.264 в этой топологии?Исходный файл - это файл MP4 с одним элементарным потоком видео H.264
В общем, есть ли хорошие ссылки, которые объясняют Media Foundation?Интернет-ресурсы, кажется, не рассказывают полную историю.Пока что Media Foundation кажется мне непрозрачным.Спасибо за любую помощь, которую вы можете предложить.
Использование:
Visual Studio 2017 (v141) (но то же поведение с Visual Studio 2010)
Windows SDK Версия 10.0.17134.0
Windows 7 Home Premium, пакет обновления 1