【发布时间】:2026-01-29 15:25:01
【问题描述】:
我正在尝试通过 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);
}
}
【问题讨论】:
-
您无法写入 C:\ 根文件夹。
-
请同时使用更好的错误处理:
_com_error err(hr); LPCTSTR errMsg = err.ErrorMessage();这样我们就可以了解这里发生了什么。 -
感谢大家的反馈。我已将 AVI 位置更改为临时文件夹,并返回改进的错误处理 - “+ errMsg 0x0556FEB0 “无效指针” wchar_t * “.. 这似乎与下面 Martin 的建议相匹配,我认为,因此将努力弄清楚添加捕获设备和枚举。
标签: c++ directshow video-capture audio-recording