视频画中画的实现(ddraw)

【ffmpeg命令入门】实现画中画 FFmpeg 是一款强大的多媒体处理工具,广泛用于音视频的录制、转换和流处理。它不仅可以处理基础的音视频转换,还能实现复杂的视频编辑效果,比如画中画(Picture-in-Picture, PiP)。画中画是一种常见的视频特效,将一个视频嵌入到另一个视频的特定位置,从而同时显示两个视频流。本文将介绍如何使用 FFmpeg 实现画中画效果,帮助你掌握这一强大功能。通过本文的介绍,你已经了解了如何使用 FFmpeg 实现画中画效果。 阅读详情

1 需要具备的基础知识:用ddraw来显示视频,C++,MFC

 

先来看看效果:

 

画中画效果

 

 

其中较大的视频区域是用鼠标截取屏幕放大后的显示。较小的视频区域则是原视频显示。其中可以在右下角的视频区域看见有一个白色的长方体,这个长方体对应的区域则是截取放大的区域,通过移动白色长方体可以调整放大的区域,通过移动鼠标滚轮可以放大和缩小白色区域,其中放大的视频区域一起变化。

 

2该功能的好处,可以随意的放大视频区域中某一个部位,可以随时调整放大的区域,并进行观察。

 

 

3 实现方式

两个视频区域的实现:

实现两个视频区域其实很简单,在离屏表面上叠加两次视频即可出现两个视频效果。先叠加放大的视频,再叠加正常视频。叠加过程中有个技巧,需要计算在屏幕上截取的视频数据,然后将这部分数据显示在大的视频窗口,然后将正常视频数据显示在右下角。

 

计算截取视频数据的方法:

大家知道,通过BLT 方法叠加上视频数据有两个参数,一个是视频数据的RECT,一个是显示窗口的RECT,

m_lpDDSOffScrInfo->Blt( &rcWnd, m_lpDDSOffScrVideo, &rcVF, DDBLT_WAIT, NULL );

其中rcWnd是视频窗口,rcVF是视频数据。

我们可以利用这一点,比较简单的来找到需要放大的视频数据。在视频截取的过程中,我们知道了视频截取的位置,也知道显示视频的窗口位置,通过他们之间的相对值,可以计算出视频数据中需要显示的RECT的大小,因此,只需要改变rcVF的范围,就可以实现截取视频的显示。

代码:

//

opencv+vs 实现画中画 c语言 opencv+vs 实现画中画c语言 源代码 任意位置 加了出界判断 立即下载

相关推荐

画中画 视频叠加 视频覆盖 overlay

简单的画中画播放器,实现一个画中画的播放器,如图.即将解码出的一帧pFrameYUV先缩小成pFrameYUV2,然后直接对pFrameYVU进行覆盖.

画中画

<br />void BaseApplication::createCamera(void) { // 主窗口摄像机 mCamera_1 = mSceneMgr->createCamera("Cam_1"); mCamera_1->setPosition(Vector3(0,0,300)); mCamera_1->lookAt(Vector3(0,0,-300)); mCamera_1->setNearClipDistance(5); // 画中画摄像机 mCamera_2

霧谷龍視-专栏 656

FFMPEG分屏显示之平方数分屏

这是在VS中用FFMPEG滤镜实现的分屏显示,是平方数分屏,C++开发。

DircetDraw c/c++ 使用指导()

DircetDraw c/c++ 使用指导310cdt 译边看边译,译完就拿了上来,见笑了这是一系列的DirectDraw的指南,教你一步步的去构建一个简单的DirectDraw应用.这个指南用到了sdk包提供的很多DirectDraw的例子.这些例子展示了怎样设置DirectDraw,怎样用DirectDraw方法实现一般任务:注意:这些指南中的例子是用c++写的.如果你使用的是c编

310cdt的专栏 1389

ddraw入门实例

//******************************************************************* // 工程:hello // 文件:hello.cpp // 内容:创建第一个DirectDraw应用程序, //*******************************************************************

龙图腾的博客 5490

ffmpeg实现画中画

本篇博客相比上一篇《ffmpeg滤镜学习一,movie+overlay滤镜实现视频加水印、画中画》更深入一些,本次的实现,可以控制子画面出现的时间段、子画面播放时间等,这篇文章主要参考了大师兄悟空公众号下的文章《使用 FFmpeg 实现画中画效果()》,下面看一下具体实现: 首先提出5个问题: 子画面展示位置? 子画面从主画面的哪个时间点开始播放? 子画面从子画面的...

liupenglove的专栏 4766

使用ddraw视频上画字和画框(使用ddraw添加水印)

视频上叠加字符或者画框(或者说添加水印)方法有很多种,下面列出3种: 1.将我们要添加的水印与视频数据进行融合; 2.使用D3D; 3.使用ddraw。 这三种方式我都会进行一个简单的描述,本文先说说使用ddraw的方式。 先参考一下https://blog.csdn.net/ww506772362/article/details/51034549#commentsedit一文说的很好。 需...

学无止尽,谨言慎行! 1606

基于DDraw视频渲染实现

基于DDraw实现视频渲染思路 要注意的事项 1、显卡对不同的显示模式支持不同,包括是否支持Overlay/colorkey、支持不同的FOURCC格式等。不考虑这个问题的话,很有可能创建离屏表面不成功。 2、视频解码出来的格式可能需要经过转换后方可通过DDRAW进行渲染。 实现思路: 1、创建视频解码格式(如YV12)到其他FOURCC格式的转换函数指针数组,并实现相关的转换函数...

weixin_30593443的博客 314

最简单的DDRAW C代码实现(只支持YUV420数据)

<br /><br />#include <tchar.h><br />#include <ddraw.h><br />#pragma comment(lib, "dxguid.lib")<br />IDirectDraw7 *pIDirectDraw7;<br />IDirectDrawSurface7 *pIDirectDrawSurface7Primary;<br />IDirectDrawSurface7 *pIDirectDrawSurface7OffScreen;<br />DDSURFACED

markman101---神即是道 道法自然 如来 2351

ddraw 视频下画图 不闪烁的方法

我们如果是在在RGB视频上画图(直线,矩形等),一般采用双缓冲区继续,使用内存MemoryDC,来实现画的图形在视频上显示不闪烁的功能,但是我们知道用RGB显示视频都是使用GDI进行渲染,这样很耗CPU,那么我们能不能在YUV上进行视频渲染呢,答案是肯定的,使用ddraw直接显示yuv就ok了,可以支持yuv422和yuv420的直接使用显卡显示,不耗CPU,但是我们在使用ddraw显示时,然后在

smilestone322的专栏 4282

ddraw 视频下画图

我们如果是在在RGB视频上画图(直线,矩形等),一般采用双缓冲区继续,使用内存MemoryDC,来实现画的图形在视频上显示不闪烁的功能,但是我们知道用RGB显示视频都是使用GDI进行渲染,这样很耗CPU,那么我们能不能在YUV上进行视频渲染呢,答案是肯定的,使用ddraw直接显示yuv就ok了,可以支持yuv422和yuv420的直接使用显卡显示,不耗CPU,但是我们在使用ddraw显示时,然后在

ww506772362的专栏 2043

C++ 封装 ddraw渲染视频图像

使用硬件加速,视频绘制,ddraw 完美封装类,C++类,视频播放器

基于Win32桌面应用程序和OpenCV的画中画效果播放器。

能够通过文件选择对话框选定两个视频文件 能通过菜单选择任意一个视频进行播放,具有播放、暂停、停止功能。 能通过菜单选择画中画效果,即在播放某一个视频时,同时把另外一个视频缩小至前一个视频画面的右上角一同播放。在画中画播放过程中,任意视频如果播放到结尾,该视频就从头重播,周而复始。

ddraw transparency (overlay 实现) 1

现在开始研究ddraw绘制overlay透明表面到我的视频播放窗口,现在做到的是只能实现全透某一个RGB范围,用到的是ddraw里的关键色(colorkey),步骤如下:   1.创建主表面    设置一般窗口控制级   2.在主表面绘制播放器背景   3.在主表面用di

80后程序员的技术分享 2180

WINCE下如何使用DDRAW在GDI对话框中绘制动画

问题是如下的,在嵌入式WINCE中使用GDI绘制动画(或者叫做视频),速度过于缓慢,一般在80~100MS上,所以想到了使用DDRAW。因为他可以直接操作显存。速度快。但是不要求DDRAW画满整个屏幕,只需要在GDI对话框中显示一个窗口动画。而在WINCE下不支持DDRAW的窗口模式的有些宏,比如:ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;所以不知道在WINCE如何使用DDRAW窗口模式实现以上功能,向各位请教。最好提供例子代码,谢谢!

rea526的专栏 826

D3D Surface/Texture SDL DDraw渲染视频的区别和疑问

1  D3D  Surface用起来比较简单,窗口改变时视频模糊,貌似是初始化窗口过小。全屏时有锯齿。    StretchRect的Rect是显示区域宽高,这个值固定是初始值。改成随窗口变化,失败。 2  D3D Texture用起来复杂些。跟显示区域宽高无关。   问题:1窗口改变时视频模糊   2全屏时有锯齿。 3  SDL开源,效果也不好。 4  DDraw比较老了,但效果最好,...

chenquangobeijing的专栏 2282

画中画实现

//画中画         public void pop(PictureBox[] controlCloneVideo)         {             Point n = new Point();             for (int j = 0; j              {                 Point p = new Point();   

panruola的博客 2838
上一篇: map.insert 出错想到的
下一篇: 变量一定要初始化
zhshgap
博客等级 码龄20年 9粉丝 16原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值