首页 > 解决方案 > 为什么 ActivateObject 函数返回 E_POINTER?

问题描述

我正在尝试与 Windows 媒体基金合作,掌握它。我按照本教程中的步骤进行操作,但在某些时候我被卡住了。

让我描述一下我的问题。

我正在 ActivateObject从 object 调用函数IMFActivate。这个函数调用是在教程中介绍的,我猜,以正确的方式,所以我只是复制粘贴它,并没有花太多心思。

在我完成教程中的所有步骤(并将它自己包装在类中(!!))之后,我尝试运行它,并且HRESULT从该函数调用中E_POINTER,这意味着传递了无效指针。

我不会复制粘贴我的整个代码,我会将其缩小到使用的对象,然后调用它自己。下面是函数调用的样子:

HRESULT MediaMultiplexer::AddTransformOutputNodes(
    IMFTopology* pTopology,
    IMFActivate* pSinkActivate,
    IMFMediaType* pSourceType,
    IMFTopologyNode** ppNode
    )
{
    if (!pTopology || !pSinkActivate || !pSourceType)
    {
        return E_INVALIDARG;
    }

    IMFTopologyNode* pEncNode = NULL;
    IMFTopologyNode* pOutputNode = NULL;
    IMFASFContentInfo* pContentInfo = NULL;
    IMFASFProfile* pProfile = NULL;
    IMFASFStreamConfig* pStream = NULL;
    IMFMediaType* pMediaType = NULL;
    IPropertyStore* pProps = NULL;
    IMFActivate* pEncoderActivate = NULL;
    IMFMediaSink* pSink = NULL;

    GUID guidMT = GUID_NULL;
    GUID guidMajor = GUID_NULL;

    DWORD cStreams = 0;
    WORD wStreamNumber = 0;

    HRESULT hr = S_OK;

    hr = pSourceType->GetMajorType(&guidMajor);
    if (FAILED(hr))
    {
        goto done;
    }

    // Create the node.
    hr = MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &pEncNode);
    if (FAILED(hr))
    {
        goto done;
    }

    //Activate the sink
    hr = pSinkActivate->ActivateObject(__uuidof(IMFMediaSink), (void**)&pSink);       //THIS CALL!!!!!
    if (FAILED(hr))
    {
        goto done;
    }
    //find the media type in the sink
    //Get content info from the sink
    hr = pSink->QueryInterface(__uuidof(IMFASFContentInfo), (void**)&pContentInfo);
    if (FAILED(hr))
    {
        goto done;
    }

以下是我准备用于调用该函数的 IMFActivate 的方法:

bool MediaMultiplexer::setFileName(std::string _fileName)
{
    HRESULT hr;
    hr = MFCreateASFMediaSinkActivate(std::wstring(_fileName.begin(), _fileName.end()).c_str(), m_globalContentInfo, &m_globalActivate);
    if (FAILED(hr))
    {
        printError("Failed creating ASF media sink activate", hr);
        return false;
    }
    m_globalActivate->AddRef();
    return true;
}

我刚开始使用 MediaFundation,所以我不知道这有多重要,所以我将展示我如何准备 contentInfo,它用于创建 IMFActivate。

    HRESULT hr;
    
    hr = MFCreateASFContentInfo(&m_globalContentInfo);
    if (FAILED(hr))
    {
        printError("Failed to create global content info", hr);
        return false;
    }
    PROPVARIANT var;
    var.vt = VT_BOOL;
    var.boolVal = VARIANT_TRUE;

    hr = m_globalContentInfo->GetEncodingConfigurationPropertyStore(0, &m_globalStore);
    if (FAILED(hr))
    {
        printError("Failed getting global store configuration", hr);
        return false;
    }

    hr = m_globalStore->SetValue(MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE, var);
    if (FAILED(hr))
    {
        printError("Failed setting value for bitrat adjust", hr);
        return false;
    }

希望有人可以帮助我,因此,将来,任何有类似问题的人都会在这里找到他的答案:)。对于任何与英语相关的错误,我深表歉意,我仍然只是在学习这种语言。

标签: c++windowsmultiplexing

解决方案


我很蠢 :)

我在我的代码中发现了错误。

设置时m_globalContentInfo我忘记设置配置文件。在代码中应该是这样的:

//... 
    hr = m_globalStore->SetValue(MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE, var);
    if (FAILED(hr))
    {
        printError("Failed setting value for bitrat adjust", hr);
        return false;
    }



// I missed that part ealier

    hr = m_globalContentInfo->SetProfile(m_profile);
    if (FAILED(hr))
    {
        printError("Failed setting global profile");
        return false;
    }

推荐阅读