自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qq_33588386的博客

从事于Windows客户端开发(音视频方向)

  • 博客(55)
  • 资源 (4)
  • 收藏
  • 关注

原创 FDK-AAC编码器 示例demo

【代码】FDK-AAC编码器 示例demo。

2025-05-13 11:07:49 70

原创 crashpad 编译

原因是本地缺少.client配置文件导致可执行 gclient config https://chromium.googlesource.com/crashpad/crashpad 解决。1.解压depot_tools 到当前目录 并把depot_tools添加到系统路径 注意:本机装python路径需先注释掉,之后编译依赖depot_tools。1.git 抓取https://chromium.googlesource.com/crashpad/crashpad (此步骤可跳过最新代码已更新)

2025-04-30 18:27:38 595

原创 VS2017编译Chromium和CEF支持播放MP4

注意: cef与chromium和depot_tools对应版本关系在 “cef\CHROMIUM_BUILD_COMPATIBILITY.txt”在 D:\cef\chromium\src\cef\binary_distrib 目录下就可以看到打包过的文件了。(7)将depot_tools路径("D:\cef\depot_tools)添加到用户环境变量Path。(1)、复制 D:\cef\cef 到 D:\cef\chromium\src。:: clone depot_tools工具。

2025-04-30 13:15:53 896

原创 Windows编译及使用fdk-aac编码器

/ 缓冲区当前存储的样本数(总样本 = buffer_size * 声道数)int channels_ = 2;// 默认PCM声道数为2(立体声)int frame_samples_ = 0;// 每帧需要的样本数(单声道)pcm_buffer_ = nullptr;// PCM 缓冲区(存储累积的样本)HANDLE_AACENCODER encoder_ = nullptr;

2025-04-30 13:13:24 448

原创 H.264添加 SEI 信息技术文档

2. encode_sei_header:编码 SEI 头部(Payload Type + Size),nal_unit: 输出的 NAL 单元容器,payload_type: SEI 类型(如 5=用户未注册数据),payload_size: 负载数据长度,每个字节最高位为延续标志(1 表示后续还有字节),其余7 位存储数据,按小端序排列。// 编码payloadType和payloadSize。// H.264起始码。// 创建SEI负载。

2025-04-30 13:12:38 923

原创 Qt QWebEngine应用和网页的交互

实现一个继承于QObject的通信类,注意,要继承于QObject,因为需要用到信号槽,这个类的主要作用是实现本地应用与网页端通信的方法,无论本地应用还是网页端都是直接调用这个通讯类的方法来实现两者之间的通讯的。重点:本地应用与网页端之间的通讯过程,是通过信号和槽函数实现的,本地应用通过发送信号达到把信息发送到网页端,而网页端通过直接调用槽函数实现把信息传到本地应用。很简单,就是本地应用通过发送通讯类的信号通知网页端,网页端通过直接调用通讯类的槽函数来通知本地应用。//创建一个Qwebchannel对象。

2025-04-30 13:09:29 1197

原创 windows系统 压力测试技术

功能:是一个命令行工具,可以通过模拟低内存资源,句柄数,进程数,线程数以及其他的系统对象来压力测试你的PC或者应用程序。功能:是一个工具类,用来模拟在一个进程中启动最多64个线程,且可以独立控制任何一个线程的启动/暂停、优先级、活动级别[最大会导致对应线程连续运行]删除选中线程:删除一个测试线程,如果是激活状态,占用的cpu资源会被释放,系统的cpu利用率会变低。菜单栏下的工具栏分别对应四个功能:运行选中线程,暂停选中线程,新增一个线程,删除选中线程。新增一个线程:新增一个测试线程,默认为非激活状态;

2025-04-30 13:08:52 607

原创 windows系统 压力测试技术

功能:是一个命令行工具,可以通过模拟低内存资源,句柄数,进程数,线程数以及其他的系统对象来压力测试你的PC或者应用程序。功能:是一个工具类,用来模拟在一个进程中启动最多64个线程,且可以独立控制任何一个线程的启动/暂停、优先级、活动级别[最大会导致对应线程连续运行]删除选中线程:删除一个测试线程,如果是激活状态,占用的cpu资源会被释放,系统的cpu利用率会变低。菜单栏下的工具栏分别对应四个功能:运行选中线程,暂停选中线程,新增一个线程,删除选中线程。新增一个线程:新增一个测试线程,默认为非激活状态;

2025-04-30 13:07:29 1244

原创 windbg调试dump文件

在允许目标再次执行或使用另一个寄存器上下文命令(.thread、.ecxr、.trap或.cxr)之前,此寄存器上下文将一直保持。在用户模式下,.cxr/w命令将上下文写入内存,并显示存储上下文的地址。定位当前异常的上下文信息,并显示指定上下文记录的重要寄存器。此命令还指示调试器将与当前异常关联的上下文记录用作寄存器上下文。在启用目标执行、更改当前进程或线程或使用另一个寄存器上下文命令(.cxr或.ecxr)之前,此寄存器上下文将一直保持。显示的信息包括异常地址、异常代码、异常标志和异常参数的变量列表。

2025-04-30 13:06:32 552

原创 QCefView应用和网页的交互

注册一个语言槽函数“Url: %1”).arg(url);/// 接收由JS发送过来的消息并回包/// 接受由JS发送的消息/** 注意:JS端通过调用 invokeMethod 方法,实际上会有两个参数变量传递过来,** 一个是 const QString& method, 通过method我们可以进行消息过滤,在Qt中进行消息分发处理。

2025-04-30 13:01:58 1297

原创 VS2017 编译QCefView

CEF 通过提供生产质量的稳定 API、跟踪特定 Chromium 版本的发布分支和二进制发行版,将用户与底层 Chromium 和 Blink 代码的复杂性隔离开来。CEF源码:https://cef-builds.spotifycdn.com/index.html(也可以不用下载 cmake构建的时候会自动下载相应的版本源码)灵活性高:CEF可以嵌入到任何C/C++应用程序中,无需安装额外的软件和插件,因此可以减少应用程序的大小和依赖性。

2025-04-30 13:00:35 479

原创 windows 使用websocket++ (C++环境)

(1)window环境可以直接在https://sourceforge.net/projects/boost/files/boost-binaries/上下载编译好的库文件。通过http://coolaf.com/tool/chattest网站去连接ws://127.0.0.1:9002 测试连接和数据的发送、接受。websocketpp使用手册:https://www.zaphoyd.com/websocketpp/manual/websocket官方网址:http://websocket.org/

2025-04-30 12:58:22 1143

原创 WebSocket与Socket、TCP、HTTP的关系及区别

Websocket:同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的,解决了服务器与客户端全双工通信的问题,包含两部分:一部分是“握手”,一部分是“数据传输”。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。Socket是对TCP/IP协议的封装,像创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

2025-04-30 12:57:04 943

原创 用QT自带的QMediaPlayer写一个音乐播放器

直接上代码头文件#pragma once#include <QObject>class QMediaPlayer;class QMediaPlaylist;#define SfPlayer MusicPlayer::GetInstance()class MusicPlayer : public QObject{ Q_OBJECTprivate: MusicPlayer(QObject *parent = nullptr);public: ~MusicPlaye

2022-01-26 17:31:28 897

原创 写一个QTAV的音乐播放器

关于QTAV的介绍和编译请看我之前的文章,直接上代码因为音乐播放器只有一个所以是个单例头文件:#pragma once#include <QObject>#include <QtAV/AVPlayer.h>#include <QtAVWidgets/GLWidgetRenderer2.h>using namespace QtAV;#define avplayer QtavPlayer::getInstance()class QtavPlayer :

2022-01-26 17:27:31 2320

原创 C语言 strcpy和memcpy源码实现

一、memcpy三个函数在使用过程中,均需包含以下头文件://在C中#include <string.h>//在C++中#include <cstring>二、memcpy函数是C/C++中的内存拷贝函数,它的功能是从源src所指的内存地址的起始位置开始,拷贝n个字节到目标dst所指的内存地址的起始位置中。实现如下: void* memcpy(void *dst,const void *src,size_t count) { void* ret = dst

2021-11-29 10:52:35 2579

原创 OpenCV读取视频文件

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;void PrintMs(const char *text = ""){ sta

2021-11-15 09:59:11 191

原创 OpenCV读取摄像头

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;void PrintMs(const char *text = ""){ sta

2021-11-12 13:54:19 1331

原创 OpenCV图像合并

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;void PrintMs(const char *text = ""){ sta

2021-11-12 13:51:48 906

原创 Opencv图像旋转

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;void PrintMs(const char *text = ""){ sta

2021-11-12 13:50:42 1307

原创 OpenCV两张图像融合

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;void PrintMs(const char *text = ""){ sta

2021-11-12 13:48:40 1497

原创 OpenCV图像金字塔

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;void PrintMs(const char *text = ""){ sta

2021-11-12 13:45:08 1040

原创 OpenCV重置图片大小尺寸

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;void PrintMs(const char *text = ""){ sta

2021-11-12 13:37:28 1517

原创 OpenCV调整对比度和亮度(自己实现和api实现)以及性能对比

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;void PrintMs(const char *text = ""){ sta

2021-11-12 11:49:00 743

原创 OpenCV二进制阈值化以及反二进制阈值化

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;void PrintMs(const char *text = ""){ sta

2021-11-12 11:45:32 1181

原创 OpenCV转灰度图(自己实现和api实现两种)以及性能对比

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace std;void PrintMs(const char *text = ""){ sta

2021-11-12 11:42:42 923

原创 OpenCV裁剪图片

#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/highgui.hpp>using namespace cv;int main(int argc, char *argv[]){ Mat src = imread("1.png");// 图片路径 Rect rect(100, 100, 200, 200); Mat roi = src(rect);

2021-11-12 11:33:50 1133

原创 C++智能指针 shared_ptr

为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer)。智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来)。C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头文件。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的

2021-11-08 14:47:16 224 1

原创 OBS技术交流群

有喜欢OBS开源技术的加群

2021-10-15 15:57:03 1016 1

转载 C++ 四种类型转换

众所周知C++关于类型转换引入了四种方式:1、static_cast2、const_cast3、dynamic_cast4、reinterpret_cast1、为什么要引入这几种类型转换,它与C语言中的强制类型转换有什么区别?2、这四种类型转换分别应用在什么场景?我们都知道C++完全兼容C语言,C语言的转换方式很简单,可以在任意类型之间转换,但这也恰恰是缺点,因为极其不安全,可能不经意间将指向const对象的指针转换成非const对象的指针,可能将基类对象指针转成了派生类对象的指针,这种转换很

2021-04-14 19:50:59 205

转载 C++ 友元类和友元函数详解

私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。C++ 是从结构化的C语言发展而来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。C++ 设计者认为, 如果有的程序员真的非常怕麻烦,就是想在类的成员函数外部直接访问对象的私有成员,那还是做一点妥协以满足他们的愿望为好,这也算是眼前利益和长远利益的折中。因此,C++ 就有了友元(fr

2021-03-31 15:42:16 390

转载 音视频 pts dts基本概念及理解

视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程,就像在一个本子的每一页画上画,然后快速翻动的感觉。但是在实际应用中,并不是每一帧都是完整的画面,因为如果每一帧画面都是完整的图片,那么一个视频的体积就会很大,这样对于网络传输或者视频数据存储来说成本太高,所以通常会对视频流中的一部分画面进行压缩(编码)处理。由于压缩处理的方式不同,视频中的画面帧就分为了不同的类别,其中包括:I 帧、P 帧、B 帧。I、P、B 帧I 帧、P 帧、B 帧的区别在于:I 帧(Intra coded fr

2021-03-31 13:46:08 1389

原创 OBS源码分析(十一)怎么在OBS添加QT库,比如:Network、Multimedia

一、在进行OBS二次开发的时候难免要添加QT的一些库,而OBS是在VS中开发的,程序每次更新之后都要重新进行配置很麻烦,所以在此记录一下二、在UI模块中找到CMakeLists.txt文件并打开,添加find_package包和链接库,如下图:然后添加链接库三、修改完之后保存编译并选择全部重新加载...

2021-03-18 18:15:17 959

原创 C++ 虚继承详解

多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示:类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份,

2021-02-08 13:54:37 2623 3

原创 OBS插件分享(一)

最近有一个需求,就是想把OBS中的某一个源的音频单独输出到一个独立的声卡,于是在Github上找到了一个现成的插件,现在把它分享给大家!1、这个插件是以滤镜的方式加载在OBS中的。如图2、编译方式源码地址:https://github.com/exeldro/obs-audio-monitor编译步骤:(1)建立OBS Studio:https://obsproject.com/wiki/Install-Instructions(2)将此存储库签出到UI / frontend-plugins

2021-02-07 13:56:10 2590

原创 OBS源码分析(十)-滤镜的创建

一、OBS的滤镜都是以插件的方式去加载的,对应的OBS项目工程是:二、滤镜的创建过程1、右击选择的源void OBSBasic::on_sources_customContextMenuRequested(const QPoint &pos){ if (ui->scenes->count()) { QModelIndex idx = ui->sources->indexAt(pos); CreateSourcePopupMenu(idx.row(), fal

2021-02-02 11:15:30 1746

原创 OBS源码分析(九)-窗口视频预览

最近接了个需求,要在源列表的每个源进行视频预览类似如下图:一、OBS所有的视频预览包括主窗口的预览都是继承OBSQTDisplay这个类。在SourceTreeItem构造函数中添加以下代码 // 预览窗口 play = new OBSQTDisplay(); play->setFixedWidth(100); auto addDrawCallback = [this]() { obs_display_add_draw_callback(play->GetDisplay(),

2021-02-02 10:27:49 1951 5

原创 c++ 11 lambda表达式

lambda的申明方式Lambda表达式是c++11的新特性,它允许程序员在函数内部创建一个匿名函数,对于一些小型的功能模块,可以使用lambda表达式来实现。很多其他语言已经有了lambda表达式,比如objective-c中block就类似。Lambda表达式的声明方式:例如:auto fadd = [](int a, int b){ return a + b;};Fadd就是一个匿名函数,后面是它的实现,auto是自动类型,也是c++11新加入的特性,auto可以自动判断.

2021-02-01 16:02:12 210 3

转载 OBS源码分析(八)分析libobs几个主要的线程

最近一段时间再看OBS的几个重要的线程,通过不断的学习和结合一些大佬的博客终于相对搞明白了这几个线程,分别是采集渲染线程和编码线程,分析如下:struct obs_core_video几个关键变量的注释:// 主画布 渲染当前场景下sources的画布 // 渲染主窗口的窗口时 直接把这个纹理贴到display中gs_texture_t *render_texture; // output画布 如果直播录像时的宽高(output宽高)和主画布宽高不一样,// 需要在该画布上对render

2021-01-13 11:38:16 2487 1

原创 C++ 11智能指针-unique_ptr

一、前言c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句就返回了,如果我们不在每一个可能跳转或者返回的语句前释放资源,就会造成内存泄露。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源二、应用unique_ptr 由 C++11 引入,旨在替代不安全的 auto_ptr

2021-01-11 18:11:35 301

QCefView源码编译以及demo的实现

本资源主要是利用源码编译QCefView,然后利用QCefView写了一个小demo,里面的工程直接可以打开编译运行都是现成的,其中QCefView-master文件夹是对QCefView源码的编译,Cef文件夹是对QCefView做得demo

2020-12-18

QT/C++实时获取CPU和内存的使用率

本资源能获取电脑的CPU和内存的使用率,也能够跨平台使用包括Windows、macOS、Linux,调用方法简单,里面是一个pri文件,直接可以加在自己的工程里面,调用方法有说明

2020-12-17

很全的音视频学习资料

本资料包括FFmpeg、H264、音视频编解码的pdf,比如:音视频编解码详解.pdf、多媒体技术基础.pdf、新一代视频压缩编码标准H.264.pdf、RTMP协议规范(中文翻译).pdf等等,资料比较各个等级的开发。

2020-12-17

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

TA关注的人

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