自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 Mac/OSX 系统如何采集扬声器(代码实现 附源码)

总所周知由于版权问题,mac系统是无法通过api采集扬声器的音量的,一些录屏软件大多采用soundflower,lookloop等插件来实现扬声器的采集。soundflower这种免费的插件已经没人维护了,最新的M1 已经无法使用了。这里推荐一个免费的支持M1架构的插件blackhole,操作与soundflower类似,创建一个多输出设备,将录制的扬声器设置为该多输出设备,看起来像这样:在我们使用obs,系统自带的录屏软件时就可以选择该输出设备作为扬声器采集从而实现扬声器音量采集。.

2021-09-15 19:16:44 1023 2

原创 Qt 绘制电池

实现如下功能: * 1. 可设置电池电量,动态切换电池电量变化 * 2. 可设置电池电量警戒值 * 3. 可设置电池电量正常颜色和报警颜色 * 4. 可设置边框渐变颜色 * 5. 可设置电量变化时每次移动的步长 * 6. 可设置边框圆角角度/背景进度圆角角度/头部圆角角度#ifndef BATTERY_H#define BATTERY_H#include <QWidget>class Battery : public QWidget{ Q_OBJECT

2021-02-22 14:39:24 712

原创 qt mac窗体无边框后问题解决方案

文件后后缀名改为.mm设置无边框不使用qt自带的方式:void setWindowFrameless(QWidget *widget, bool bRound){ NSView* view = (NSView*)widget->winId(); NSWindow* wndd = [view window]; if(bRound) { wndd.titlebarAppearsTransparent = YES; wndd.tit...

2021-02-22 14:10:15 1060 4

原创 librdkafka 封装的C++类

kafka就不介绍了, 可以参考kafka的c/c++高性能客户端librdkafka简介,下面说下librdkafka的编译:下载地址:https://github.com/edenhill/librdkafka,下载zip包解压。解压后找到目录下的win32目录, 里面是vs工程。这里还不能编译,因为缺少openssl,需要编译openssl。下载ActivePerl:http://www.activestate.com/activeperl/注意64位和32位, 如果你要编译64位的.

2021-02-22 14:07:37 438

原创 Qt 使用opengl绘制最简单方式

qt使用opengl绘制yuv网上得例子有很多,使用opengl函数进行绘制。这里介绍一个更加简单得方式。方法:1.使用libyuv库将yuv数据转化为RGB数据 libyuv::I420ToARGB((uint8_t*)Y_data_dest, dest_stride_Y, (uint8_t*)U_data_dest, dest_stride_U, (uint8_t*)V_data_dest, dest_stride_V, _rgbBuf...

2021-02-22 13:57:55 1219 1

原创 windows API更改系统分辨率支持扩展屏

前面介绍了如何使用api更改widnows系统的分辨率。只能更改主屏幕分辨率,这节介绍如何更改多个屏幕的分辨率要更改多个屏幕的分辨我们需要使用如下函数:WINUSERAPI LONG WINAPI ChangeDisplaySettingsEx( _In_opt_ LPCWSTR lpszDeviceName, _In_opt_ DEVMODEW* lpDevMode, _Reserved_ HWND hwnd, _In_ DWORD dwflags, _I

2021-02-05 14:14:49 1018

原创 windows API更改系统分辨率

通常更改分辨率可以通过windows显示设置去更改,然而有些时候需要我们使用API进行修改。下面介绍这个函数的使用方法。WINUSERAPI LONG WINAPI ChangeDisplaySettings( _In_opt_ DEVMODEA* lpDevMode, _In_ DWORD dwFlags);该函数用户更改分辨率相关设置,参数1是设备名称,每一个显示其都有一个唯一标识的名称。lpDevMode:指向一个描述转变图表的DEVMODE的指针。DEVMODE的dm

2021-02-05 14:05:10 2121

原创 菜鸟学ffmpeg音视频技术之11 mac采集audio

ffmpeg虽然是跨平台库,mac和windows还是有区别的,这里介绍下mac如何打开audo并采集。1.查找解码器_input_fmt = av_find_input_format("avfoundation");2.打开设备 _fmt_ctx = avformat_alloc_context(); ret = avformat_open_input(&_fmt_ctx, device_name.c_str(), _input_fmt, NUL

2021-01-08 15:52:17 525 1

原创 菜鸟学ffmpeg音视频技术之10 mac截图包含鼠标

前面介绍了mac截图和截屏,但是截出来的图片都不包含鼠标。研究发现默认跟window一样,截图都不包含鼠标,如果需要鼠标,需要自己绘制上去。下面介绍如何将鼠标绘制上去1.获取鼠标图像NSImage *overlay = [[[NSCursor arrowCursor] image] copy];2.获取鼠标位置 NSPoint mouseLoc; mouseLoc = [NSEvent mouseLocation]; //get cur int

2021-01-08 15:31:34 230 1

原创 菜鸟学ffmpeg音视频技术之9 mac截取进程图像

前面介绍了mac系统如何截取窗口和屏幕,有时我们可能想截取的是一个进程的图像。我这里采用的方法是:截取进程主窗口的图片,然后将该进程的其他独立窗口截出来,然后绘制在主窗口图片之上。这里跟windows一样,使用GDI截图只能截取直接子窗口的图片,如果子窗口是独立窗口是截不进去的需要绘制。1.获取主窗口图片//mainwindow if( 0 == _main_record_window.Handle) { std::string mainrecordname;

2021-01-08 14:26:46 195

原创 菜鸟学ffmpeg音视频技术之8 mac窗口截图

https://blog.csdn.net/xpg4321/article/details/112358449介绍了如何枚举mac系统的窗口。下面介绍如何截取窗口图像。1.获取窗口信息参考前一节介绍的mac枚举窗口函数获取窗口信息。 if(nullptr == _screen_caputre) break; bool b = _screen_caputre->caputreWindow(_record_wind.

2021-01-08 14:16:53 315

原创 菜鸟学ffmpeg音视频技术之7 mac枚举窗口

https://blog.csdn.net/xpg4321/article/details/112357480介绍了如何截屏因为录制可能需要录制窗口,这里介绍如何枚举mac屏幕的窗口。1.定义保存窗口信息的结构struct WindowPoint { int x; int y; }; struct MousePoint { WindowPoint Position; WindowPoint HotSpot; }; stru.

2021-01-08 14:08:34 350

原创 菜鸟学ffmpeg音视频技术之6 mac截屏

前面介绍了window 使用gdi抓取屏幕的方法,现在介绍mac系统如何进行屏幕抓取,如果您使用的qt框架,当然可以使用qt更加方便。但是qt有一个bug,mac外界扩展屏时,如果扩展屏相对位置是左上,左边,左下截图是异常的。这里介绍使用mac原生api进行截图:1.获取屏幕区域 NSScreen *screen = [[NSScreen screens] objectAtIndex:screenNumber]; CGRect mainRect; mainRect.ori

2021-01-08 13:55:00 502

原创 Qt实现截图之三 截图裁剪框实现方案2 绘制方式

前面介绍了一种裁剪框的实现方案详见Qt实现截图之二 ,本节再介绍一种实现方案。分层依旧两层,改变的是裁剪层,差别在于只需要一个裁剪窗口也就是去掉前面的top,right, left,bottom,只留下mid窗体用于高亮显示裁剪区域。布局如下:void MaskFrameBase::setup(){ this->setMouseTracking(true); // this->setObjectName("shtcenterframe"); this-

2020-12-25 11:37:16 735

原创 Qt实现截图之二 截图裁剪框实现方案1 窗口组合方式

截图相关介绍参考Qt实现截图之一整个截图分为两层,一层为截图显示区,一层为裁剪选着层,裁剪选择层蒙在截图显示区之上。本节介绍一种方案实现裁剪框。裁剪层分为5个区域,上下左右和中间,分别代表5个QWidget, 中间区域即为需要裁剪的区域-高亮区域,没有截图时此区域不存在。1.布局top, left,right, bottom 是个窗体均设置半透明颜色,mid是全透明效果就是裁剪区域void MaskFrameBase::setup(){ this->set.

2020-12-25 11:23:27 1294 1

原创 Qt实现截图之一 截图

最近项目需要使用qt实现截图功能,再次记录一下,希望对您有所帮助,qt我是用的是5.9.9版本。1.截图qt截图推荐使用QScreen来实现截图,使用grab这种方式只能截窗体且窗体如果是opengl窗体或者视频窗体无法获取数据。1.截主屏幕截主屏幕代码相对简单 QScreen* screen = QApplication::primaryScreen(); QPixmap pixmap = screen->grabWindow(QApplication::deskt

2020-12-25 10:53:12 4729

原创 Qt 集成miniblink浏览器库之5 支持独立窗口和子窗口

前面使用GDI绘制解决了集成到Qt的系统冲突和QWebEngineView的冲突,但仅支持作为qt的子窗体,现在将其修改为支持独立窗口的创建。首先判断create接口传入的父窗口句柄是否是空,为空表示创建一个独立窗口,代码如下: _hWnd = CreateWindow(wkeWebViewClassName, 0, WS_CAPTION | WS_VISIBLE | WS_BORDER | WS_MINIMIZEBOX |...

2020-12-25 10:27:19 1135 1

原创 菜鸟学ffmpeg音视频技术之5 使用GDI抓取图像

本文介绍如何使用windows GDI抓取图像并将图像转化为RGB,这样可以传递给FFMPEG进行编解码。步骤如下:1.获取屏幕或者窗口句柄首先通过FindWindow找到对应窗口的HWND,桌面HWND 为NULL。录制分为屏幕录制和窗口录制,对于使用GDI抓图来讲就是获取对应对象的句柄使用GetWindowDC来获取对应的设备描述符;hdc_screen = GetWindowDC(hwnd)2.创建内存hdchdc_mem = CreateCompatibleDC(hdc

2020-12-18 14:01:37 675 2

原创 菜鸟学ffmpeg音视频技术之4 使用d3d 抓屏幕图像

本篇介绍如何使用d3d 9抓取屏幕图像,并将图像转化为RGB数据,转化后的数据可直接传递给FFmpeg进行编解码。获取桌面数据容易,转为RGB网上的例子就少了,大多只会使用D3D api保存为一个图片,本文解决了这个难题,如果你想使用D3D抓图然后使用FFMPEG进行录制会对你有所帮助。1.创建D3D对象_d3d = Direct3DCreate9(D3D_SDK_VERSION);2.获取display配置 memset(&_d3d_displaymode...

2020-12-11 15:43:47 437

原创 Qt 集成miniblink浏览器库之4 解决兼容性问题

之前介绍了如何miniblink集成到qt,采用wkeCreateWebWindow来创建一个浏览器窗口,wkeCreateWebWindow有三种方式typedef enum _wkeWindowType { WKE_WINDOW_TYPE_POPUP, WKE_WINDOW_TYPE_TRANSPARENT, WKE_WINDOW_TYPE_CONTROL} wkeWindowType;WKE_WINDOW_TYPE_POPUP 创建一个弹出式窗体,模态窗体。W...

2020-12-02 17:54:49 1471 4

原创 菜鸟学ffmpeg音视频技术之三实现命令录制(细节相关)

前面我使用video=screen-capture-recorder实现了录制的相关功能,这一节来讨论下我踩的坑。1.screen-capture-recorder只能录制主屏幕,如果电脑连接了扩展屏,想要录制扩展屏只能让扩展屏设置成主屏才能2.screen-capture-recorder无法设置录制的起始位置和大小,只能录制整个屏幕,想要录制某个区域只能先录制整个屏幕在使用ffmpeg命令来裁剪,这个跟组合录制一样。启动一个进程来完成即可。3.注意设备的类型,如果是dshow一定要设置d

2020-11-20 14:32:52 619 1

原创 菜鸟学ffmpeg音视频技术之二实现命令录制(暂停,组合)

前一节已经实现了录制,只能录制一段视频,实际运用中我们可能会暂停,然后接着录制最终生成一条完整的视频。我们在使用命令行操作ffmpeg时组合各段视频的命令如下:ffmpeg -f conccat -safe 0 -iconccatfile -c copy dirfile所以我的方法是暂停录制后生成一条临时视频,并把临时视频的文件名保存在conccatfile里面。重新开始录制又重新录制一条临时视频,这样如果一直反复暂停录制开始录制,会生成多个临时文件。停止录制时将这些视频组合成一条视频,从而完.

2020-11-20 14:13:01 1300

原创 菜鸟学ffmpeg音视频技术之一实现命令录制

ffmpeg就不解释了,太多资料了,著名的开源做音视频的库学些录制的动力是目前所在公司使用OBS录屏存在一些问题,录制窗口有些显卡会黑屏,录制屏幕会把电脑的其他软件也会录制进去,理想的录制方式是组合录制方式,把想录制的录制进去,不像录制的去掉。比如一个软件中有多个窗口,只想录制其中一些。希望后续能成功立一个flag。ffmpeg使用的方式有两种,一种是命令模式,一种是api模式,要实现我想要录制应该是api模式能实现,这里我先使用api实现录制,了解一下录制原理。为了方便依旧使用qt来实现。.

2020-11-16 18:17:58 699

原创 Qt 集成miniblink浏览器库之3 C++ js相互调用

上一节已经将miniblink集成到qt,实现了浏览器得基本调用接口,这一节介绍如何实现通信。1.C++调用jsminiblink接口wkeRunJSW可以实现C++调用js例如我们在js中写一个绑定到window的函数openDialog就可以这样调用wkeRunJSW("window.openDialog()");这跟cef,QtWebEngine完全一样2.js调用C++首先我们写一个测试的html如下:<html><head>..

2020-11-13 15:18:47 1531

原创 Qt 集成miniblink浏览器库之2封装

前面一节已经介绍了如何编译miniblink库以及如何在qt下使用,但是创立的是个独立窗体,应用中我们经常用到的是作为一个子窗体嵌入到其他窗体之中,类似QWebengnieView,本节将实现这个功能。首先参考前一节将需要的库文件,头文件引入工程。1.创建一个类QMiniblinkWebView继承自QWidget2.初始化initialize接口由于miniblink使用需要先初始化,这里设计在构造函数中处理这个问题,多个QMiniblinkWebView只需要初始化一次,所以这里定义两个

2020-11-06 14:44:21 1535 4

原创 Qt 集成miniblink浏览器库之1编译使用

1.miniblink简介miniblink是一款精简小巧的浏览器控件,由龙泉寺扫地僧基于chromium精简而成,是市面上最小巧的chromium内核控件没有之一。它仅10余M大小,只需一个dll,几个纯C接口即可轻松调起,并嵌入到任何软件内使用。你可以用来显示网页、做软件的界面框架、做爬虫等功能。它内置了各种网络拦截接口,可以方便的替换网络资源;解除了跨域访问限制,方便本地开发测试等。如果你使用过cef、wke的话,相信很容易理解。miniblink采用的接口和wke几乎一模一.

2020-10-30 16:27:32 1939

原创 Qt opengl自绘制Agora,zego(YUV)视频(支持Windows,mac)

集成Agora或者zego得都知道,这两者都支持自绘制或者让SDK绘制,SDK绘制有缺陷:1.改变大小由于未能及时通知agora绘制得视频会闪烁2.sdk同时只能在一个窗口绘制拿到agora采集得数据自己绘制可以解决上面得缺陷。声网支持两种方式,一种是集成接口方式,一种是设置一个回调接口。两种方式都一样。接口如下:(zego也一样)bool onCaptureVideoFrame(VideoFrame& videoFrame) override;bool onRenderV.

2020-05-12 18:20:10 736

原创 C++面试题整理

1.写一个string该题主要考察赋值class String{public: String(const char *str = NULL); //通用构造函数 String(const String &str); //拷贝构造函数 ~String(); //析构函数 Strin...

2019-09-24 14:49:34 705

原创 Qt面试题整理

1、Qt信号槽机制的优势(1)类型安全。需要关联的信号和槽的签名必须是等同的,即信号的参数类型和参数个数同接收该信号的槽的参数类型和参数个数相同。不过,一个槽的参数个数是可以少于信号的参数个数的,但缺少的参数必须是信号参数的最后一个或几个参数。如果信号和槽的签名不符,编译器就会报错。(2)松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是哪个对象的哪个槽需要接收它发出的...

2019-09-24 13:56:23 53120 2

原创 Qt 在Mac下无边框后无法最大化和最小化解决方案

Qt 5.0以上mac版本一致存在这个bug,网上也有解决方案,一个是修改Qt源码重新编译,这个比较费事,另一个是将文件改为.mm后缀,使用oc代码: NSView* view = (NSView*)this-&gt;winId(); NSWindow* wnd = [view window]; [wnd miniaturize:nil];这句代码好像在qt5.2中可以解决,然后我测试了之后的所有...

2018-03-28 10:38:25 6176 9

原创 Qt显示pdf之五在Qt中使用

引入前面章节封装的lib,dll 和libvoid MainWindow::slotOpenPdf(){ QString pdf = QApplication::applicationDirPath() + "\\1.pdf"; PDFIumReader_Loadpdf(pdf.toStdString().c_str()); int counts =

2017-09-04 14:38:28 1926 6

原创 Qt显示PDF之四pdfium封装

如果你已经按照前面的步骤成功生成了库,那么恭喜你。如果没有也不要气馁 ,我后面会放送编译好的库。我们可以看一下pdfium的pdfium\build\Debug\lib目录和pdfium\build\Debug\,可以看到其实就一个dll文件和一堆lib。如果使用呢可以参考pdfium\samples目录下的例子程序。下面我对其进行封装:首先建立一个win32 dll工程PDFIumR

2017-09-01 16:01:03 4039 2

原创 Qt显示PDF之三 pdfium编译

其实pdfium的编译步骤网上已经说的很明白了,不过这里还是列出其步骤:1.下载vs2013,python2.7  SVN并安装2. V8 JavaScript引擎的下载: svn co http://v8.googlecode.com/svn/trunk v83.  ICU下载,V8又依赖于ICU库svn co https://src.chromium.org/chrome/

2017-09-01 15:45:23 4171 2

原创 Qt显示PDF之二 QAxWidget, QAxWidget

1. QAxWidget显示pdf非常简单:直接上代码classSCPdfWidget: publicQAxWidget{public: //SCPdfWidget(QWidget *parent = NULL); SCPdfWidget(QWidget *parent = NULL); void openPdf(const QStri

2017-09-01 15:44:09 3975 1

原创 Qt显示PDF系列之一

Qt 只提供了对pdf文件的读写接口,显示接口并没有。如下实现显示。据我所知有以下几种方法:1.将pdf显示为web页面,需要用到类似PDFObject.js类 该类实现了网页对PDF的解析,然后Qt通过浏览器控件进行加载。这里要求html编写者提供一个传入文件路径的接口,Qt通runJacaScritp接口调用传入。这种方法叫简单,而且效果还不错。2.通过com组件加载Qt 提供了Q

2017-09-01 15:09:50 11089 2

原创 使用librdkafka 封装的 C++类

kafka就不介绍了, 可以参考kafka的c/c++高性能客户端librdkafka简介,下面说下librdkafka的编译:下载地址:https://github.com/edenhill/librdkafka,下载zip包解压。解压后找到目录下的win32目录, 里面是vs工程。这里还不能编译,因为缺少openssl,需要编译openssl。下载ActivePerl:http

2017-08-29 12:49:54 7671 1

原创 使用Zlib对文件和目录进加密打包和解包

zlib就不做解释了,本人使用的是1.2.7版本,并用C++进行了封装,用到了Qt。功能:1.使用线程,不会卡死界面支.2.支持递归目录,目录和单个文件。3.可以同时进行多项任务。4.返回每项任务的任务进度。5.打包和解包的详细过程信息。6.支持从包文件中只解压一个文件。步骤:1.下载zlib压缩包并解压。2.找到zlib解压目录下的zlib-1.2.7\c

2017-08-23 10:43:03 5768 2

原创 QISG学习之-在图层上画图

研究过源码的人都知道 QGIS对于在地图上的功能操作都是通过QgsMapTool来管理的,有一篇博客有详细讲解:http://blog.csdn.net/deirjie/article/details/50878670所以要实现画图也很简单了。首先继承QgsMapTool,这里提供了各种坐标转换,我们当然非常需要。#ifndef MEASURETOOL_H

2017-07-28 11:24:48 1928

原创 QGIS学习之-显示SVG图片

这个功能其实很简单,但是看到网上很多人不知道怎么做,故记录下帮助需要的朋友。其实看源码就知道怎么做了。如果自己重新QGraphicsItem 可以将图片加入图层,但是有很多问题,比如地图坐标等等,其实QGIS已经帮我们实现了,它就是QgsAnnotationItem所以我们要实现显示SVG图片 又不想自己去管理缩放,坐标等等 就从QgsAnnotationI

2017-07-28 11:16:42 4945 2

原创 QGIS学习之-环境搭建

1.从OSGeo4w获取开发包2.自己编译编译的博客一大推,不再啰嗦,要有耐心 要有耐心 要有耐心 重要的事情说3遍。开发环境: QtCreator1.首先将设置QtCreator编译器,如果是下载的,目前官方使用的是Qt4.8.5编译的,所以应设置qmake路径类似:E:\OSGeo4W64\bin\qmake2.设置导出宏 由于下载的开发包内并未定义,所以在pro文

2017-07-28 10:41:52 1967

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除