DirectShow采集到的视频无法播放

hrjhrj12345 2010-04-06 08:17:19
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 时显示“头文件不完整,不是标准的视频文件”。之前采集到的视频都可以正常播放,现在不知出了什么问题(代码没什么大变化)。...
...全文
153 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
个人空间啊 2011-03-08
  • 打赏
  • 举报
回复
看看隐藏内容,了解下 !
hrjhrj12345 2010-04-08
  • 打赏
  • 举报
回复
按照tufaqing的说法,运行完stop就可以播放采集的A.avi文件.
结贴了.
继续做多视频采集.
lili0920 2010-04-08
  • 打赏
  • 举报
回复
线程里面处理不就行了,和一路差不多。

我录制的文件里面有时候也是没有头文件,用Media播放不出来,但用暴风就可以,少了RIFF的文件索引,不知道是什么原因。
tufaqing 2010-04-06
  • 打赏
  • 举报
回复
要运行完stop后才能播放A.avi的,正在运行时正在往里面写数据,好多AVI的头都没有描述,一般是播不了的。
hrjhrj12345 2010-04-06
  • 打赏
  • 举报
回复
楼上说的非常正确.stop后就OK了.谢谢啦.

顺便问问,怎么实现多视频采集呢?
网上的都是一个视频的采集
哪里有多视频采集并实现保存的相关知识??

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧