首页 > 其他分享 >H.265流媒体播放器EasyPlayer.js如何实现本地快照抓拍截图功能?

H.265流媒体播放器EasyPlayer.js如何实现本地快照抓拍截图功能?

时间:2024-12-30 15:18:41浏览次数:1  
标签:H.265 快照 媒体播放器 bih nBpp jcprops filename else pSnapshot

随着流媒体技术的迅速发展,H5流媒体播放器已成为现代网络视频播放的重要工具。其中,EasyPlayer.js播放器作为一款功能强大的H5播放器,凭借其全面的协议支持、多种解码方式以及跨平台兼容性,赢得了广泛的关注和应用。

那么想要实现播放器本地快照抓拍截图功能,应该如何操作呢?

实现步骤:

1、将解码后的帧进行格式转换(目标格式为RGB24)。

2、采用独立的线程进行截图处理。

3、截图可保存为BMP或JPG两种格式。

代码实现:

int 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;     //ok
else if (renderFormat == RENDER_FORMAT_A8R8G8B8)    nBpp    =   32;     //ok
else if (renderFormat == RENDER_FORMAT_RGB565)      nBpp    =   16;     //ok
else if (renderFormat == RENDER_FORMAT_RGB555)      nBpp    =   16;     //ok
else 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;
}

EasyPlayer.js视频流媒体播放器不仅支持H.264与H.265视频编码格式,也能支持WebSocket-FLV、HTTP-FLV、HLS(m3u8)、WebRTC、ws-fmp4、http-fmp4等格式的视频流,并具备直播、点播、录像、快照截图、MP4播放、多屏播放、倍数播放、全屏播放等功能特性。

流媒体拥有广阔的应用前景,很多人对它的了解也在逐步深入。流媒体播放器负责解码和呈现内容,常见的播放器包括VLC和HTML5播放器等。流媒体技术的应用场景广泛,包括娱乐、教育、视频监控、企业培训等。

标签:H.265,快照,媒体播放器,bih,nBpp,jcprops,filename,else,pSnapshot
From: https://www.cnblogs.com/easyplayer/p/18641328

相关文章

  • 拉链表,流⽔表以及快照表的含义和特点
    拉链表含义拉链表主要用于记录数据的历史变化情况。从数据结构角度看,它的每条记录都包含了一个实体(如客户、产品等)的关键信息以及两个时间戳字段,即起始日期(Start_Date)和结束日期(End_Date)。起始日期表示这条记录开始生效的时间,结束日期表示这条记录失效的时间。当数据初次录......
  • EasyPlayer.js视频流媒体播放器RTSP windows播放器SDK API的接口说明
    在数字化时代,流媒体播放器已成为信息传播和娱乐消遣的主流载体。随着技术的进步,流媒体播放器的核心技术和发展趋势不断演变,影响着整个行业的发展方向。那么在实际运用中,关于EasyPlayerRTSPwindows播放器SDKAPI接口要注意什么?背景介绍EasyPlayer实现对RTSP直播流进行实时采集......
  • StyleShot任意风格快照
    ✨✨欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨......
  • EasyPlayer.js视频流媒体播放器windows播放器多窗口播放音量的控制方法
    随着互联网技术的飞速发展和移动设备的普及,流媒体服务已经成为人们消费娱乐内容的主要途径之一。流媒体行业已经成为一个巨大的娱乐产业生态,各个环节都在不断发生着创新和变革。这些技术的发展不仅改变了内容的创作和分发方式,也为用户带来了更加丰富和个性化的体验。那么在实际......
  • H5流媒体播放器EasyPlayer.js遇到播放海康RTSP流时客户端连接兼容问题
    在选择好用的播放器时,要确保播放器支持H.265的硬件解码。例如,EasyPlayer.jsH5播放器支持MSEH264和H265硬解码,以及WebCodec、H264和H265硬解码,这有助于提升视频播放的性能和降低CPU使用率。遇到播放海康RTSP流时客户端连接兼容问题时,应该如何处理?问题说明程序兼容性的问题,如......
  • 在域控(Domain Controller,DC)上做快照是一种用于备份和恢复的常见操作,尤其是在 Active D
    在域控(DomainController,DC)上做快照是一种用于备份和恢复的常见操作,尤其是在ActiveDirectory环境中。通过创建域控的快照,可以在发生故障时快速恢复到快照时的状态。下面是如何在WindowsServer上创建域控的快照的步骤:1.使用 WindowsServer快照功能在WindowsServer上......
  • 树莓派2老当益壮:Kodi影视中心和vlc多媒体播放器安装调试
    树莓派2老当益壮:Kodi影视中心和vlc多媒体播放器安装调试Kodi是一款免费的开源媒体播放器和影视中心,可在多个平台上使用,包括Android、Linux和Windows,当然还有树莓派!‌VLC(VLCmediaplayer)是一款自由、开源的跨平台多媒体播放器。树莓派下Kodi安装和使用树莓派2,安装了树莓......
  • EasyPlayer.js视频流媒体播放器如何实现电子放大或局部放大播放功能?
    随着数字化时代的到来,流媒体技术已经成为我们生活中不可或缺的一部分。从娱乐到教育,从远程工作到物联网应用,流媒体技术的广泛应用正在深刻改变我们的生活方式。流媒体行业的快速发展不仅体现在市场规模的扩大,还表现在技术创新、内容多样化、用户体验优化等多个方面。在视频监控......
  • 网页直播/点播播放器EasyPlayer.js如何实现安卓流媒体播放器播放同步录像?
    随着流媒体技术的迅速发展,H5流媒体播放器已成为现代网络视频播放的重要工具。其中,EasyPlayer.js视频流媒体播放器作为一款功能强大的H5播放器,凭借其全面的协议支持、多种解码方式以及跨平台兼容性,赢得了广泛的关注和应用。音视频码流的metadata,即MediaFormat,是从MediaCodec取出来......
  • 视频流媒体播放器EasyPlayer-RTSP原始录像文件被新录像文件覆盖是什么原因
    媒体播放器EasyPlayer有很多版本,其中EasyPlayer-RTSP就是能够输出RTSP视频流的版本,由于RTSP的需求众多,因此RTSP版本的用户也是很广泛。EasyPlayer-RTSP录像文件被覆盖EasyPlayer-RTSP是可以进行录像的,在录制录像文件时会出现开始录像后产生一个录像文件,停止录像后,录像文件被保存......