我正在尝试通过Windows开发中心的DirectShow示例来制作我自己的应用程序,可以捕获屏幕和音频到视频。 https://msdn.microsoft.com/en-us/library/windows/desktop/dd318627(v=vs.85).aspx
当我执行RenderStream
方法失败且HRESULT_CODE
为16387时。
这是我的代码。我已经阅读了很多例子,并不能完全理解这一切。我很想得到一些非常基本的工作,所以我可以自己扩展它。
我意识到这不是最好的练习等。我对C ++非常生疏,对DirectShow来说是新手,所以请不要过于挑剔,随意解释我有点简单!
这是我的代码:
void AudioVideoBuilder::AVBuilder::MakeVideo()
{
IGraphBuilder *pGraph = NULL;
ICaptureGraphBuilder2 *pBuild = NULL;
// Create the Filter Graph Manager.
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
if (SUCCEEDED(hr))
{
// Create the Capture Graph Builder.
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
(void **)&pBuild);
if (SUCCEEDED(hr))
{
pBuild->SetFiltergraph(pGraph);
}
};
IBaseFilter *pCap = 0;
if (SUCCEEDED(hr))
{
// Create the Capture Graph Builder.
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2,
(void**)&pBuild);
IBaseFilter *pMux;
if (SUCCEEDED(hr))
{
hr = pBuild->SetOutputFileName(
&MEDIASUBTYPE_Avi, // Specifies AVI for the target file.
L"C:\\Example.avi", // File name.
&pMux, // Receives a pointer to the mux.
NULL); // (Optional) Receives a pointer to the file sink.
if (SUCCEEDED(hr))
{
hr = pBuild->RenderStream(
&PIN_CATEGORY_CAPTURE, // Pin category.
&MEDIATYPE_Audio, // Media type.
pCap, // Capture filter.
NULL, // Intermediate filter (optional).
pMux); // Mux or file sink filter.
if (SUCCEEDED(hr))
{
hr = pBuild->RenderStream(
&PIN_CATEGORY_CAPTURE, // Pin category.
&MEDIATYPE_Video, // Media type.
pCap, // Capture filter.
NULL, // Intermediate filter (optional).
pMux); // Mux or file sink filter.
// Release the mux filter.
pMux->Release();
IConfigAviMux *pConfigMux = NULL;
hr = pMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfigMux);
if (SUCCEEDED(hr))
{
pConfigMux->SetMasterStream(0);
pConfigMux->Release();
}
IConfigInterleaving *pInterleave = NULL;
hr = pMux->QueryInterface(IID_IConfigInterleaving, (void**)&pInterleave);
if (SUCCEEDED(hr))
{
pInterleave->put_Mode(INTERLEAVE_CAPTURE);
pInterleave->Release();
}
}
else
{
DWORD error = HRESULT_CODE(hr);
}
}
else
{
DWORD error = HRESULT_CODE(hr);
}
}
}
else
{
DWORD error = HRESULT_CODE(hr);
}
}
答案 0 :(得分:2)
Andrew Comiagin已在评论中提出建议。不要使用“c:\ Example.avi”作为目标文件。如果您没有root用户的访问权限,可能会导致不必要的问题。
此外,在您的代码中,您无法定义捕获设备(输入设备)。
中的变量pCappBuild->RenderStream
在代码中设置为0(NULL)。它必须是一个捕获设备。 RenderStream
期待捕获设备或渲染器,永远不会为NULL。
如果搜索错误代码,请使用十六进制。 16387是0x4003,这是输入引脚的问题。难怪,它是零。
看这里
https://msdn.microsoft.com/en-us/library/windows/desktop/dd377566(v=vs.85).aspx
了解如何获取捕获设备。
答案 1 :(得分:1)
此处的问题与您的新问题相同:Directshow RenderStream "the parameter is incorrect"并且无意中第二次创建了CLSID_CaptureGraphBuilder2
个实例(details)。
另请注意,错误代码是HRESULT
值。这就是解释操作状态的原因。一旦您尝试获取字符串并获取指向字符的指针,指针(0x055...
,0x099...
)不是错误代码,它只是一些没有特殊含义的随机地址。代码是关键。