EasyPlayerPro Windows播放器电子放大/局部放大播放功能实现

背景描述

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

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 <MAX_ZOOM_IN_TIMES)
                {
                    SetRect(&pElectoricZoom->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:https://github.com/EasyDSS/EasyPlayerPro

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

技术支持

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

获取更多信息

EasyDarwin开源流媒体服务器:www.EasyDarwin.org

EasyDSS商用流媒体解决方案:www.EasyDSS.com

EasyNVR无插件直播方案:www.EasyNVR.com

Copyright © EasyDarwin Team 2012-2017

EasyDarwin

原文地址:https://www.cnblogs.com/babosa/p/9217707.html