github 地址:https://github.com/smasherprog/screen_capture_lite

1.功能介绍

(1)按照给定的帧率捕获屏幕,并在回调接口中将屏幕数据提供给用户处理;
(2)按照给定的帧率捕获窗口,并提供处理数据的回调接口;
(3)捕获屏幕的部分内容,也就是类似 QQ 截图。

支持的平台类型:

  • Windows 7 and up
  • MacOS
  • Linux

2.协议类型

这个开源库采用 MIT 协议,简单来讲就是可以商业使用,在企业中使用开源代码需要关注协议类型。
在这里插入图片描述

3.使用方法

这个库的使用非常简单,作者提供了 demo ,可以直接编译运行,但是要实现截图,需要取消 demo 中的部分注释。

3.1 编译介绍

在编译之前,需要先拉取相关源码。
linux 平台
进入源码根目录,执行 以下命令:

> mkdir build
> cd build
> cmake ..
> make

这样就已经在 //build 目录下生成 libscreen_capture_lite.a 静态库了,可以直接引用。同时也在 //build/Example 目录下生成了 screen_capture_lite 可执行程序,如果你运行这个可执行程序,发现除了控制台有输出,没有看到截图,那么需要取消注释 //Example 目录下 Screen_Capture_Example.cpp 文件中的几行代码。
在这里插入图片描述取消注释之后,再次执行 make 命令,然后运行 screen_capture_lite ,就会发现 //build 目录下已经生成了很多图片了。
Windows 平台
在 windows 平台下编译 screen_capture_lite 库,需要借助于 cygwin 和 vs,拉取完代码,安装完成 cygwin 之后,打开 cygwin 命令行终端,进入到 screen_capture_lite 源码根目录,执行以下命令:

> mkdir build
> cd build
> cmake ..

你会发现在 //build 目录下已经生成了 vs 工程,可以打开 vs 工程,然后进行编译运行即可生成 libscreen_capture_lite.lib 静态库,同时也生成了可执行程序。

3.2 引用静态库

在设置好静态库的头文件路径和库路径后,仿照源码的例子定义一个 InitFrameGrabber() 函数,在主函数中调用一下就可以工作了。

std::shared_ptr<SL::Screen_Capture::IScreenCaptureManager> m_framgrabber;
int m_fps = 20;
typedef struct
{
    int _size;
    int _width;
    int _height;
    unsigned long _ts;
    unsigned char *_pData;
} X264EncodeInputData;
void InitFrameGrabber()
{
    m_framgrabber =
        SL::Screen_Capture::CreateCaptureConfiguration([]() {
            auto mons = SL::Screen_Capture::GetMonitors();
            GLINFO << "Library is requesting the list of monitors to capture!" << std::endl;
            if (mons.size() > 1)
            {
                GLINFO << "number of monitors: " << mons.size();
                return std::vector<SL::Screen_Capture::Monitor>{mons[0]};
            }
            return mons;
        })
        ->onNewFrame([&](const SL::Screen_Capture::Image &img, const SL::Screen_Capture::Monitor &monitor) {
                auto s = std::to_string(realcounter) + std::string("MONITORNEW_") + std::string(".jpg");
                ++realcounter;
                
                auto size = SL::Screen_Capture::Width(img) * SL::Screen_Capture::Height(img) *
                	 sizeof(SL::Screen_Capture::ImageBGRA);
                auto imgbuffer(std::make_unique<unsigned char[]>(size));

                ExtractAndConvertToBGRA(img, imgbuffer.get(), size);
                //tje_encode_to_file(s.c_str(), Width(img), Height(img), 4,
                	 (const unsigned char*)imgbuffer.get());

                X264EncodeInputData inputData;
                inputData._pData = imgbuffer.get();
                inputData._size = size;
                inputData._width = SL::Screen_Capture::Width(img);
                inputData._height = SL::Screen_Capture::Height(img);

                if (!EncodeOneFrame(inputData))
                {
                    GLWARN << "Encode error.";
                }
            })->start_capturing();
    m_framgrabber->setFrameChangeInterval(std::chrono::milliseconds(1000 / m_fps));
}

这里只对屏幕截图回调进行了处理,如果需要什么类型的截图信息,就定义对应的回调函数,如果不需要就不要定义,这是库的 readme 特意强调的。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐