EasyPlayerPro-win截图功能实现

来源:互联网 发布:ubuntu cd显示不存在 编辑:程序博客网 时间:2024/05/22 03:18

EasyPlayerPro-win截图功能实现

背景描述

作为一个播放器,截图功能必不可少; 下面主要记录一下截图功能的实现;

实现流程

将解码后的帧进行格式转换(目标格式为RGB24);
采用独立的线程进行截图处理;
截图可保存为BMP或JPG两种格式;

这里写图片描述

图片存放于EasyPlayerPro\Snapshot文件夹, 如下图:
这里写图片描述

代码实现

#define _WIDTHBYTES(c)  ((c+31)/32*4)   // c = width * bppint Snapshot2File(RENDER_FORMAT renderFormat, SNAPSHOT_IMAGE_T *pSnapshot, char *pbuf){PBYTE   pDest = NULL, pDest16 = NULL;INT     nBpp;DWORD   dwW, dwH, dwWB;int     ret = 0;int image_format = pSnapshot->imageFormat;if (renderFormat == RENDER_FORMAT_YUY2)             nBpp    =   16;else if (renderFormat == RENDER_FORMAT_UYVY)        nBpp    =   16;else if (renderFormat == RENDER_FORMAT_X8R8G8B8)    nBpp    =   32;     //okelse if (renderFormat == RENDER_FORMAT_A8R8G8B8)    nBpp    =   32;     //okelse if (renderFormat == RENDER_FORMAT_RGB565)      nBpp    =   16;     //okelse if (renderFormat == RENDER_FORMAT_RGB555)      nBpp    =   16;     //okelse if (renderFormat == RENDER_FORMAT_RGB24_GDI)   nBpp    =   24;else    return -1;      //格式错误dwW  = pSnapshot->width;dwH  = pSnapshot->height;dwWB = _WIDTHBYTES( dwW * nBpp );if (image_format == 0x00){    //BMP    int iFilenameLen = (int)strlen(pSnapshot->filename);    if ( (0 != memcmp(pSnapshot->filename+iFilenameLen-3, "bmp", 3)) &&        (0 != memcmp(pSnapshot->filename+iFilenameLen-3, "BMP", 3)) &&        (0 != memcmp(pSnapshot->filename+iFilenameLen-3, "Bmp", 3)) )    {        if (pSnapshot->filename[iFilenameLen-4] == '.')        {            for (int i=iFilenameLen-1; i>0; i--)            {                if (pSnapshot->filename[i] == '.')                {                    pSnapshot->filename[i] = '\0';                    break;                }                else                {                    pSnapshot->filename[i] = '\0';                }            }        }        strcat(pSnapshot->filename, ".bmp");    }    HANDLE hFile = CreateFile( pSnapshot->filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,        NULL,       CREATE_ALWAYS,  FILE_ATTRIBUTE_NORMAL,  NULL );    if( hFile == INVALID_HANDLE_VALUE ) return E_HANDLE;    // SaveFile to BMP    BITMAPFILEHEADER bfh = {0};    bfh.bfType      = 0x4D42;    bfh.bfSize      = 0;    bfh.bfReserved1 = 0;    bfh.bfReserved2 = 0;    bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);    if( nBpp == 16 ) {        bfh.bfOffBits += sizeof(RGBQUAD) * 3;    }    else        if( nBpp == 24 ) {            bfh.bfOffBits += sizeof(RGBQUAD) * 1;        }        else            if( nBpp == 32 ) {                bfh.bfOffBits += sizeof(RGBQUAD) * 1;            }            DWORD dwWriteLength = sizeof(BITMAPFILEHEADER);            DWORD dwWrittenLength = 0;            WriteFile( hFile, (PVOID)&bfh, dwWriteLength, &dwWrittenLength, NULL );            BITMAPINFOHEADER    bih = {0};            bih.biSize      = sizeof(BITMAPINFOHEADER);            bih.biWidth     = dwW;            bih.biHeight    = -(INT)dwH;            bih.biPlanes    = 1;            bih.biBitCount  = nBpp;            bih.biCompression   = (nBpp == 16) ? BI_BITFIELDS : BI_RGB;            bih.biSizeImage     = dwWB * pSnapshot->height;            bih.biXPelsPerMeter = 0;            bih.biYPelsPerMeter = 0;            bih.biClrUsed       = 0;            bih.biClrImportant  = 0;            dwWriteLength = sizeof(BITMAPINFOHEADER);            WriteFile( hFile, (PVOID)&bih, dwWriteLength, &dwWrittenLength, NULL );            if( nBpp == 16 ) {                DWORD argbQuad[3] = {0};                if (renderFormat == RENDER_FORMAT_RGB565)                {                    argbQuad[0] = 0x00F800;     // Red mask                    argbQuad[1] = 0x0007E0;     // Green mask                    argbQuad[2] = 0x00001F;     // Blue mask                }                else                {                    argbQuad[0] = 0x007C00;     // Red mask                    argbQuad[1] = 0x0003E0;     // Green mask                    argbQuad[2] = 0x00001F;     // Blue mask                }                dwWriteLength = sizeof(argbQuad);                WriteFile( hFile, (PVOID)&argbQuad[0], dwWriteLength, &dwWrittenLength, NULL );            }            else                if( nBpp == 24 ) {                    DWORD rgbQuad = 0;                    dwWriteLength = sizeof(rgbQuad);                    WriteFile( hFile, (PVOID)&rgbQuad, dwWriteLength, &dwWrittenLength, NULL );                }                else if( nBpp == 32 ) {                    DWORD rgbQuad = 0;                    dwWriteLength = sizeof(rgbQuad);                    WriteFile( hFile, (PVOID)&rgbQuad, dwWriteLength, &dwWrittenLength, NULL );                }                dwWriteLength = dwWB * pSnapshot->height;                WriteFile( hFile, (PVOID)pbuf, dwWriteLength, &dwWrittenLength, NULL );                CloseHandle( hFile );    if (dwWrittenLength < 1)    {        DeleteFile(pSnapshot->filename);    }}else if (image_format == 0x01){    //JPG    int iFilenameLen = (int)strlen(pSnapshot->filename);    if ( (0 != memcmp(pSnapshot->filename+iFilenameLen-3, "jpg", 3)) &&        (0 != memcmp(pSnapshot->filename+iFilenameLen-3, "JPG", 3)) &&        (0 != memcmp(pSnapshot->filename+iFilenameLen-3, "Jpg", 3)) )    {        if (pSnapshot->filename[iFilenameLen-4] == '.')        {            for (int i=iFilenameLen-1; i>0; i--)            {                if (pSnapshot->filename[i] == '.')                {                    pSnapshot->filename[i] = '\0';                    break;                }                else                {                    pSnapshot->filename[i] = '\0';                }            }        }        strcat(pSnapshot->filename, ".jpg");    }    BOOL bres = TRUE;    IJLERR jerr;    DWORD dibPadBytes;    JPEG_CORE_PROPERTIES jcprops;    __try    {        jerr = ijlInit(&jcprops);        if (IJL_OK != jerr)        {            bres = FALSE;            __leave;        }        dibPadBytes = IJL_DIB_PAD_BYTES(dwW, 3);        jcprops.DIBWidth = dwW;        jcprops.DIBHeight = dwH;        jcprops.DIBBytes = (unsigned char*)pbuf;//reinterpret_cast<BYTE *>(&pbi->bmiHeader) + sizeof(BITMAPINFOHEADER);        jcprops.DIBPadBytes = dibPadBytes;        jcprops.DIBChannels = 3;        jcprops.DIBColor = IJL_BGR;        jcprops.JPGFile = const_cast<LPSTR>(pSnapshot->filename);        jcprops.JPGWidth = dwW;        jcprops.JPGHeight = dwH;        jcprops.JPGChannels = 3;        jcprops.JPGColor = IJL_YCBCR;        jcprops.JPGSubsampling = IJL_411;        jcprops.jquality = 95;        jerr = ijlWrite(&jcprops, IJL_JFILE_WRITEWHOLEIMAGE);        if (IJL_OK != jerr)        {            if (IJL_FILE_ERROR == jerr)            {            }            ret = jerr;            bres = FALSE;            if (ret == -23)            {                DeleteFile(pSnapshot->filename);            }        }    }    __finally    {        ijlFree(&jcprops);    }}if (NULL != pDest){    delete []pDest;    pDest = NULL;}return ret;}

关于EasyPlayerPro

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

EasyPlayerPro:https://github.com/EasyDSS/EasyPlayerPro

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

技术支持

  • 邮件:support@easydarwin.org

  • QQ交流群:544917793

EasyPlayerPro是一款非常稳定的全协议/全功能播放器组件,可以通过以上渠道进行更深入的技术与合作咨询;

获取更多信息

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

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

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

Copyright © EasyDarwin Team 2012-2017

EasyDarwin

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 惠龙高速公路更新图纸 惢心 惢怎么读 惢心扮演者 惢怎么读音 石动惣一 海贼之蓝染惣右介 惦念 惦念什么意思 惦念老人去世的句子 惦念死者心痛的句子 米惦零食 惦组词 别老惦记我 惦记 惦记意思 惦记的意思 不怕贼惦记 惦记这一些 惦记造句 乔总求别惦记我 惦记的近义词 朋友妻别惦记全文阅读 总有人惦记我未婚夫 惦记一个人图片 乔总求别惦记我 妤七 别老惦记我全文阅读 嫁了,别惦记 简戈 惦记的近义词是什么 就怕贼惦记上一句是什么 惦记一个人的句子 别老惦记我 南书百城 霸总每天都在惦记我 不怕贼偷就怕贼惦记 可走到哪里还是会有惦记 娇宠之惧内将军 本少不惧内 闪婚总裁很惧内