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