VMR技术(Video Mixer Render)

本文详细介绍了VMR(Video Mixer Render)技术,包括其无窗口和窗口模式,以及如何使用VMR捕获图像帧。文章通过CVMR_Capture类展示了VMR的实现,包括初始化、资源管理、设备枚举、图像处理和颜色空间转换等功能,适用于视频图像处理和分析的场景。
摘要由CSDN通过智能技术生成

Video Mixer Render

流畅预览视频的同时捕捉图像帧,转换颜色空间RGB到YUV420/I420,供视频图像处理算法处理,或直接保存RGB/YUV格式文件。视频显示根据有无窗口可分为有窗口模式和无窗口模式。Video Renderer只支持窗口模式,VMR支持有窗口(Window)和无窗口(Windowless)两种模式,默认支持有窗口模式。在无窗口模式中,可以把视频和应用程序主界面的窗口捆绑。VMR在清晰、流畅显示视频的同时,可以灵活地捕获图像帧,这也是选择VMR技术的一个重要原因,因为我们想直接对图像数据进行处理。


主要类分析如下:

CVMR_Capture完成采集视频、预览视频和捕获图像帧的任务

根据GraphEdit的滤波器内容和链表的操作,编程实现使用VMR技术显示、捕捉图像。

 CVMR_Capture定义在头文件VMR_Capture.h中。

enum PLAYER_STATE {INIT,RUNNING,PAUSED,STOPPED};

class CVMR_Capture

{

public:

 CVMR_Capture();                                  //类构造器

 virtual ~CVMR_Capture();                        //类析构器

 int EnumDevices(HWND hList);               //枚举设备

 HRESULT Init(int iDeviceID,HWND hWnd,int iWidth,int iHeight); 
 //根据设备索引号初始化

 DWORD GetFrame(BYTE ** pFrame);        //获取捕获的图像帧

 BOOL Pause();                              //暂停预览、捕获

 DWORD GrabFrame();                         //截获图像

 void CloseInterfaces(void);                    //关闭接口,释放资源

 void SaveGraph(CString wFileName);           //保存滤波器链表

protected:

 IGraphBuilder          *m_pGB;             //滤波器链表管理器

 IMediaControl          *m_pMC;             //媒体控制接口

 IMediaEventEx          *m_pME;             //媒体事件接口

 IVMRWindowlessControl9 *m_pWC;             //VMR-9接口

 IPin                   *m_pCamOutPin;      //视频采集滤波器引脚

 IBaseFilter                *m_pDF;             //视频采集滤波器

 PLAYER_STATE            m_psCurrent;

 int        m_nWidth;                           //图像帧宽度

 int        m_nHeight;                          //图像帧高度

 BYTE   *m_pFrame;                          //捕获的图像帧数据指针

 long   m_nFramelen;                           //捕获的图像帧数据大小

 bool BindFilter(int deviceId, IBaseFilter **pFilter);      //设备与滤波器捆绑

 HRESULT InitializeWindowlessVMR(HWND hWnd);    //初始化无窗口模式的VMR

 HRESULT InitVideoWindow(HWND hWnd,int width, int height);  //初始化视频窗口

 void StopCapture();

 void DeleteMediaType(AM_MEDIA_TYPE *pmt);                        //删除媒体类型

 bool Convert24Image(BYTE *p32Img,BYTE *p24Img,DWORD dwSize32); //颜色空间转换

private:

};

CVMR_Capture类封装了使用VMR技术的成员函数和成员变量,包括类的构造器、析构器,滤波器链表管理器接口、媒体控制接口、媒体事件接口,图像帧的宽度、高度及操作VMR的保护成员函数等。

 CVMR_Capture有关初始化、析构等,类实现VMR_Capture.cpp文件中。

//释放资源的宏

#define RELEASE_POINTER (x) { if (x) x->Release(); x = NULL; }

 

/**************************华丽分割线*******************************/

/*类构造器*/

CVMR_Capture::CVMR_Capture()

{

 CoInitialize(NULL);                          //初始化COM

//接口指针清空

 m_pGB = NULL;      m_pMC = NULL;       

m_pME = NULL;       m_pWC = NULL;

 m_pDF =NULL;             m_pCamOutPin =NULL; 

m_pFrame=NULL;        m_nFramelen=0;

 m_psCurrent=STOPPED;

}

/*类析构器*/

CVMR_Capture::~CVMR_Capture()

{

 CloseInterfaces();                           //清空指针、释放资源

 CoUninitialize( );                       //卸载COM

}

/*释放所有资源,断开链接*/

void

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值