DirectShow 采集摄像头图像为AVI文件 但是用播放器无法播放这个AVI文件
HRESULT hr;
IGraphBuilder *pGB=NULL;
ICaptureGraphBuilder2* pCGB2=NULL;
IMediaControl *pMediaControl = NULL;
IBaseFilter *pMux =NULL;
IBaseFilter *pWriter=NULL;
IBaseFilter *pCompress=NULL;
IFileSinkFilter2 *pSink=NULL;
IBaseFilter *pSrcFilter =NULL;
hr=CoInitialize(NULL);
if( FAILED(hr))
AfxMessageBox("Initializing COM library failed!");
// 创建IGraphBuilder接口
hr=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGB);
if( FAILED(hr))
{
AfxMessageBox("IGraphBuilder failed");
return ;
}
// 创建ICaptureGraphBuilder2接口
hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 ,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2, (void **) &pCGB2);
if( FAILED(hr))
{
AfxMessageBox("IID_ICaptureGraphBuilder2 failed");
return ;
}
pCGB2->SetFiltergraph(pGB);
hr = pGB->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
if( FAILED(hr))
{
AfxMessageBox("IID_IMediaControl failed");
return ;
}
BindFilter(0,&pSrcFilter);//该函数可以正确运行
pGB->AddFilter(pSrcFilter, L"Capture Filter");
hr=pCGB2->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,pSrcFilter,NULL,NULL);
if( FAILED(hr))
{
AfxMessageBox("RenderStream PIN_CATEGORY_PREVIEW failed");
hr = pCGB2->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,pSrcFilter,NULL,NULL);
if( FAILED(hr))
{
AfxMessageBox("RenderStream PIN_CATEGORY_CAPTURE failed");
return ;
}
}
else
{
AfxMessageBox("预览");
}
hr=pCGB2->SetOutputFileName(&MEDIASUBTYPE_Avi,L"e:\\test2.avi",&pMux,NULL);//生成Avi pMux
if( FAILED(hr))
{
AfxMessageBox("SetOutputFileName failed");
return ;
}
IConfigAviMux *pConfigMux=NULL;
hr=pMux->QueryInterface(IID_IConfigAviMux,(void **)&pConfigMux);
if( FAILED(hr))
{
AfxMessageBox("IID_IConfigAviMux failed");
return ;
}
pConfigMux->SetMasterStream(0);
pConfigMux->Release();
hr=pCGB2->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,pSrcFilter,NULL,pMux);//不带压缩
if( FAILED(hr))
{
AfxMessageBox("记录 PIN_CATEGORY_CAPTURE failed");
return ;
}
pMux->Release();
pMediaControl->Run();
相关推荐
Directshow采集摄像头(或其他采集卡)图像的封装类
一个老外写的Directshow采集卡封装类,代码写得比较完善
FFmpeg入门详解之114:DirectShow读取摄像头数据
DirectShow GraphEdit(graphedt.exe)来进行分析:在上图中可以直观的看到播放这个媒体文件的基本模块,七个模块按广度顺序:读文件模块, 解复用模块, 视频解码模块, 音频解码音频, 颜色空间转换模块,视频显示模块,音频播放模块。按照DirectShow的称呼, 一个模块叫做一个filter(过滤器),模块的输入输出口叫做pin(管脚), 有input pin 和output pin两种;
C#调用USB摄像头录制视频并保存:DirectShow与MediaCapture实战详解
在桌面应用、安防监控、工业质检和教学录播等场景中,调用USB摄像头并完成视频录制与本地保存是常见的工程需求,但C#本身并不提供原生摄像头API,开发者往往需要借助Windows底层多媒体框架来实现。DirectShow作为经典的多媒体解决方案,凭借稳定的过滤器图机制和对多种编码器的支持,成为WinForms/WPF桌面应用的主流选择;而MediaCapture则更适合需要现代化API和UWP交互的项目。理解采集、预览、编码存储三条链路的工作原理,掌握设备枚举、分辨率配置、编码器接入与文件封装等关键技术,能够
DirectShow摄像头视频采集、保存AVI文件
利用DirectShowUSB摄像头采集、并保存AVI文件
Directshow实现的虚拟摄像头
搞了1个月的虚拟摄像头,终于有了些眉目,这是一个结构简单的Virtual Camera,用SDK例子改装的,希望对大家有帮助。 【update】 http://download.csdn.net/source/1352116


