这个实例是一个media foundation 摄像头采集的例子, 是我从一个开源工程里抽出来的。加入画面旋转, 快照, 显示窗口切换的功能。还有最出彩的就是这个采集可以对任意视频硬件进行多实例采集,不受设备独占的影响,可以满足特殊场合的使用。
大家可以用来学习,可以直接使用。代码是2013工程,直接可以编译运行。
代码下载 : https://download.csdn.net/download/wanghaisheng/13047600
一、基本使用
核心代码的调用很简单,看下面:
int iRotation = 90;
m_CapPreview.MFInit(0, GetDlgItem(IDC_STATIC_PLAY2)->m_hWnd, iRotation);
m_CapPreview.MFSetMsgParent(this->m_hWnd);
这样就可以运行采集了。
MFInit() 初始化参数,第一个设备索引,第二个是要显示的窗口,显示的窗口可以在显示过程动态切换。只需要调用一下MFSetPlayWnd()函数就可以了。
第三个是旋转的角度,值是 90 180 270, 不是这三个值内部会转成这三个值。这个角度不能动态切换,只能在初始化时设入。如果要改变只能重新初始化。
MFSetMsgParent() 这个函数是设置一个接收窗口消息的窗口。 为什么会有这个呢,原因是内部为了能自动根据窗口大小的变化进行适应,所以接管了显示窗口的消息,如果你还想得到这些消息就要设置一个窗口来接收。这样才能完成拖动,右键菜单一类的功能。
快照功能如下调用
if (m_CapPreview.MFIsStart()){
m_CapPreview.MFSnapshot("d:\\snapshot.bmp");
}
MFSnapshot()只有一个生成文件位置的参数, 生成的图片格式是 bmp, 它大的大小受当前显示窗口大小的限制,因为它是从显示模块中生成的,当然你也可能从媒体数据中直接生成图片这样就大了。
最后一个重要的地方是数据的回吐,就是采集的数据在哪里请看下面
int CMFDevCapture::MFMediaDataCB(LONGLONG llSampleTime, LONGLONG llSampleDuration, const BYTE * pSampleBuffer, DWORD dwSampleSize)
{
TRACE(" *** Video frame size = %d\n", dwSampleSize);
return 0;
}
如上代码就是回吐数据,你可以对数据进行进一步的处理转发等。任由你去处理。
二、类的说明
- CMFDevCapture 是最上层的逻辑包装类。所有的调用逻辑都这个类中完成。
- MFUtils 是Media foundation 包装类,对Media foundation进行了功能性封装,方便调用。
- DisplayWatcher 是回显的类。
- SampleGrabberCB 是数据捕获回调类
- mf_devices 这文件里封装设备遍历,有音视频的设备,很好用。
大家自己来发挥使用吧, 里面现在只采集视频,你可以尝试采集音频,随你玩