DirectShow采集到的视频无法播放

hrjhrj12345 hrjhrj12345 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
DirectShow采集到的视频无法播放
关键看视频开始采集的代码就OK了。

//采集相关的变量
IGraphBuilder *pGraph;
ICaptureGraphBuilder2 *pBuild; //视频采集过滤器图表
IMediaControl *m_pMediaControl;
//视频采集设备的源Filter
IBaseFilter* pSrc;
//---------------------------------------------------------------------//

HRESULT hr;
//创建IGraphBuilder
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&pGraph);

//创建ICaptureGraphBuilder2
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild);

// 过滤器图表添加到管理器中
pBuild->SetFiltergraph(pGraph);
//--------------------------------------------------------------------------------//
//以下代码为查找设备
ICreateDevEnum *pDevEnum=NULL;
IEnumMoniker *pClsEnum=NULL;

//创建设备枚举COM对象
CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC,IID_ICreateDevEnum,(void **)&pDevEnum);

//创建视频采集设备枚举COM对象
pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pClsEnum,0);
if(pClsEnum == NULL)
{
MessageBox(_T("Sorry, you have no video capture hardware.\r\n\r\nVideo capture will not function properly."));
//如果没有设备,返回
return ;
}

IMoniker *pMoniker = NULL;
//如果先前的createclassenumerator调用成功了,可以用ienummoniker::next得到设备
if(pClsEnum->Next(1,&pMoniker,NULL)==S_OK)
{
//调用imoniker::bindtoobject建立一个和选择的device联合的filter
pMoniker->BindToObject(0,0,IID_IBaseFilter,(void **)&pSrc);
pMoniker->Release();
}

//将设备添加到管理器graph
hr = pGraph->AddFilter(pSrc, L"Video Capture");
//---------------------------------------------------------------------------
//视频开始采集----------------------------------------------------------------//
IFileSinkFilter* fsFilter=NULL;
IBaseFilter* vedioWriter=NULL; //设置保存文件并初始化vedioWriter
hr=pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi,L"D:\\A.avi",&vedioWriter,&fsFilter);

//保存文件
hr=pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,pSrc,NULL,vedioWriter);

IMediaControl *pMC = NULL;
hr=pGraph->QueryInterface(IID_IMediaControl, (void **)&pMC);

hr=pMC->Run(); //运行Filter Graph if(FAILED(hr))
{
MessageBox(_T("加载运行失败!"));
return ;
}


运行采集时,在D:\\A.avi里找到了A.avi ,可是用暴风影音打开A.avi 时显示“头文件不完整,不是标准的视频文件”。之前采集到的视频都可以正常播放,现在不知出了什么问题(代码没什么大变化)。...
...全文

相关推荐

DirectShow视频采集系统

MCI技术虽然可以在一些简单的场景下实现媒体文件的播放,但它并不支持可变比特率的压缩算法,也无法很好地处理近年来出现的新媒体格式,如DVD。

beibei0115

VC++与DirectShow的视频采集实战指南

DirectShow是微软公司提供的一套开放的、基于组件的多媒体架构,用于处理多媒体数据流。它允许开发者轻松地进行音频和视频的捕获、播放、编辑以及格式转换等任务。DirectShow以组件化的Filter为基本单位,通过Graph来组织这些Filter,从而实现复杂的数据处理流程。DirectShow框架的核心是Filter Graph Manager,它负责管理整个Filter Graph的生命周期,包括创建、执行、停止以及释放资源。

坚持坚持那些年

DirectShow实现多路视频采集与预览实战

DirectShow是微软公司推出的一个基于COM(组件对象模型)的流媒体处理框架,它允许开发者以组件化的方式捕捉、处理和播放多媒体数据流。DirectShow的推出,为处理视频和音频数据流提供了一个强大而灵活的平台,广泛应用于视频编辑、流媒体播放、实时监控等领域。在深入了解DirectShow框架时,我们首先需要掌握其核心概念,如Filter Graph、Filters(过滤器)、Pins(引脚)等,这些都是构成DirectShow系统的基础组件。

DataWizardess

VC++实现视频采集

DirectShow是Microsoft开发的一个组件对象模型(COM)框架,专门用于多媒体流处理,包括视频和音频的捕获、编辑和播放。

funing8258

DirectShow开发音视频聊天程序.pdf

在开发音视频聊天程序时,DirectShow扮演着核心角色,尤其在实时通信工具如MSN和QQ中,它提供了丰富的接口和组件来实现视音频的采集、编码、传输和播放。

Rose520817
评论 5
收藏 已收藏
分享
返回顶部