为什么 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;
}
我正在尝试与 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;
}