- 博客(188)
- 资源 (16)
- 收藏
- 关注
原创 macOS上QT打开麦克风和摄像头的权限问题
同样的代码在Windows上可以轻松操作麦克风和摄像头,特别是用QT这种跨平台的框架。如果是之前的早期5.x版本的QTCreator因为使用的是qmake构建系统,估计可以帮忙生成,但是从6.x以后QTCreator已经默认使用CMake了。问题是CMake不会帮忙做太多工作,如果需要用到一些平台上的权限,就需要手动创建Info.plist文件,这当然跟XCode的便利性没法比。做好上面的操作,CMake就可以根据Info.plist.in中的配置生成对应的Info.plist文件,并且和应用打包起来。
2024-04-01 15:49:16
1068
1
原创 QQuick-自绘
QQuick提供了丰富的控件,搭配qml很容易就可以搭配出一套丝滑的UI界面。但是在有些场景下无论是出于效率还是现有控件的局限都需要进行自绘才能实现自身的需求。
2023-04-17 15:13:05
1423
原创 RTC 基础
音频视频网络部分大致相同,FEC/网络包/加密在实际场景中,每一个部分都会涉及更多的细节逻辑比如1. 编码,音频一般会再opus/aac之间做选择,opus更广泛,更低的编码延迟在实时场景中有更好的表现。视频一般为x264/o264中做选择,但是视频为了获取更好的性能,又会选择硬编硬解,这就又引入了更多的平台相关的技术,更为复杂2. 因为音视频都是单独传输,接收端又要考虑音画同步问题3. 视频数据即便是编码压缩后,数据依旧比较大,要考虑加入buffer,做为平滑发送(pacing)的手段。
2023-04-14 18:02:58
495
原创 PDB 符号文件去除私有符号
PDB 符号文件去除私有化符号,方便给三方调试,又可以有效防止代码被逆向。微软的给用户提供的sdk库符号文件也经过去除私有化的处理,有效的保护了代码信息
2022-04-24 20:22:27
623
原创 Timer 定时器
Windows 上原生Timer常用的有下面两个:1. SetTimer windows上最简单方便的定时器,不足之处是要依赖消息循环,不能在工作线程使用。时钟到了会将WM_TIMER放入消息队列,也会收到消息队列中消息数量和消息处理过程影响2.SetWaitableTimer 内核定时器,可以在任何线程使用。精度也较SetTimer高,不过对不同系统这个默认精度不同,可以通过timeBeginPeriod设置,这个在msdn SetWaitableTimer 的介绍中也有提到:SetWaitab.
2022-03-24 18:16:32
703
原创 STL-多线程同步
1. mutex/recursive_mutex最基础的同步工具,需要手动lock/unlock,一般不直接使用,特别对于不可预期的异常情况,可能会导致mutex不能释放2. std::lock_guard/std::unique_lock/std::scope_locklock_guard/unique_lock有些相似,都是在构造中对mutex加锁,析构时释放。不过相对于lock_guard,unique_lock有更多的构造函数重载,所以功能相对强大一些。先看lock_guard:
2021-09-14 16:15:17
449
原创 QT-QQuick开发心得
1.qmlRegisterType 可以注册类型到qml中使用的,尽量注册qml类型,在qml中生成对象由qmlengine管理生命周期。但是这样也有缺陷,就是在其他qml中访问不方便 qmlRegisterUncreatableType<Tester>("Logic", 1, 0, "Tester", ""); qmlRegisterType<AudioTesterList>("Logic", 1, 0, "AudioTesterList");2. rootCon.
2021-08-27 15:21:04
1270
原创 音质测试-PESQ
https://github.com/ludlows/python-pesq/tree/master/pesqhttps://blog.youkuaiyun.com/hanbo622/article/details/102668650
2021-08-24 15:54:27
531
原创 Git常用操作
1.Git回滚merge操作git reflogd8c3069 HEAD@{6}: commit (amend): Merge branch 'dev_feature' into dev4a0b7a9 HEAD@{7}: merge dev_feature: Merge made by the 'recursive' strategy.3d7c80d HEAD@{8}: checkout: moving from dev_feature to devgit reset --hard 3d7
2021-08-20 19:36:47
110
原创 QT-qrc资源管理
QT中对图片、qml资源都是通过qrc来管理的,本质上就是将这些资源通过二进制的方式,放入一个静态数据中,在编译时一块编译到二进制中。这块有两个疑惑,通过qrc加载对应文件时怎么找到对应的二进制数组 不同模块中的二进制资源如果相互引用的问题第一个问题,没有看过源码,但是大致猜测,应该是QT框架维护了一套qrc路径与二进制数组的映射关系,可以在使用qrc资源的地方替换为实际的资源二进制数据第二个是因为QT在编译qrc时不仅生成了二进制静态数组,还生成了初始化资源的接口,同时有一个全局变量,在全局.
2021-05-24 15:13:54
749
原创 QQuick-C++操作QML对象
QT官方推荐QML只作为UI编写和UI简单逻辑,C++用来做业务逻辑的方式来分离界面和逻辑。QML中操作C++类或者对象Doc中非常详细,对于C++操作QML有很多隐晦的地方。QML:main.qmlimport QtQuick 2.14import QtQuick.Window 2.14Window { visible: true width: 640 height: 480 title: qsTr("Hello World") Rectangle{
2021-04-16 21:29:44
1177
原创 Windows网络状态判断
项目中应用的长连底层是通过socket建立连接的,但是socket并不能及时的感知当前网络的状态,比如网络断开,在iOS上socket并不能立即感知,需要通过心跳等手段来当前是否断开。这一点在Win10上没有,Win10上如果断开网线或者wifi socket都能及时抛出错误,但是网络重新连接成功后并不能及时识别,这就造成了再windows上网络连接之后底层socket连接不能及时去重新建立,这就需要通过上层来通知底层进行重建。有两种方式可以获取windows上网络连接信息:主动获取。通过INetw
2021-03-15 14:09:33
2097
原创 QQuick入门简介
QQuick是QT最新推出的界面框架,也是目前主推的方式,widgets框架已经不再有新的更新,区别于QWidget框架,QQuick是基于OpenGL,Metal,Vulcan这些底层设施之上的,比QWidget无论从效果还是效率上会有更大的提高。QQuick是有独立渲染线程的,所以在很大程度上减小了主线程的压力,主线程只需要负责界面交互,渲染线程负责绘制到底层。但是不能说完全没有劣势,在实际应用中,QQuick的问题还是要比QWidget多的,比如说底层显卡驱动的支持问题,有些显卡对OpenGL的支
2021-02-22 10:43:29
8584
原创 自定义输入输出流(istream/ostream)
C++中输入输出流对于读写一些buffer,设备非常容易,比如最常用的文件,管道,串口,网络都可以用这种方式。所以对于一般要自定义流式操作需要了解istream/ostream, streambuf这两个类的用途。这里只用istream也就是输入流举例:istream定义了对设备或者buffer的操作方法,包含的方法有read,readsome, >>这些读取操作 streambuf可以用来继承自定义buffer或者设备的数据读取和缓存方法istream是施加在streambuf上的
2021-02-07 20:02:29
3570
原创 C++文件\文件夹压缩-QuaZip
打包压缩文件、文件夹是个比较常见的操作,之前在代码中使用的一直是7z.exe,利用命令行进行打包。现在发现了一个更好的选择,可以跟项目有更高的集成度,QuaZip.QuaZip git:https://github.com/stachenov/quazip.git直接看这个项目,这个项目是用CMake来组织的,所以直接用CMake将项目转为VS工程,因为依赖的了zlib,所以提前准备好zlibZlib :http://www.zlib.net/zlib没有托管在git上,但是主页直接提供了.
2020-12-18 14:35:28
712
1
原创 TensorFlowLite GPU加速
TF LITE支持移动端GPU加速,特别对android端的支持比较丰富。相对android来说,对IOS的支持就有点差了。从给出的文档也能看出,android的文档也比IOS的丰富。TF LITE明确只支持android和ios端,而且在不同的系统上会有不同表现。即便是可以用GPU,也有可能是部分操作可以应用GPU加速,部分依旧在CPU上,这要看具体系统对GPU操作的支持。TF LITE在运行时会给出log引用官方的解释:不支持的模型和 ops如果一些 ops 并不支持 GPU 代理
2020-12-02 17:51:20
2225
原创 TensorFlowLite C++移动端接入
TensorFlowLite是专为移动端开发的深度学习框架,这个框架在windows上依然可以使用。编译:TF NoiseSuppression依赖于tf lite库,编译方法: 进入lite目录tensorflow\lite 执行cmake命令编译对应平台的lite库 以win32为例:cmake ../tensorflow/tensorflow/lite -G"Visual Studio 16 2019" -A"Win32",生成一个WIN32的VS项目,cmake在生成
2020-12-02 17:41:33
919
1
原创 boost.asio异步IO在各平台下的实现
basic_socket.hpp中将服务区分为了两种,一种是reactive_socket_service 一种是win_iocp_socket_service,这点跟操作系统类似,unix类系统和windows系统。因为unix上面的异步io用的都是reactor模式,windows的iocp是proactor模式,所以名称也是相对的。iocp不具体说了,只有windows平台下有,有极高的效率,因为io的工作基本系统都已经帮上层做了。参考basic_socket对具体平台的实现定义:#if
2020-11-16 20:55:21
753
原创 STL中的字符编码转换
C++工程中编码转换的场景还是很多的,如果用QT工程,QString本身就提供了很多转换的函数,如果是Win32项目,也可以借助WideCharToMultibyte函数进行转换,问题是不能跨平台,这个接口也不方便用。所以利用C++自身提供的库来解决是最好的。#include <iostream>#include <string>#include <locale>int main(){ std::locale loc(""); auto& f
2020-10-31 17:06:17
791
原创 C++ 标准输入输出流探索-实现日志模块的流式输出
最近想要做一个日志输出接口,想用类似std::cout这种流式输出方法,研究了一下C++的标准输入输出库 iostream图片摘自cppreferenceios_base,basic_ios不需要过多关注,是一些基础结构和接口定义,基本用不到basic_ostream用于流式输出(std::cout实现自这个类),basic_istream用于流式输入(std::cin实现自这个类),如果想要通过流的方式处理数据就得用到这两个类,iostream是他们两个的合集。basic_ofstr.
2020-10-29 18:16:02
906
1
原创 对称加密-AES-ECB模式
AES作为现在最常用的对称加密方法,主要优点有:运算速度快,加密程度高,内存消耗少。加密模式有:ECB,CBC,CFB,OFB。ECB相对于其他模式,简单,支持并行计算。作为分组加密的一种AES将数据以16字节为一组,对每一组进行同样的加密。可以循环对源数据每一组进行加密,因为ECB模式各分组加密独立,不依赖于上一分组,也可以预先分组好,并行进行加密,然后拼接。因为要以16字节为一组加密,所以如果源数据大小不是16字节的倍数,最后一组数据需要填充,满足16字节。有三种填充方法:padding zer
2020-08-28 11:17:38
4185
原创 关于执行异步任务需要注意的几点
异步任务的场景现在已经越来越多,特别是底层的库基本都有自己的线程。方便高效的同时也带来很多问题,线程过多,已经多线程下的问题。在与C++结合的场景中要特别注意的是异步任务在对象销毁前一定要销毁,或者能够保证在异步任务执行结束前当前对象存在。解决方法:在对象析构函数等待异步任务执行完毕,或者停止线程后,等待线程退出。 在对象析构后保证所有的异步任务再不会访问到当前对象的数据(weak_from_this)对于普通的线程模型,第一种方法最为使用,在析构函数中停止线程,并且等待线程退出对...
2020-08-10 15:50:31
772
原创 三种方法cmd输出重定向(推荐boost.process)
有些场景需要通过执行cmd命令,并且获取返回的结果。有三种方法:boost.process _popen windows1.boost.proeess#include "boost/process.hpp"#include "boost/process/windows.hpp"std::string GetCmdResult(std::string cmd){ namespace bp = boost::process; std::string strResult;...
2020-07-03 12:04:59
3028
原创 std::enable_shared_from_this消除异步回调引发的野指针问题
std::enable_shared_from_this这个C++组件完美解决了异步回调发生时宿主对象销毁的问题。C++提供了lambda表达式和各种异步函数,std::thread,std::async或者其他框架api都提供了异步回调方法。特别是lambda在异步应用中实在是太方便了,比如发送一个http请求,接口可能是这样的api::get(url, [](response){ //解析response})。用起来方便,阅读起来也容易理解,但是同时也带来了问题,那就是回调回来的时候宿主类对象...
2020-07-01 16:12:44
1940
原创 心流 - 体验幸福
专注力、兴趣、目标 三者互为因果相互加强。因为投入注意力,产生了兴趣,兴趣之后发现了目标 ------ 不想干,确不得不做的事情 因为兴趣,所以投入了注意力,因为有了注意力加强了目标 ------ 不断培养兴趣爱好 因为有目标,所以加强了专注力,因为加强了注意力,所以产生了兴趣 ------ 计划好轻重缓急,有条不紊的生活才不会陷入精神熵。 精力管理很重要,做好计划,轻重缓急,目标明确,做事投入全部注意力。有条不紊。 ...
2020-06-13 16:50:19
240
原创 QML- Image在布局中大小不能适应
在实际应用Image的过程中,发现加入布局中以后Image的缩放就会有问题,即使指定了fillMode:Image.PreserveAspectFit也会发现图片显示大小虽然得到了调整,但是实际在布局中占用的宽度并没有调整Rectangle{ width: 800 height: 600 color: "white" RowLayout{ Image { id:first Layout.preferr
2020-06-12 20:41:38
2926
原创 QML调试配置
QTCreator可以方便的调试qml代码,方法也很简便,就是在工程配置的build中配置 Enable QML debugging and profiling,一般默认的QQuick应用会勾选。如果为Widget应用要用QQuickWidget需要调试qml,还需要在pro文件的QT配置中加入qml模块才可以调试QT += widgets qml...
2020-06-02 19:49:54
1626
原创 QML中的Layout和Anchor
相较于QWidget,QQuick中使用QML来写界面,开发效率和代码结构都有了明显的进步,而且新版本对QQuick的支持也越来越完备,无论效率,还是界面效果都要优于原有的Widget架构。QML中界面排布提供了两种方式Layout和Anchor,两个形式结合起来非常方便,之前Widget中只提供了Layout的支持,对于有些特殊分布非常不便。Layout(布局): 适用于元素并列排布的场景,元素之间没有重叠关系,大的方面界面的主要元素的分布都可以用RowLayout和ColumnLayout规划.
2020-05-21 20:35:32
2767
原创 Mars长连接管理
对长连的管理有两个方面,一个是心跳(HeartBeat),一个是重连(Reconnect)。这两个动作都是有策略性的。一般心跳会间隔性的发出一个很小的心跳包,通过服务端返回来判断连接是否健康。在网络断开会,会自动重连,一般遵循逐渐递增的方法,递增的策略有所不同。在Mars中,对这两个策略有更精细化的管理,在Mars中对App运行的状态分了两种1.前台活动状态(forground-a...
2020-04-28 15:41:08
1192
原创 C++17 获取文件最后修改时间
C++17之后又加入了filesystem库,让文件操作也成为了跨平台的存在,文件创建,删除,遍历都不在话下。其他接口都很好用,这里说一下文件修改时间获取时遇到的问题。 std::filesystem::last_write_time可以获取指定文件的最后修改时间,但是获取到的时间是file time,这与systemtime也就是UTC时间不同。 filet...
2020-02-29 14:20:14
6768
4
原创 C++获取当前时间 (std::chrono)
在C++11之前要获取当前时间,大多数情况下要使用C语言的time库:#include <iostream>#include<time.h> #include <sstream>int main(){ time_t now = time(NULL); tm* tm_t = localtime(&now); std::string...
2020-02-28 20:25:19
49857
原创 本地缓存(key-value)
目前在做本地缓存时常用的方式是用sqlite作为本地缓存数据库,缓存使用的场景很多,每次都设计表就变成一件很麻烦的事情,而且很多场景就只是用来记录一些配置信息,所以采用key-value这种接口去封装sqlite就是一种很好的方式。接口:#include <string>class LocalStorage{public: SINGLETON_DEFINE(Loca...
2020-02-26 16:35:24
497
原创 创建扩展性良好的框架-单例框架(实现)
单例可以算是业务开发中最常用的方式,一个对象可以全局使用,但是普通的单例对象只能在当前模块(exe/dll)中使用,其他模块要使用的话需要显示导出才可以,不利于业务之间的交互。 宏接口://注册单例接口#define REGINSTANCE(interface, CLASS)\static auto interface##Func = []()\{\ sta...
2020-02-26 16:35:03
112
原创 创建扩展性良好的框架-插件框架(实现)
一般在业务开发中,要分很多个模块来进行协作,模块多了之后就会有依赖问题,包括模块的启动顺序,统一初始化,释放资源等等,所以就需要一个来管理模块的框架,插件框架。外部接口:插件管理启动所有注册插件,并初始化//启动框架#define STARTCOMPONENTSERVICE StartComponent(); 注册模块(dll), 并在dll中实现以下虚接口供插件管理调用...
2020-02-26 16:34:51
123
原创 创建扩展性良好的框架-通知框架(实现)
一般来说通知框架可以有效的解耦业务逻辑,就类似于订阅者模式,任何模块都可以注册自己关注的接口,接口事件发生时会主动通知该模块。通知框架向外部提供的宏://注册通知#define LISTEN(INotify)\AddInterface(#INotify, (void*)(INotify*)this);//去除通知#define UNLISTEN(INotify...
2020-02-26 16:09:08
152
原创 创建扩展性良好的框架-(通知\单例\插件)框架
面向外部的接口:#pragma once#include <functional>#ifdef CORECENTER_EXPORTS#define CORECENTER_EXPORTS __declspec(dllexport)#else#define CORECENTER_EXPORTS#endifextern "C"{ CORECENTER_EXPORTS ...
2020-02-26 16:08:51
133
编译好的CPPCMS库
2015-11-05
图片拼接工具
2013-06-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人