一个开源跨平台的截屏库推荐——screen_capture_lite
这是一个开源的截屏库,能够支持 linux 、windows 和 Mac 三种平台,使用起来非常的方便。这个库采用 MIT 协议,可以自由的用于企业项目中。在这里介绍这个库,是希望更多的小伙伴使用,推进这个库更加完善稳定。
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 特意强调的。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)