首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

DirectShow采集到的视频无法播放,该如何处理

2012-02-22 
DirectShow采集到的视频无法播放DirectShow采集到的视频无法播放关键看视频开始采集的代码就OK了。C/C++ co

DirectShow采集到的视频无法播放
DirectShow采集到的视频无法播放
关键看视频开始采集的代码就OK了。

C/C++ code
 //采集相关的变量    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 时显示“头文件不完整,不是标准的视频文件”。之前采集到的视频都可以正常播放,现在不知出了什么问题(代码没什么大变化)。...

[解决办法]
要运行完stop后才能播放A.avi的,正在运行时正在往里面写数据,好多AVI的头都没有描述,一般是播不了的。
[解决办法]
线程里面处理不就行了,和一路差不多。

我录制的文件里面有时候也是没有头文件,用Media播放不出来,但用暴风就可以,少了RIFF的文件索引,不知道是什么原因。

热点排行