为什么 ActivateObject 函数 return E_POINTER?

Why does ActivateObject function return E_POINTER?

我正在尝试与 windows 媒体基金会合作,掌握它。我正在按照 this tutorial 中的步骤进行操作,但在某些时候我卡住了。

让我描述一下我的问题。

我正在从对象 IMFActivate 调用 ActivateObject 函数。 这个函数调用在教程中有介绍,我想,以适当的方式,所以我只是复制粘贴它,并没有考虑太多。

在我完成教程中的所有步骤后(并将其包装在 class 我自己 (!!)),我尝试 运行 它,并且 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;
    }

希望有人能帮助我,这样以后,任何有类似问题的人都会在这里找到他的答案:)。 对于任何与英语相关的错误,我深表歉意,我还在学习这门语言。

我很笨:)

我发现我的代码有错误。

设置时 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;
    }