DirectShow高手请进!

sunhongdi 2006-10-13 10:54:44
我想做一个关于USB摄像头的时时截图程序。
我现在也找了一些资料,但是都很零散,
如果有人做过方面的东西,
我想知道,我应该先看什么,举个例子,
我要自己建一个Filter吗?
希望可以给我点具体的建意,
我现在手头有DirectSHow开发指南,因为,现在时间紧,我想知道,我应该从第几章开始看。
谢谢
...全文
236 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
taianmonkey 2006-10-30
  • 打赏
  • 举报
回复
应该从代码看起!看书早着呢!
可以参考:
DXSDK\Samples\C++\DirectShow\Capture\AMCap
hony688 2006-10-24
  • 打赏
  • 举报
回复
不复杂,可以自己写一个,但是要是时间紧的话,可以直接用在dshow上开发的activeX控件,就几行代码,就可以实时抓图了.典型的有avplate, avcapture.后者好象要注册一下.你找找吧
WANGHARRY 2006-10-20
  • 打赏
  • 举报
回复
第一章看起!MSDN查 不行问陆其明的老婆谭结红
jiangzy1109 2006-10-18
  • 打赏
  • 举报
回复
在DirecrX Show的帮助文档上有详细的说明,你再仔细看看吧!

jiangzy1109 2006-10-18
  • 打赏
  • 举报
回复
截取静态图片需要用到ISampleGrabberCB接口。
自己写个类,继承这个接口。截图主要在回调函数中完成。
class SampleGrabberCallback : public ISampleGrabberCB
{
public:
// Fake referance counting.
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();

STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject);

STDMETHODIMP SampleCB(double Time, IMediaSample *pSample);

STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen);
};

SampleGrabberCallback g_StillCapCB;
AM_MEDIA_TYPE g_StillMediaType;
bool bOneShot;

STDMETHODIMP_(ULONG) SampleGrabberCallback:: AddRef()
{
return 1;
}

STDMETHODIMP_(ULONG) SampleGrabberCallback:: Release()
{
return 2;
}

STDMETHODIMP SampleGrabberCallback::QueryInterface(REFIID riid, void **ppvObject)
{
if (NULL == ppvObject) return E_POINTER;

if (riid == __uuidof(IUnknown))
{
*ppvObject = static_cast<IUnknown*>(this);
return S_OK;
}
if (riid == __uuidof(ISampleGrabberCB))
{
*ppvObject = static_cast<ISampleGrabberCB*>(this);
return S_OK;
}
return E_NOTIMPL;
}

STDMETHODIMP SampleGrabberCallback::SampleCB(double Time, IMediaSample *pSample)
{
return E_NOTIMPL;
}

STDMETHODIMP SampleGrabberCallback::BufferCB(double Time, BYTE *pBuffer, long BufferLen)
{
// if ((g_StillMediaType.majortype != MEDIATYPE_Video) ||
// (g_StillMediaType.formattype != FORMAT_VideoInfo) ||
// (g_StillMediaType.cbFormat < sizeof(VIDEOINFOHEADER)) ||
// (g_StillMediaType.pbFormat == NULL))
// {
// return VFW_E_INVALIDMEDIATYPE;
// }
if (! bOneShot) return VFW_E_INVALIDMEDIATYPE;
HANDLE hf = CreateFile("C:\\Example.bmp", GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
if (hf == INVALID_HANDLE_VALUE)
{
return E_FAIL;
}
long cbBitmapInfoSize = g_StillMediaType.cbFormat - SIZE_PREHEADER;
VIDEOINFOHEADER *pVideoHeader =(VIDEOINFOHEADER*)g_StillMediaType.pbFormat;

BITMAPFILEHEADER bfh;
ZeroMemory(&bfh, sizeof(bfh));
bfh.bfType = 'MB'; // Little-endian for "MB".
bfh.bfSize = sizeof( bfh ) + BufferLen + cbBitmapInfoSize;
bfh.bfOffBits = sizeof( BITMAPFILEHEADER ) + cbBitmapInfoSize;

// Write the file header.
DWORD dwWritten = 0;
WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );
WriteFile(hf, HEADER(pVideoHeader), cbBitmapInfoSize, &dwWritten, NULL);
WriteFile( hf, pBuffer, BufferLen, &dwWritten, NULL );
CloseHandle( hf );

bOneShot = false;
return S_OK;
}

nicejane 2006-10-17
  • 打赏
  • 举报
回复
你可以看一下DirectShow的示例代码!具体位置为:

SDK安装的目录\Samples\C++\DirectShow\Capture
sheltonwan 2006-10-17
  • 打赏
  • 举报
回复
直接看directx中的directshow文档吧,看using directshow
rageliu 2006-10-16
  • 打赏
  • 举报
回复
不需要,枚举取得采集设备加入Graph就可以

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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