DShow捕捉视频采集卡的问题,急急急

halleyzhang3 2015-01-23 05:44:41
用DShow捕捉视频采集卡的信号实现远程视频,现在遇到的问题是:十次里有差不多有9次正常,但偶尔会有不出视频的情况,所有调用和初始化都成功,但就是Grabber收不到数据。把Graph存起来用GraphEdi打开,成功和失败情况的Graph是一样,在GraphEdit里播放也是正常的。更为奇怪的线索是Debug调试总是不出视频,直接运行(还是Debug版程序)一般都可以,而且在Debug时pGraph->Run()后面加个断点断一下,再继续也正常了。但是用Sleep或者MessageBox模拟断点的效果却不起作用。
请各位老大帮我分析分析,可能是什么原因。
我创建Graph是让系统自动连接的,过程大概是这个样子

hr = m_pGraph.CoCreateInstance( CLSID_FilterGraph );
hr = m_pGraph->AddFilter( pCap, L"Cap" );
hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
hr = m_pGrabber->SetMediaType( &VideoType ); // shouldn't fail
hr = m_pGraph->AddFilter( pGrabBase, L"Grabber" );
CComPtr<ICaptureGraphBuilder2> pCGB2;
hr = pCGB2.CoCreateInstance (CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC);
hr = pCGB2->SetFiltergraph( m_pGraph );
IAMStreamConfig *pVSC; // for video cap
hr = pCGB2->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Interleaved,
pCap, IID_IAMStreamConfig, (void **)&pVSC);
if(hr != NOERROR)
{
hr = pCGB2->FindInterface(&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video, pCap,
IID_IAMStreamConfig, (void **)&pVSC);
}
AM_MEDIA_TYPE *pmt;
hr = pVSC->GetFormat(&pmt);

// DV capture does not use a VIDEOINFOHEADER
if(hr == NOERROR)
{
if(pmt->formattype == FORMAT_VideoInfo)
{
VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *)pmt->pbFormat;
if(m_nVideoQualityMode)
pvi->AvgTimePerFrame = (LONGLONG)(10000000 / m_nVideFrameRate);
...
hr = pVSC->SetFormat(pmt);
}
DeleteMediaType(pmt);
}
hr = pCGB2->RenderStream(
&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Interleaved,
pCap,
pGrabBase,
pRenderer);
if (FAILED (hr))
{
// try to render preview pin
hr = pCGB2->RenderStream(
&PIN_CATEGORY_PREVIEW,
&MEDIATYPE_Video,
pCap,
pGrabBase,
pRenderer);

// try to render capture pin
if( FAILED( hr ) )
{
hr = pCGB2->RenderStream(
&PIN_CATEGORY_CAPTURE,
&MEDIATYPE_Video,
pCap,
pGrabBase,
pRenderer);
}
}
AM_MEDIA_TYPE mt;
hr = m_pGrabber->GetConnectedMediaType( &mt );

VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;

vih->bmiHeader.biSize=m_BmpU->bmiHeader.biSize;
vih->bmiHeader.biWidth=m_BmpU->bmiHeader.biWidth;
vih->bmiHeader.biHeight=m_BmpU->bmiHeader.biHeight;
vih->bmiHeader.biPlanes=m_BmpU->bmiHeader.biPlanes;
vih->bmiHeader.biBitCount=m_BmpU->bmiHeader.biBitCount;
vih->bmiHeader.biSizeImage=m_BmpU->bmiHeader.biSizeImage;

m_pGrabber->SetMediaType(&mt);

mCB.pOwner = this;
mCB.lWidth = vih->bmiHeader.biWidth;
mCB.lHeight = vih->bmiHeader.biHeight;
FreeMediaType( mt );

hr = m_pGrabber->SetBufferSamples( FALSE );
hr = m_pGrabber->SetOneShot( FALSE );
hr = m_pGrabber->SetCallback( &mCB, 1 );

CComQIPtr< IVideoWindow, &IID_IVideoWindow > pWindow = m_pGraph;
hr = pWindow->put_Owner( (OAHWND) m_VideoWnd );
..

CComQIPtr< IMediaControl, &IID_IMediaControl > pControl = m_pGraph;
hr = pControl->Run( );
.
...全文
418 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
halleyzhang3 2015-01-26
  • 打赏
  • 举报
回复
找到原因了。散分走人
halleyzhang3 2015-01-24
  • 打赏
  • 举报
回复
引用 2 楼 u010806377 的回复:
directshow本身做视频就不太稳定,你这样写的话,只能看本地的,远程的看不了,要写FILTER进行采集。交流Q:1049568282
m_pGrabber就是Filter,只是现在关注的是本地视频出不来,这部分就省略不贴了
halleyzhang3 2015-01-23
  • 打赏
  • 举报
回复
另外说明的是,用USB摄像头始终正常。 开始我怀疑采集卡是不是要用crossbar选择一下端口,但现在觉得graphEdit每次都能正常运行,说明系统自动连接的没有错,问题可能出在别处。

2,554

社区成员

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

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