在正在播放的视频文件上叠加图片解决方法
发布时间:2011-06-27 19:17:47 文章来源:www.iduyao.cn 采编人员:星星草
在正在播放的视频文件上叠加图片
程序代码
介绍
在正在播放的视频上显示一些图象似乎很难。在这里,我试图在一个视频上显示一个图片。并不是一个静止的图片,还要以动态的显示连续几张图片。
升级
我升级我的cVideo类用来动态显示几个图片。不仅这些,还要控制图片显示的透明度。看一下“深入DirectShow”一会就会明白怎么做。
背景:
在视频上动态显示图片需要DirectShow的相关技术和对图象的过滤技术。比如添加图形过滤VMR9(video mixing renderer)。VMR9是一把钥匙,允许我们在一个视频上显示图片。
建立环境:
所有想要使用DirectShow的程序必须包含 Dshow.h头文件,并使用Strmiids.lib库文件。
深入DirectShow:
在视频上显示图象技术是基于IVMRMixerBitmap9类,该类只有三个成员函数。
其它还有一个结构VMR9AlphaBitmap,用来在函数中传输数据。一些 VMR9AlphaBitmap的成员如下:
DWORD dwFlags;
HDC hdc;
RECT rSrc;
VMR9NormalizedRect rDest;
FLOAT fAlpha;
COLORREF clrSrcKey;
现在说一下如何使用这些。让我们看看怎样在开始的时候引入。首先,需要知道:
我们选定(SelectObject)图片的设备描述hDC,
其它重要的是图片的尺寸,
第三件事是在视频上显示图片的位置(一个rect),
透明的程度,指定图片在视频上的透明度,
隐藏图片背景原色的颜色值;将其设置为背景色;不只是隐藏背景,可以给出任何颜色值,然后该颜色可以作为透明色在视频上显示,最后,设置添入数据的标志。
现在一些都OK了,只是调用SetAlphaBitmap()就可以了。
想了解更多内容,请访问博客。
基本初始化:
首先,我们需要建立一个图象管理过滤的对象(过滤图象管理是用来控制过滤和数据更新)。通过调用CoCreateInstance()来实现。这样,我们建立了一个图象过滤管理对象并得到一个指向IGraphBuilder类的指针。该类用来建立一个用户过滤图象(过滤图形是DirectShow过滤显示图象文件的全部功能)。
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
After creating the filter graph manager, the other important issue is the addition of VMR9 in the filter graph. But before addition, we need to create it, and after creation, we will add that filter (VMR9) to our filter graph.
CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC,
IID_IBaseFilter, (void**)&pVmr);
pGraph->AddFilter(pVmr, L"Video");
现在需要定义VMR9。象在这里的情况,我们设置在提供的窗口中显示一个视频,设置视频的位置。
pVmr->QueryInterface(IID_IVMRFilterConfig9, (void**)&pConfig);
pConfig->SetRenderingMode(VMR9Mode_Windowless);
pVmr->QueryInterface(IID_IVMRWindowlessControl9, (void**)&pWC);
pWC->SetVideoPosition(NULL, pRect);
pWC->SetVideoClippingWindow(pParentWnd->m_hWnd);
以下IVMRMixerBitmap9是用来提供在视频上显示图片的工具。和位图信息结构包含了要显示图片的数据。这里第一次调用时都清0。
pWC->QueryInterface(IID_IVMRMixerBitmap9, (LPVOID *)&pBmp);
ZeroMemory(&bmpInfo, sizeof(bmpInfo) );
以下是在任何DirectShow程序中都很重要的类,因为它提供了通过IMediaControl控制数据更新的工具,并关注任何重要的事件。例如文件播放结束,提供该功能的类是IMediaEventEx。使用该类,需要设定接受事件的窗口。其它重要的类有IMediaSeeking提供查找媒体文件的功能。
pGraph->QueryInterface(IID_IMediaControl, (void **)&pMC);
pGraph->QueryInterface(IID_IMediaEventEx, (void **)&pME);
pME->SetNotifyWindow ( ( OAHWND ) pParentWnd->GetParent()->m_hWnd,
WM_GRAPHNOTIFY, 0 ) ;
pGraph->QueryInterface(IID_IMediaSeeking, (void **)&pMS);
Now create the custom filter graph. And then run it. After this, the video will start playing in our given window.
pGraph->RenderFile(mFileToPlay, NULL);
pMC->Run();
显示图片:
我们需要做的是选定图片设备句柄,图片尺寸,需要图片透明的背景颜色。现在开始。首先得到播放视频窗口的句柄。现在需要另一个设备,必须和视频窗口的句柄兼容,现在选择该设备中的图片。
CDC * pdc = GetDC();
CDC mCompatibleDC;
mCompatibleDC.CreateCompatibleDC(pdc);
mCompatibleDC.SelectObject(hBitmap);
CRect reSrc(0,0,mBitmapWidth,mBitmapHeight);
现在显示图片的实际工作开始了。引入位图信息结构并设定参数,例如,设定标签,设定设备句柄和资源,图片的大小等。
bmpInfo.dwFlags |= VMRBITMAP_HDC;
bmpInfo.hdc = pDC->m_hDC;
bmpInfo.rSrc = rectSize; // Size of the image图片大小
设定在屏幕上显示图片的矩形区域
//rDest指定目的合成区域的矩形(0.0f 到 1.0f)
bmpInfo.rDest.right = 1.0f;
bmpInfo.rDest.left = 1.0f - 0.3;
bmpInfo.rDest.top =1.0 - 0.3;
bmpInfo.rDest.bottom = 1.0f;
Set the transparency level. // 设定透明的程度(1.0不透明,0.0透明)
bmpInfo.fAlpha = 0.0;
设定颜色值和标记,这里设置成绿色,这意味着任何图片上的绿色将显示成透明。
//设置COLORREF,这样位图的外框是透明的
bmpInfo.dwFlags |= VMRBITMAP_SRCCOLORKEY;
bmpInfo.clrSrcKey = RGB(0, 255, 0);
pBmp->SetAlphaBitmap(&bmpInfo);
使用代码:
我试图尽可能简化。我建立了一个cVideo类。该类隐藏所有复杂的部分。你只需要调用类的方法,类中方法解决了所有问题。
该类有以下方法:
void InitInterfaces(BSTR mFileToPlay, CWnd* pParentWnd, CRect* pRect);
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
DSHOW push
推模式,ConnectDirect 的,为什么我一直反回错误
下级级用的是HAALI的一个东西,用CMemStream拉模式的时候是可以连接的
...
-
ffmpeg编码后视频速度不正确,质量也不好,求助,求助,求助,求助啊
对采集到得摄像头图像进行编码保存,发现得到的视频质量不好,而且速度不...
-
请问怎么在live555中接收jpeg
请问,我现在想接收一个服务器发送的jpeg 不知道怎么用live555做一个客户端, 接收它并显示。
请问应...
-
XP SP3 YUV420 的fiter依赖 在线等答案……
链接时媒体类型为WMMEDIASUBTYPE_I420
有的XP可以播放出来
有的就不行,请问不能播放...
-
如何获取通过麦克风来获取当前说话的音量?
使用Wave系统API采集音频输入的数据,当数据缓存区满了后,收到消息取得数据后,如何根据这里...
-
RFC3984 有没有完整的中文版本呢?
搜了几个 都是一半英文一半中文的。哎 郁闷!
------解决方案--------------------
英文的凑合...
-
介绍一个学习directshow和com、atl技术的网站
有一个学习directshow和com、atl技术的网站,还可以下视频教程,共享给大家: http://www...
-
攻击帖:jrtplib、live555是个垃圾,刚开始搞流媒体就用这玩意就是找s
不解释~
来丢我砖头吧~~
我分太多了用不完~ 支持的散分~~~
...
-
50分,寻找《Visual C++音频/视频处理技术及工程实践》的随书光盘?
急于使用其中的几个例程。若哪位好心人能够提供,非常感谢!!我的QQ:52...
-
h264的高宽比怎么获取?
我看标准里面只有样点的高宽比啊。
还有,bit rate可以读出来吗?
------解决方案--------------------
是要...