c++ - 为什么 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;
}
希望有人可以帮助我,因此,将来,任何有类似问题的人都会在这里找到他的答案:)。对于任何与英语相关的错误,我深表歉意,我仍然只是在学习这种语言。
解决方案
我很蠢 :)
我在我的代码中发现了错误。
设置时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;
}
推荐阅读
- javascript - 在 node.js 应用程序中使用参数中的变量从 sqlite 数据库中查询数据
- sapui5 - 如何在 Fiori 应用中获取当前用户的角色?
- nullpointerexception - 你知道像 @NonNull 这样的注解来表示 `return` 值吗?
- django - Django - 不加载静态图像,在控制台中抛出 404 错误
- selenium-webdriver - 通过 Appium 创建 AndroidDriver 实例时 wd/hub 是什么?
- javascript - 在 Node.js 中绑定 require 函数
- javascript - 如何从 Javascript 中更大的字符串中获取字符串?
- typescript - 从另一个类型的值中的类型构造一个类型
- java - 我可以以某种方式增加 USB 端点的大小吗?
- html - React 的 NPM 运行构建错误