DirectShow 采集摄像头图像为AVI文件 但是用播放器无法播放这个AVI文件

season030441 CSDN会员 season030441 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
以下为我的源码,可以看到预览的摄像头画面,test2.avi可以生成,文件大小也正确,但是用QQ影音等播放器却无法播放这个test2.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采集卡封装类,代码写得比较完善

zhoubotong2012

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文件

kvliang

Directshow实现的虚拟摄像头

搞了1个月的虚拟摄像头,终于有了些眉目,这是一个结构简单的Virtual Camera,用SDK例子改装的,希望对大家有帮助。 【update】 http://download.csdn.net/source/1352116

bifei1983
评论 6
收藏 已收藏
分享
返回顶部
season030441 CSDN会员
ATL 3,248 成员 48,530 内容