博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EasyPlayerPro Windows播放器电子放大/局部放大播放功能实现
阅读量:4955 次
发布时间:2019-06-12

本文共 6770 字,大约阅读时间需要 22 分钟。

背景描述

在视频监控软件中,我们看到很多的软件都有电子放大功能, 按住鼠标左键不放,框选一个区域,再松开鼠标左键,即对选中的区域进行放大显示, 且可以重复该操作,逐步放大所需显示的区域, 有没有觉得,这个功能在视频监控软件中还是有他的用武地. 今天我们就来实现该功能;

EasyPlayerPro

实现流程

//设置电子放大起起始点int     SetElectronicZoomStartPoint(int channelId, float fXPercent, float fYPercent, unsigned char showBox);//设置电子放大结束点(在鼠标移动过程中可一直调用该函数)int     SetElectronicZoomEndPoint(int channelId, float fXPercent, float fYPercent);//设置是否放大显示int     SetElectronicZoom(int channelId, int zoomIn);//复位void    ResetElectronicZoom(int channelId);//直接设置显示区域,用于电子放大, 在某些场合, 需要直接进行缩放显示, 即可调用该函数实现int     SetRenderRect(int channelId, LPRECT lpSrcRect);

EasyPlayerPro

代码实现

int ChannelManager::ElectronicZoomProcess(MEDIA_VIDEO_CHANNEL_OBJ_T *pMediaChannel, EASY_FRAME_INFO *frameInfo){if (NULL == pMediaChannel)              return 0;if (NULL == frameInfo)                  return 0;ELECTRONIC_ZOOM_T *pElectoricZoom = pMediaChannel->pElectoricZoom;if (NULL == pElectoricZoom)             return 0;int nLeft = 0, nTop = 0, nRight = 0, nBottom = 0;if (pElectoricZoom->zoomIn >= 0x01){    RECT rcClient;    GetClientRect(pMediaChannel->mediaDisplay.hWnd, &rcClient);    float fLeftPercent =    pElectoricZoom->fStartPointX;    float fTopPercent  =    pElectoricZoom->fStartPointY;    float fRightPercent =   pElectoricZoom->fEndPointX;    float fBottomPercent  = pElectoricZoom->fEndPointY;    if (fRightPercent > fLeftPercent && fBottomPercent > fTopPercent)               //逐步放大    {        if (pElectoricZoom->fVideoWidth > 0)        {            int video_width = (int)pElectoricZoom->fVideoWidth;            int video_height= (int)pElectoricZoom->fVideoHeight;            nLeft = (int)((float)video_width / 100.0f * fLeftPercent);            nTop  = (int)((float)video_height/ 100.0f * fTopPercent);            nRight = (int)((float)video_width / 100.0f * fRightPercent);            nBottom  = (int)((float)video_height/ 100.0f * fBottomPercent);            if (nRight > nLeft && nBottom > nTop)            {                pElectoricZoom->fVideoWidth = (float)(nRight - nLeft);                pElectoricZoom->fVideoHeight = (float)(nBottom - nTop);                nLeft = pElectoricZoom->startVideoLeft + nLeft;                nTop = pElectoricZoom->startVideoTop + nTop;                nRight = pElectoricZoom->startVideoLeft + nRight;                nBottom = pElectoricZoom->startVideoTop + nBottom;                pElectoricZoom->startVideoLeft = nLeft;                pElectoricZoom->startVideoTop = nTop;                if (pElectoricZoom->zoomIndex + 1 
zoomParam[pElectoricZoom->zoomIndex].rect, nLeft, nTop, nRight, nBottom); pElectoricZoom->zoomParam[pElectoricZoom->zoomIndex].fVideoWidth = pElectoricZoom->fVideoWidth; pElectoricZoom->zoomParam[pElectoricZoom->zoomIndex].fVideoHeight = pElectoricZoom->fVideoHeight; pElectoricZoom->zoomParam[pElectoricZoom->zoomIndex].startVideoLeft = pElectoricZoom->startVideoLeft; pElectoricZoom->zoomParam[pElectoricZoom->zoomIndex].startVideoTop = pElectoricZoom->startVideoTop; pElectoricZoom->zoomIndex ++; } } else { int idx = pElectoricZoom->zoomIndex-2; if (idx > 0) { nLeft = pElectoricZoom->zoomParam[idx].rect.left; nTop = pElectoricZoom->zoomParam[idx].rect.top; nRight = pElectoricZoom->zoomParam[idx].rect.right; nBottom = pElectoricZoom->zoomParam[idx].rect.bottom; pElectoricZoom->fVideoWidth = pElectoricZoom->zoomParam[idx].fVideoWidth; pElectoricZoom->fVideoHeight = pElectoricZoom->zoomParam[idx].fVideoHeight; pElectoricZoom->startVideoLeft = pElectoricZoom->zoomParam[idx].startVideoLeft; pElectoricZoom->startVideoTop = pElectoricZoom->zoomParam[idx].startVideoTop; } } } else { int video_width = frameInfo->width; int video_height= frameInfo->height; nLeft = (int)((float)video_width / 100.0f * fLeftPercent); nTop = (int)((float)video_height/ 100.0f * fTopPercent); nRight = (int)((float)video_width / 100.0f * fRightPercent); nBottom = (int)((float)video_height/ 100.0f * fBottomPercent); pElectoricZoom->startVideoLeft = nLeft; pElectoricZoom->startVideoTop = nTop; pElectoricZoom->fVideoWidth = (float)(nRight - nLeft); pElectoricZoom->fVideoHeight = (float)(nBottom - nTop); SetRect(&pElectoricZoom->zoomParam[0].rect, nLeft, nTop, nRight, nBottom); pElectoricZoom->zoomParam[0].fVideoWidth = pElectoricZoom->fVideoWidth; pElectoricZoom->zoomParam[0].fVideoHeight = pElectoricZoom->fVideoHeight; pElectoricZoom->zoomParam[0].startVideoLeft = pElectoricZoom->startVideoLeft; pElectoricZoom->zoomParam[0].startVideoTop = pElectoricZoom->startVideoTop; pElectoricZoom->zoomIndex ++; } } else { if (pElectoricZoom->zoomIndex > 1) { int idx = pElectoricZoom->zoomIndex-2; nLeft = pElectoricZoom->zoomParam[idx].rect.left; nTop = pElectoricZoom->zoomParam[idx].rect.top; nRight = pElectoricZoom->zoomParam[idx].rect.right; nBottom = pElectoricZoom->zoomParam[idx].rect.bottom; pElectoricZoom->fVideoWidth = pElectoricZoom->zoomParam[idx].fVideoWidth; pElectoricZoom->fVideoHeight = pElectoricZoom->zoomParam[idx].fVideoHeight; pElectoricZoom->startVideoLeft = pElectoricZoom->zoomParam[idx].startVideoLeft; pElectoricZoom->startVideoTop = pElectoricZoom->zoomParam[idx].startVideoTop; pElectoricZoom->zoomIndex --; } else { pElectoricZoom->fVideoWidth = 0.0f; nLeft = 0; nTop = 0; nRight = frameInfo->width; nBottom = frameInfo->height; pElectoricZoom->zoomIndex = 0; } } RECT rcSrc; SetRect(&rcSrc, nLeft, nTop, nRight, nBottom); CopyRect(&pMediaChannel->mediaDisplay.rcSrcRender, &rcSrc); pElectoricZoom->zoomIn --;}return 0;}

关于EasyPlayerPro

EasyPlayerPro是一款全功能的流媒体播放器,支持RTSP、RTMP、HTTP、HLS、UDP、RTP、File等多种流媒体协议播放、支持本地文件播放,支持本地抓拍、本地录像、播放旋转、多屏播放、倍数播放等多种功能特性,核心基于ffmpeg,稳定、高效、可靠、可控,支持Windows、Android、iOS三个平台,目前在多家教育、安防、行业型公司,都得到的应用,广受好评!

EasyPlayerPro:

点击链接加入群【EasyPlayer & EasyPlayerPro】:

技术支持

  • 邮件:

  • Tel:13718530929

  • QQ交流群:

EasyPlayerPro是一款非常稳定的全协议/全功能播放器组件,各平台版本需要经过授权才能商业使用,商业授权方案可以通过以上渠道进行更深入的技术与合作咨询;

获取更多信息

EasyDarwin开源流媒体服务器:

EasyDSS商用流媒体解决方案:

EasyNVR无插件直播方案:

Copyright © EasyDarwin Team 2012-2017

EasyDarwin

转载于:https://www.cnblogs.com/babosa/p/9217707.html

你可能感兴趣的文章
C#使用Selenium实现QQ空间数据抓取 说说抓取
查看>>
Gold Smith第一章
查看>>
毫秒级百万数据分页存储过程
查看>>
堆排序例子
查看>>
文件输入输出流->带缓冲的输入输出流(过滤流)->基本数据的输入输出流 链接 增强了文件输入输出流的功能...
查看>>
deviceMotion.userAcceleration加速度方向
查看>>
PHP错误级别
查看>>
Linux的虚拟内存管理-如何分配和释放内存,以提高服务器在高并发情况下的性能,从而降低了系统的负载...
查看>>
输入一个表示整数的字符串,把该字符串转换成整数并输出(实现atoi函数功能)...
查看>>
KMP_Best Reward
查看>>
数组和广义表-第5章-《数据结构题集》习题解析-严蔚敏吴伟民版
查看>>
关于<:if>没有<c:else>解决方案 ...
查看>>
C/C++之内存对齐
查看>>
Myeclipse使用技巧
查看>>
2015.7.31 jquery 的attr和prop
查看>>
让我郁闷了一个早上的事情--变量保护
查看>>
centos7磁盘扩容
查看>>
CSS实现垂直居中的常用方法
查看>>
TCP/IP ---互联网的地址
查看>>
RobotFramework-Selenium2Library--关键字
查看>>