MS Media Foundation - не получается получить интерфейс IMFTransform к объекту MFT кодера H264? - PullRequest
0 голосов
/ 04 июня 2018

Я начинаю работать с 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.

Эта функция вызывает много вопросов о вещах, которые, кажется, не работают правильно.

Прежде всего,

  1. Вызов 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

1 Ответ

0 голосов
/ 14 июня 2018

Анализировать топологию следует только после того, как MESessionTopologySet получен в обработчике Invoke.

Это событие отправляется, когда Media Session создает полную топологию после вызова * 1005.* IMFMediaSession :: SetTopology

...