大王算法
主要做机器人,操作系统,算法及AI方面的研发工作,有感兴趣的朋友可以私信加我好友,一起探讨交流!
展开
-
奇校验及校验和的帧校验机制详解
此代码首先定义了设置奇校验位的setOddParity函数,然后定义了计算校验和的calculateChecksum函数。在main函数中,我们创建了一个示例数据帧,并打印出带有奇校验和校验和的结果。采用奇校验及校验和的帧校验机制,可以增加数据传输的可靠性。在这种机制下,每个数据字节包含一个用于奇校验的校验位,确保每个字节中“1”的数量为奇数。此外,在每个数据帧的末尾添加一个校验和字节,这个校验和是除通讯标志外的所有字节(包括数据和校验位)之和的补码。以下是采用奇校验及校验和机制的。原创 2024-04-13 14:55:03 · 442 阅读 · 0 评论 -
C++开源库大全
程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。原创 2024-04-13 10:18:40 · 439 阅读 · 0 评论 -
C++内存泄露处理方法
在使用C++进行软件开发时,内存管理是一个核心且不可回避的问题。不当的内存管理不仅会导致内存泄露,还可能引发程序的不稳定甚至崩溃。本文将详细探讨C++中内存泄露的成因、诊断方法以及预防和修复策略,以提高开发者在实际工作中对内存管理的掌控能力。内存泄露指的是程序在申请内存后,未能在不再使用它时正确释放,导致内存资源无法被再次有效利用。长时间运行的程序如果存在内存泄露,将会逐渐消耗完系统所有可用内存,影响程序性能,甚至导致程序和系统的崩溃。正确管理内存是C++编程中至关重要的技能。原创 2024-04-13 10:17:43 · 371 阅读 · 0 评论 -
每个C++开发者都应该使用的十个C++11特性
这篇文章讨论了一系列所有开发者都应该学习和使用的C++11特性,在新的C++标准中,语言和标准库都加入了很多新属性,这篇文章只会介绍一些皮毛,然而,我相信有一些特征用法应该会成为C++开发者的日常用法之一。你也许已经找到很多类似介绍C++11标准特征的文章,这篇文章可以看成是那些常用特征描述的一个集合。目录:auto关键字nullptr关键字基于区间的循环Override和final强类型枚举智能...翻译 2018-02-28 22:01:37 · 60 阅读 · 0 评论 -
assert()函数用法详解--C++面试细节(2)
函数是 C 和 C++语言中的一个宏,它用于辅助调试程序。它主要用来检查程序中的假设是否为真,如果假设为假(即表达式结果为假,或者说为0),则 会让程序终止并打印一条错误信息。assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行。 函数的原型定义如下: 3.典型使用 在 C++ 中,assert() 宏定义在 头文件中,在 C 语言中是 。使用 assert() 的典型方式如下: ass原创 2020-02-27 20:59:37 · 233 阅读 · 1 评论 -
#pragma pack()用法--C++面试细节(1)
#pragma pack(n)的意思是告诉编译器字节对齐方式为n字节对齐,n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须原创 2018-05-27 18:29:33 · 77 阅读 · 1 评论 -
C++模板类 容器之map及对象副本 深/浅拷贝等问题浅析
(1).一个未命名的临时string 对象被构造并传递给与map 类相关联的下标操作符,这个对象用Anna 初始化,(2).在word_count 中查找Anna 项,没有找到(3) .一个新的键/值对被插入到word_count 中。当然键是一个string对象持有“Anna”。但是值不是1而是0(4).插入完成接着值被赋为1用下标操作符把map 初始化至一组元素集合,会使每个值都被初始化为缺省值。然后再被赋值为显式的值,如果元素是类对象而且它的缺省初始化和赋值的运算量都很大。原创 2024-03-25 22:18:35 · 275 阅读 · 0 评论 -
C++项目管理
弱耦合的模块可以在不同的 git repo(svn库)里,比如 alicpp的三方库,甚至于一些二方库,它们可以有自己的 git repo,只要我们有办法找到他们的 include 和 lib就可以和它们对接编译和链接,我们也可以从容的针对它们的不同版本进行引进,非常长期的做版本升级工作。并不是让我们每天都发布,适当的控制风险是必要的,但是可以认为任何超过一个月的发布都是拖沓的和缓慢的,我们控制风险靠的是测试集群的设立,尽可能模拟线上环境的测试,灰度发布,等等手段,其中没有一个是“等待”。原创 2024-02-18 22:31:11 · 1032 阅读 · 0 评论 -
Visual Studio 必知快捷键指南
(1).按“Ctrl+Tab”键,打开IDE导航窗口,按住Ctrl键,同时用方向键或鼠标选中一个文件或工具窗体来激活。(1).菜单:按“Ctrl+Alt+Down”显示“文件下拉菜单”,可以通过上下的方向键来选择文件打开文件。(1).在代码块的任意位置,按“Ctrl+m,Ctrl+m” ,可以折叠或展开光标所在代码块。(1).按Ctrl+Shift+U 将当前字符或选中的字符转换为大写;(1).设置或取消书签:Ctrl+K, Ctrl+K;(2).转到下一书签:Ctrl+K, Ctrl+N;原创 2024-02-18 22:30:33 · 2070 阅读 · 0 评论 -
C++序列化简析
CArchive类是VisualC++程序设计中最常用的文件处理的方法,CArchive类不仅可以实现简单数据结构的读写操作,还可以通过对CObiect类的派生实现对复杂数据结构的读写操作,因此,利用CArchive类,可以轻松实现任意数据结构的序列化。在使用基于OTT的数据库结构的程序进行性能测试时,由于读入的PNR数据是XML格式的文档,所以,读入XML文件到内存,将其转为DOM树,继而将DOM树中的数据转化为OTT数据库所需要的对象结构,需要耗费大量的时间。如果估计大了,又会造成空间的浪费。原创 2024-01-28 13:02:44 · 267 阅读 · 0 评论 -
树状数组算法C++实现
一、问题树状数组是类似的一个数据结构,支持单点修改、查询,区间修改、查询等操作,当你用查分TLE时,你就可以用树状数组解决。二进制有很多奇妙的应用,这里介绍其中非常经典的一个,也就是 lowbit 运算,即lowbit(x)=x&(-x)。那么这个式子是什么意思呢?先来看 -x 从二进制的角度发生了什么。由计算机组成原理可以知道,整数在计算机中一般采用的是补码存储,并且把一个补码表示的整数 x 变成其相反数 -x 的过程相当于把的二进制的每一位都取反,然后末位加 1。原创 2023-11-30 20:03:13 · 1009 阅读 · 0 评论 -
基于RK3399的MPP库实现的视频编码
本项目实现主要是通过对采集的摄像头输入的视频数据,经过RKMPP的MPP库实现的视频编码,输出H264的编码数据。原创 2022-10-30 20:27:47 · 3103 阅读 · 11 评论 -
RKMPP库快速上手--(二)MPP关键配置
一行有 11 个像素(Width = 11), 对一个 24 位(每个像素 3 字节)的图像, Stride = 11 * 3 + 3 = 36.一行有 11 个像素(Width = 11), 对一个 32 位(每个像素 4 字节)的图像, Stride = 11 * 4 = 44./*在视频编码中,GOP的意思是画面组,指定了intra-和inter-帧的顺序。压缩的视频流中GOP相对独立,解码器解码新的GOP时需要之前的帧来解码后面的帧,struct MPP_ENC_DATA //编码所需要的数据。..原创 2022-08-30 21:02:06 · 2525 阅读 · 0 评论 -
RKMPP库快速上手--(四)MPP编码入门
为了方便理解和使用,我将mpp的编码封装成了一个class,只需要在定义对象时给出编码器初始化的数据(包括输入图像的首地址、数据格式、宽高,输出视频流的编码格式、FPS以及输出文件路径),后续的使用则只需要通过“process_image(uint8_t *p)”接口向对象喂图片即可,编码器会自动将图像编码然后存入视频流文件。如上图所示,mpp_create,mpp_init,mpp_destory操纵MppCtx接口,红框内是实现编码与解码的过程。首先,了解MPP编码之前,先了解一下MPP的MPI接口。.原创 2022-08-30 21:02:13 · 4830 阅读 · 0 评论 -
RKMPP库快速上手--(三)MPP解码入门
常用设置的一些模式解释如下:(其余的可以看MPP自带的开发文档,在doc目录下有详细说明)MPP_DEC_SET_PARSER_SPLIT_MODE : (仅限解码),自动拼包(建议开启),硬编解码器每次解码就是一个Frame,所以如果输入的数据不确定是不是一个Frame(例如可能是一个Slice、一个Nalu或者一个FU-A分包,甚至可能随意读的任意长度数据),那就必须把该模式打开,MPP会自动分包拼包成一个完整Frame送给硬解码器。MPP_DEC_SET_IMMEDIATE_OUT: (仅限解码)..原创 2022-08-30 21:02:32 · 3192 阅读 · 0 评论 -
FFmpeg AVPacket详解
操作AVPacket的函数大约有30个,主要可以分为:AVPacket的创建初始化、AVPacket中的data数据管理(clone,free,copy等)、AVPacket中的side_data数据管理。AVPacket的创建有很多种,而由于Packet中的数据是通过data引用的,从一个Packet来创建另一个Packet有多种方法。av_read_frame 这个是比较常见的了,从媒体流中读取帧填充到填充到Packet的数据缓存空间。原创 2022-07-31 20:53:36 · 1238 阅读 · 0 评论 -
FFmpeg 的AVCodecContext结构体详解
AVCodecContext 是FFmpeg使用过程中比较重要的结构体,它包含了编解码(codec)的所有信息。FFmpeg 是一个开源的音视频处理框架,广泛用于音视频的编码、解码、转码、mux、demux、流处理、过滤等领域。在 FFmpeg 库中,AVCodecContext 是处理媒体数据流中最为核心的结构之一。它定义了编解码器(encoder/decoder)的相关操作以及处理媒体数据所必须的各种参数。原创 2022-07-31 20:30:55 · 1965 阅读 · 0 评论 -
RKMPP API安装使用总结
Mpp的API思路其实跟目前绝大多数的编解码库是一致的,都是queue/dequeue的队列操作方式,先设置好编解码状态,然后不停的queue/dequeueinput/outputbuffer就可以实现编解码控制了。自动拼包(建议开启),硬编解码器每次解码就是一个Frame,所以如果输入的数据不确定是不是一个Frame(例如可能是一个Slice、一个Nalu或者一个FU-A分包,甚至可能随意读的任意长度数据),那就必须把该模式打开,MPP会自动分包拼包成一个完整Frame送给硬解码器。......原创 2022-07-31 20:01:06 · 2909 阅读 · 1 评论 -
RKMPP库快速上手--(一)RKMPP功能及使用详解
我们可以通过gstreamer和ffmpeg的mpp插件来使用mpp硬件加速,但是这两种应用程序都会因为兼容api的原因,徒增几次无用的帧拷贝动作,并且使用的都是虚拟地址。如果想榨干芯片的性能,开发最完美的代码,纯连续的物理buffer和mpp+rga是离不开的。Mpp的API思路其实跟目前绝大多数的编解码库是一致的,都是queue/dequeue的队列操作方式,先设置好编解码状态,然后不停的queue/dequeueinput/outputbuffer就可以实现编解码控制了。...原创 2022-07-31 19:09:18 · 7726 阅读 · 2 评论 -
GStreamer在Linux平台的交叉编译
一、下载源码: GStreamer: 新闻 我这里是下载到Linux的桌面目录,先拷贝文件到opt:sudo cp -r ohos-sdk/* /opt解压文件:sudo unzip *.zip解压完配置环境变量:fanyun@ubuntu:/opt/linux$ sudo vi /etc/profilefanyun@ubuntu:/opt/linux$ source /etc/profile 1 编译依赖首先依赖关系如下:gstreamer -> glib -原创 2022-06-28 22:55:10 · 1233 阅读 · 1 评论 -
Gstreamer函数使用总结
1、GSteamer的基本API的使用2、创建元件并且链接起来3、添加衬垫,添加回调,手动链接衬垫4、打印gstreamer的版本信息5、gstreamer封装的argparse6、创建gst元件对象7、查看插件8、链接元件9、箱柜(箱柜本身是一个元件,但是它内部还可以是一串链接起来的元件)10、bus总线...原创 2022-06-28 22:37:44 · 3140 阅读 · 0 评论 -
Gstreamer应用开发实战指南(五)
1、垫和功能: 正如我们在 Elements 中看到的,焊盘是元素与外界的接口。 数据从一个元素的源焊盘流向另一个元素的接收焊盘。 元素可以处理的特定媒体类型将通过 pad 的功能公开。2、垫: 焊盘类型由两个属性定义:方向和可用性。 正如我们之前提到的,GStreamer 定义了两个焊盘方向:源焊盘和接收焊盘。 这个术语是从元素内部的角度定义的:元素在它们的接收垫上接收数据并在它们的源垫上生成数据。 示意性地,sink pads 绘制在元素的左侧,而 source pads 绘原创 2022-06-28 22:23:02 · 1209 阅读 · 0 评论 -
Ubuntu 命令安装VSCode
Ubuntu 命令安装 VSCode原创 2022-05-31 20:55:40 · 5973 阅读 · 3 评论 -
数据校验及校验和总结
1.校验和(Checksum)总和检验码,校验和。在数据处理和数据通信领域中,用于校验目的的一组数据项的和。这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串。2.数据校验的作用数据校验是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,说明数据是完整的。保证数据的完整性和准确性。3.常用的校验和(Checksum) 算法总结(1).最简单的校验...原创 2022-01-30 22:18:01 · 5017 阅读 · 2 评论 -
网络数据传输的封装总结
数据封装(Data Encapsulation)是指将协议数据单元(PDU)封装在一组协议头和尾中的过程。在OSI七层参考模型中,每层主要负责与其它机器上的对等层进行通信。该过程是在协议数据单元(PDU)中实现的,其中每层的PDU一般由本层的协议头、协议尾和数据封装构成。原创 2022-01-30 21:38:54 · 5079 阅读 · 0 评论 -
网络协议数据解析
1、网络数据解析我们在实际应用中,网络数据解析是非常常见的一种数据处理方式,那么有没有比较通用的数据解析处理方法呢,以下是个人总结的一种网络数据解析处理方法2、数据包格式 图1-1是一个比较通用的数据包格式,本次数据解析模型以下图的数据格式为准:3、代码实现int ReceiveFromRemoteEndPoint(){ int nPackageDataLength = 0; char *szPackageCleaner = NULL;...原创 2022-01-30 21:35:34 · 3618 阅读 · 0 评论 -
c++ 日志输出库 spdlog 简介
spdlog是一个开源的、快速的、仅有头文件的C++11 日志库。它提供了向流、标准输出、文件、系统日志、调试器等目标输出日志的能力。它支持的平台包括Windows、Linux、Mac、Android、iOS。官方参考:https://github.com/gabime/spdlog/wiki/8.-Tweaking1、下载源码代码地址在https://github.com/gabime/spdlog1).非常快,性能是它的主要目标;2).仅包括头文件;3).日志的格式...原创 2021-10-24 17:34:30 · 1034 阅读 · 0 评论 -
error C4996 ‘inet_addr‘ Use inet_pton() or InetPton() instead or define _WINSOCK
在SIP开发过程中,遇到error C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings,此问题在vc2013及以上版本都会出现,主要是编译器进行了安全检查,部分旧的函数限制使用。解决此问题有2种方法第1种方法是去掉SDL检查。设置项目属性,将c/c++-&g...原创 2021-10-24 17:21:12 · 7612 阅读 · 1 评论 -
网络编程之inet_pton函数
这个函数的功能:将IP地址从字符串格式转换成网络地址格式,支持Ipv4和Ipv6.函数原型: static int inet_pton(int af, const char *src,void *dst)af: address family(协议族),支持的协议族有下面几种:AF_INET Inetnet的Ipv4协议AF_INET Inetnet的Ipv6协议src:是个指针,指向保存IP地址字符串形式的字符串。dst:指向存放网络地址的结构体的首地址int inet...原创 2021-10-30 13:50:46 · 19351 阅读 · 1 评论 -
error C4996 ‘pugixml_documentload‘ 被声明为已否决的解决方法
Gbd28181Device.cpp(550,18): error C4996: 'pugi::xml_document::load': 被声明为已否决对于上面的问题,我找到以下三种解决方法:方法1: Project Properties > Configuration Properties > C/C++ > General > SDL checks关掉方法2: #pragma warning(disable: 4996)方法:3: /wd 4996...原创 2021-10-24 17:13:46 · 649 阅读 · 0 评论 -
GB28181 PS流解析
我们在一般在gb28181发送码流选择PS流,PS流再封装H264的数据。那么如何封装PS流,PS流如何封装H264呢?本文详细描述如何通过PS流解析H264码流。先研究下PSM(节目流映射),PSM头定义如下:这里找了一个标准的PS流里面的PSM数据进行研究分析:packet_start_code_prefix—24bit :00 00 01。map_stream_id-8bit:BC。program_stream_map_length-16bit:0...原创 2021-10-24 17:09:55 · 1837 阅读 · 0 评论 -
vs2019编译osip和eXosip库及测试示例
1.环境准备及编译源码下载:系统:Winodws10编译环境:VS2019源码下载链接:http://mirror.ossplanet.net/nongnu/exosip/http://ftp.twaren.net/Unix/NonGNU//osip/https://c-ares.haxx.se/download/下载完,新建工程目录,解压文件:打开exosip\platform\vsnet文件夹下的libcares.vcxproj,开...原创 2021-08-29 22:24:30 · 636 阅读 · 0 评论 -
linux exosip编译,openssl、libosip2、libeXosip2三个库的编译过程
一、安装包准备及编译osip2:http://www.gnu.org/software/osip/eXosip2:http://savannah.nongnu.org/projects/exosip/openssl:https://www.openssh.com1.编译openssl-8.5p1:1、./Configure linux-elf-arm -DB_ENDIAN linux:'arm_v5t_le-gcc' --prefix=/home/latelee.原创 2021-08-29 22:16:49 · 852 阅读 · 0 评论 -
视频通讯使用SIP协议详解
SIP(Session Initiation Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议。广泛应用于CS(Circuit Switched,电路交换)、NGN(Next Generation Network,下一代网络)以及IMS(IP Multimedia Subsystem,IP多媒体子系统)的网络中,可以支持并应用于语音、视频、数据等多媒体业务,同时也可以应用于Presence(呈现)原创 2021-08-29 22:12:57 · 4038 阅读 · 1 评论 -
MAVLink协议详解
MAVLink是为微型飞行器MAV(Micro Air Vehicle)设计的(LGPL)开源的通讯协议。是无人飞行器和地面站(Ground Control Station ,GCS)之间,以及无人飞行器之间通讯常用的协议。APM、PIXHAWK飞控,Mission Planner、QGroundControl地面站均使用了MAVLink协议进行通讯。MAVLink源码下载地址(现已更新至v2.0):https://github.com/mavlink/qgroundcontrol 用户手册:ht原创 2021-03-30 23:13:46 · 7050 阅读 · 0 评论 -
CMakeLists.txt 语法详解
一、Cmake 简介cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。二、常用命令1. 指定 cmake 的最小版本cmake_minimum_required(VERSION 3.4.1)这行命令是可选的,我们可以不写这句话,但在有些情况下,如果 CMakeLists.txt 文件中使用了一些高版本 cmake 特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行 cma原创 2021-03-30 23:12:35 · 1462 阅读 · 0 评论 -
Wireshark 在Mac上安装使用总结
目前网络上有很多抓包工具,但个人认为好的就那么几款,我一直在使用的Wireshark就是其中比较好用的一款。Wireshark是当今世界最流行的网络协议嗅探、抓包和分析工具,它使我们得以窥探网络上流动的数据及其协议细节,支持Windows、Mac上使用。下载Mac版本的Wireshark安装包:安装完以后,打开Wireshark:点击鲨鱼头按钮,开始抓包,报如下错误:wireshark选择网卡出错解决方法:打开终端输入命令:sudo chmod 777 /dev.原创 2021-02-28 19:34:59 · 3701 阅读 · 0 评论 -
C++使用lambda创建多线程
C++11 增加了线程以及线程相关的类, 而之前并没有对并发编程提供语言级别的支持,使用 std::thread 类来创建线程, 我们需要提供的只是线程函数, 或者线程对象, 同时提供必要的参数std::thread 表示单个执行的线程, 使用thread 类首先会构造一个线程对象, 然后开始执行线程函数#include <iostream>#include <thread> //需要包含的头using namespace std;void func(int a, d原创 2020-12-31 21:30:16 · 2409 阅读 · 0 评论 -
实时音视频质量测试
在对实时音视频的质量进行测试时,通常可以关注以下几个指标:1,流畅度主要受帧率(FPS)的影响。帧率:画面每秒传输的帧数,每秒钟显示的帧数愈多,所显示的动作就越流程。2,清晰度单位面积的画面所承载的信息。当帧率和分辨率固定时,主要受码率的影响码率:比特率,每秒传送的比特数。3,分辨率对视频大小和画质有着非常重要的影响。如果清晰度和流畅度不变,分辨率与视频画质成正相关,同等分辨率下,显示屏幕越大,主观感受越差。4,延时如果要满足比较流畅地进行实时互动,那么单向的端到原创 2020-10-24 22:39:08 · 1354 阅读 · 1 评论 -
常见分辨率和码率对应关系
一、计算公式基本的算法是:码率(kbps)=文件大小(KB)*8/时间(秒),举例,D5碟,容量4.3G,其中考虑到音频的不同格式,算为600M,(故剩余容量为4.3*1024-600=3803.2M),所以视频文件应不大于3.7G。如视频文件的容量为3.446G,视频长度100分钟(6000秒),计算结果:码率约等于4818kbps(3.446*1024*1024*8/6000=4817.857)。二、码率几点原则1、码率和质量成正比,但是文件体积也和码率成正比。2、码率超过一定数值,原创 2020-10-23 20:30:09 · 9192 阅读 · 0 评论