DShow 菜鸟初问:怎么用 VMR 实现多路视频图象的叠加?。。

jessiepan 2006-12-08 01:59:29
我已经用 VMR 实现了一路视频图象的输出(视频源为多媒体文件),现在想同时打开两个视频文件,然后用VMR实现两路视频图象的叠加。该怎么做呢?
...全文
397 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jessiepan 2007-01-17
  • 打赏
  • 举报
回复
我是楼主。 怎么高手都不愿意出来帮帮手啊? 哎, :( 自己搞不定呢

IVMRMixerBitmap 用它来叠加中文字摹的时候,怎么改变中文的字体呢?比如:什么黑体、楷体、仿宋体等等。。。 又或是改变中文字摹的大小,比如:一号、二号、三号、四号、小四等等。。 像WORD里那样的处理 。 还有,怎么改变叠加的位置?比如:在左上角、左下角、右上角、右下角的。。

谢谢啊!~~~ 分不够,可以再加呢
jessiepan 2007-01-08
  • 打赏
  • 举报
回复
lserlohn() ( ) 信誉:100 Blog 2006-12-15 16:30:33 得分: 0

是这样的,单纯的叠加字幕很简单,但是如果考虑到时间同步,那就很复杂了。能否考虑用现成的叠加字幕的filter,就是看电影老用的那种〉?

==================================================================

lserlohn() ,谢谢!单纯的叠加字幕我已经实现了,是用这个IVMRMixerBitmap 来做的吧?。。 我现在想实现叠加系统的实时时间(动态的),该怎么做呢?

请各位老鸟帮帮我这个菜鸟 :) 谢谢先!
jessiepan 2007-01-05
  • 打赏
  • 举报
回复
heliang1108() ( ) 信誉:100 Blog 2006-12-15 15:29:54 得分: 0

添加字幕就是自己对视频数据进行操作,把字幕加上去不就好了?

================================================================

大哥,我说了我是DSHOW方面的菜鸟,感觉您说的这段话跟没说一样啊:( 哎!您的意思是要自己接管视频数据?那不是要自己写个 filter 么??

不过,还是谢谢你了!继续问我的问题。。。
lserlohn 2006-12-15
  • 打赏
  • 举报
回复
是这样的,单纯的叠加字幕很简单,但是如果考虑到时间同步,那就很复杂了。能否考虑用现成的叠加字幕的filter,就是看电影老用的那种〉?
何亮-1108 2006-12-15
  • 打赏
  • 举报
回复
添加字幕就是自己对视频数据进行操作,把字幕加上去不就好了?
jessiepan 2006-12-15
  • 打赏
  • 举报
回复
lserlohn() ( ) 信誉:100 Blog 2006-12-13 23:49:11 得分: 0

是啊,这跟叠加视频并无本质区别。

而且网上有好多例子吧?

====================================================

大哥,能不能讲讲在一路视频图象上叠加字摹或是实时时间的原理或是工作流程?前面多路视频图象的叠加比较简单,只要连接DS几个自带的filter的PIN,并简单操作Filter Graph,即OK了。但现在字摹和实时时间不是简单、现成的视频流数据,那需要我该怎么处理呢?我刚学DShow,还不太清楚啊。。要自己写filter来实现吗,还是利用DShow里自带的filter就可以完成这个功能?

在网上没找到好的这方面的DEMO,哪位大虾能不能给个合适的链接?小弟拜谢!
lserlohn 2006-12-13
  • 打赏
  • 举报
回复
是啊,这跟叠加视频并无本质区别。

而且网上有好多例子吧?
何亮-1108 2006-12-13
  • 打赏
  • 举报
回复
如果能拿到视频数据,自己叠加好了!
jessiepan 2006-12-13
  • 打赏
  • 举报
回复
哦,谢谢!我现在已经成功的实现了两路视频图象(同时播放两个视频文件)的叠加。

有个新的类似问题,我想再问一下:如果我要在播放一路视频图象的时候,在播放窗口上的任意位置叠加字摹(任意的字符)或是实时的时间,该如何来做? 也是要用 Video Mixing Renderer 来实现吗?
happydeer 2006-12-12
  • 打赏
  • 举报
回复
sdk里面有例子的
Samples\C++\DirectShow\VMR9\Blender
lserlohn 2006-12-12
  • 打赏
  • 举报
回复
没错,是这样的
jessiepan 2006-12-11
  • 打赏
  • 举报
回复
lserlohn(),谢谢!大概明白你的意思了。。

你是说要用 IVMRMixerControl::SetOutputRect 这个方法来设置两路需要叠加的视频的坐标位置吗? 关于这个方法,小弟还有个不太明白的地方,想再问问:
HRESULT SetOutputRect(
DWORD dwStreamID,
const NORMALIZEDRECT* pRect
);
const NORMALIZEDRECT* pRect 这个在 DSHOW 的相关文档里定义成了一个“规格化的矩形”,坐标值为(0.0,0.0,1.0,1.0),当为这个坐标值时,相当于是“整个区域”显示。
我的部分代码如下:
RECT rc;
HWND hPic = ::GetDlgItem(m_hWnd, IDC_STATIC1);
::GetClientRect(hPic, &rc);

//NORMALIZEDRECT r= {rc.left, rc.top,rc.right,rc.bottom};
NORMALIZEDRECT r= {0.0,0.0,1.0,1.0};
hr = pMix->SetOutputRect(0, &r);
hr = pMix->SetOutputRect(1, &r);

实际上,我的视频图象是要在 IDC_STATIC1 即 rc,这个区域范围内显示(IDC_STATIC1为我定义的一个静态文本框区域)。 那么 RECT rc 和 NORMALIZEDRECT r 之间是有个相对应的转换关系了? 比如:我如果要在整个 RECT rc 范围内显示图象,则NORMALIZEDRECT r= {0.0,0.0,1.0,1.0}; 如果只是在 RECT rc 范围的左上四分之一区域(2*2分割,显示4路图象),那么NORMALIZEDRECT r= {0.0,0.0,0.5,0.5}; 是我这样理解的吗??

thanks...
lserlohn 2006-12-08
  • 打赏
  • 举报
回复
就是把两路图像的坐标设定相同的值,然后调整透明度的系数

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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