自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Heworld的博客

好笔头不如烂博客,记录些hello world 的过程。

  • 博客(39)
  • 资源 (5)
  • 收藏
  • 关注

原创 最简单的h264/h265/svac和g711封装成ps流符合gb28181过检码流要求

PS流(节目流)封装实现:#include <stdint.h>#include <string>#include <memory.h>#define H264_ID 0x1b#define H265_ID 0x24#define MPEG_ID 0x10#define SVACV_ID 0x80#define G711_ID 0x90#define SVACA_ID 0x9b

2019-07-09 14:32:27 8856 21

原创 linux上获取socket套接字接收/发送缓冲数据量

参数说明:socket fd需要查询的套接字;SIOCINQ查询接收缓存数据大小的宏定义参数,SIOCOUTQ查询发送缓存数据大小的宏定义参数,2选1;unsigned long &len 输出的大小。函数:ioctl(socket fd, SIOCINQ/SIOCOUTQ, unsigned long &len);头文件: linux/sockios.h。

2023-10-31 09:56:00 391

原创 va_list使用及两个注意项(可能导致崩溃和少1个字符)

va_list(vsnprintf)在linux和windows上使用有差异,linux上再次调用vsnprintf 前必须先调用va_start,否则可能导致崩溃或输出错乱。另外vsnprintf返回值必须小于内存空间大小,否则刚好相等时少1个字符输出...

2023-09-03 11:16:21 404

原创 resip 库接收到invite消息后抛出SDP异常(u字段缺少冒号)

resip 库接收到invite消息后抛出SDP异常(u字段缺少冒号)

2023-04-13 14:17:28 177

原创 linux产生大量CLOSE_WAIT且进程名为- 问题

背景:写了个简单的onvif相机模拟器,流程是绑定1000个端口作为onvif相机注册信令交换,又绑定一个端口作为rtsp流媒体服务,onvif信令是http请求会经常建立http短链接,奇怪的事是:当部分相机拉着流时,系统就会出现大量CLOSE_WAIT的链接,显示的进程为 -,且存在待接收数据。没有拉流就不会有,有的CLOSE_WAIT也会消失。执行 netstat -nap|grep CLOSE_WAIT如下:先的时候没发现这个规律,很是头疼一直找是不是什么地方漏clo...

2022-05-20 12:36:58 933

原创 C/C++子线程exit(0)退出时崩溃产生core文件

问题:程序中某个单例类在收到特殊信号后回调用exit(0)退出整个程序,但退出时总是产生core文件,文件不大,打开core文件堆栈都是些问号。只能review代码找bug。最后发现是线程资源没有回收,以下面这段代码分析下崩溃的原因。以上代码看似人畜无害,实则运行就崩。如果将static test aa;去掉static,也不会蹦,但C++中单例一般都是申明个静态变量,返回其引用,这样会导致这个变量在程序退出的最后才析构,所以走不到析构的joinI()语句,即使走到,不是他的父线...

2022-03-19 16:21:36 2163 1

原创 asio指定网卡加入组播组

rtspSocket.local_endpoint().address().to_string(); // 获取连接到媒体服务器的网卡ipmulticastSock.set_option(asio::ip::muticast::join_group(asio::ip::address_v4::from_string(multicastIP),asio::ip::address_v4::from_string(networkIP))); // 重点在这里,第二个参数可以不填,系统将随机选择网卡加入组播

2022-02-09 17:00:25 1978

原创 std::bad_alloc 异常产生原因之一

const std::string &test(){ return "123456";}void main(){ auto str = test();}调用上面的test()函数就会产生std::bad_alloc 异常,原因是return时构造了内容为123456的std::string变量,返回引用后变量就被析构了,再访问这个引用就会出现这个异常。总结:const std::string &用来返回类的成员变量时效率高,不用重新构造返回的std:.

2021-10-11 14:56:42 13298

原创 Windows fopen创建的文件名中文乱码

windows下使用fopen创建文件后发现文件名中文乱码,文件名是其他服务传来的的。原因是windows使用的是GBK字符集,而创建时传入的文件名是utf-8,需要将utf-8转gbk,转换方法见Linux和Windows上汉字的编码转换实现_Heworld的博客-CSDN博客...

2021-10-11 14:32:45 1191

原创 分析TCP负载的RTP/RTSP流的小技巧

分析tcp负载的rtp包,用一个小程序(含代码)转换tcp报文为udp,再分析数据

2021-08-15 01:07:06 1302

原创 修改git 客户端密码

windows(10)下通过凭证管理器修改:【控制面板】--【用户账户】--【管理windows凭据】--【windows凭据】下选择(普通凭据下)git:httpp://***编辑密码保存即可。linux下修改.git-credentials文件: 通常此文件在~目录下,不在的话 find / -name.git-credentials找到,vi修改密码即可。...

2021-07-26 15:42:01 3826

原创 Linux和Windows上汉字的编码转换实现

windows 上用系统api实现:MultiByteToWideChar(CP_ACP, 0, gb2312_addr, -1, temp_addr, n); WideCharToMultiByte(CP_UTF8, 0, temp_addr, -1, utf8_addr, n, NULL, NULL); linux下需要使用iconv还是实现:iconv_t cd = iconv_open("utf-8", "GBK");size_t ret = iconv(cd, &p

2021-07-21 00:46:38 1491 2

原创 树莓派使用笔记

1.下载镜像64位镜像下载:https://downloads.raspberrypi.org/raspios_arm64/images/2.下载写入工具:https://sourceforge.net/projects/win32diskimager/3.插入ft卡写入镜像4.配置wifi:打开U盘,添加wpa_supplicant.conf文件,写入ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdevupdate...

2021-07-20 01:07:52 95

原创 C++含特殊字符串初始化方法

初始化字符串时,如果字符串中含有C/C++预留字符,需要加转义符\转义,这样转义的符号多了就很麻烦,另一种方法是将字符串放在R"()"中间,就不用关心那些特殊字符了。显然第二种方法方便很多。int main(){ // 方法1,特殊字符加转义 std::string testXml = { "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<staff>\n" " <name=\"heworld\" ag

2021-07-18 01:26:27 1154

原创 使用协程开发流媒体rtsp客户端拉流的利与弊

使用协程带来的最大好处就是流程特别清晰,前段时间用libgo实现rtsp 客户端拉流,确实代码精简了很多,拉一路流一个协程,发送了请求就等着响应。遇到的问题点是:1、关闭流时如果协程阻塞在socket读写,只能close(socket)让它返回,那如果时阻塞在sleep呢,怎样让它跳出阻塞没找到方法。2、拉流时调度线程占cpu很高,这不奇怪,我做的流媒体服务拉流,都是500+路流同时在拉,以G计的流量肯定导致io软中断和上下文切换非常高(题外话,可以用DPDK技术解决,用腾讯开源库f-stack就好)。

2021-07-11 12:21:38 435 4

原创 为什么GB28181的码流音频包都是320个字节

之前一直疑惑这个问题,国标中主要音频格式是G711a,G711a编码是8K采样率,也就是每秒采样8千个点,G711a压缩率是一半,1秒的音频数据应该是被压缩成4千数据,通常是视频帧和音频帧交叉传输,视频帧率通常是25,1秒音频也被分成了25次传输,所每个包应该是:8000/2/25=160,但实际却是320,这是怎么回事?这问题是因为不了解G711编码,采样率是8K,但采样的每个点是用一个short型储存的,所以1秒产生的数据是16K,G711编码是把一个short型压缩成一个字节(有损失真),实现了压缩一

2021-05-14 22:24:06 1257 1

原创 rtp包解析出负载数据过滤包头附加数据

rtp包格式并不复杂,自定义个rtp头结构体,指针强制转换即可解析。但某些厂家设备一旦发来带有rtp扩展数据的包,就容易被当成负载内容从而解析失败。抓包一看wireshark解析得好好的,对方是按标准添加的数据,只能自己修改适配。以下get_rtp_data()函数简单几行即可将rtp附加数据一口气撸了去,非常方便,具体看代码注释。struct RtpHead{ unsigned char csrclen : 4; //特约信源数,每个4字节,紧接ssrc unsigned char ext

2021-05-14 21:54:45 352

原创 协程库libgo原理探究hook原理

前言:最近学习使用协程,网上搜索一番,大多是讲协程在多个任务间切换有多好用,可能是我功底太薄,愣是摸索了很久才搞懂。现在分享下新手学习心得。结论:对称协程就相当于状态机,各个协程就是各个任务,执行到阻塞操作时,比如sleep,调度的线程并不是真的一头扎进sleep函数,然后线程挂起,而是将这个任务设置为挂起状态,然后线程返回,执行其他任务去了,等sleep的时间到了,再调度过来执行后面的代码。很显然,sleep已经不是原来的sleep了,这儿是使用了hook函数(见hook函数解释)。那线程返回了.

2021-04-21 16:22:11 1036

原创 基于media-server简单的rtmp服务端实现

前言:和另一篇基于media-server简单的rtsp服务端实现一样,同样是是基于media-server简单的实现rtmp服务端,使用vs2015编译过后,运行程序,使用vlc播放rtmp://127.0.0.1:1935/live/1即可。源码下载: CSDN:简单的rtmp服务端实现,百度云盘:链接: https://pan.baidu.com/s/1Vn59SDSiwcL6vhWcInBmew 提取码: 62ju 。工程包中有media-server编译好的库,有视频源,设置vs编译通..

2020-11-14 16:40:33 875

原创 基于media-server简单的rtsp服务端实现

前言:学习一个协议总是枯燥乏味,如果能快速做出个小成品来,然后根据协议不断完善其功能,那就好多了。下面分享一个rtsp服务端的示例小程序,代码200多行,VLC和ffmpeg能正常拉多路流,适合新手探究rtsp协议,做rtsp服务器。工程压缩包:下载链接(csdn: 简单rtsp服务端实现, 百度云盘:链接: https://pan.baidu.com/s/18BsIqEcvGY9cXw25iyub0A 提取码: 72hi ),包含以下代码,以及编译好的用到的media-server头文件和库文件.

2020-11-12 17:53:44 2812

原创 liunx下高效率UDP/TCP发送RTP包

前言:发送RTP码流时,通常需要将视频数据切分成多个MTU内大小的块再使用socket发出去。如果是每次调用send函数只发送一个RTP包,send函数调用会很频繁从而导致性能下降。这时需要使用sendmsg 和 sendmmsg函数批量发送多个RTP达到优化效果。sendmsg : 对于发送RTP包,sendmsg只能用在TCP发送场景,如果UDP也使用将导致所有RTP包被当成一个UDP包发出,见代码1。sendmmsg: 可以一次发送多个RTP包,且每个RTP包使用一个UDP包封装。..

2020-11-04 18:26:27 570

原创 git界面化工具TortoiseGit使用心得(恢复删除文件)

前言:之前公司一直使用svn作为版本管理工具,用习惯了svn后来切换git后就感觉很不方便,很多地方都要用命令完成。在网上查到很多git相关的操作,都是使用命令操作的,明明windows上安装了TortoiseGit都界面化了,为啥还是那么依赖黑窗口命令。git的优势以及文件存储方式这里不细说,直接和svn对比起来说界面或工具怎么用的。一、代码下载:svn:右键点击SVN Checkout后输入文件路径就可以获得库里的代码。git:右键点击Git Clone输入url即可区别:sv.

2020-10-13 20:48:14 3255 1

原创 GBT28181的流媒体服务两种收流模式对比

GBT28181协议规定码流使用RTP包负载,推荐为PS流,也可以是ES流,可以是UDP传输,也可以是TCP(2016版),TCP分发送端active和passive,取流的SDP信令中加 TCP/ 字段,并附加a=connection:new和a=setup:active(passive)字段,invite消息和响应消息的SDP中a=setup:active/passive相反,注意平台级联时ssrc由下级平台指定,设备接入由接入平台指定。TCP传输是需要在RTP包前加两个字节表示RTP包长度(网络序

2020-10-12 21:50:37 1758

原创 linux 下UDP发送数据接口使用及比较(sendto/send/sendmsg/sendmmsg)

前言:流媒体服务发送udp包时,和tcp比较效率很低,在网上查的有sendmmsg(sendmsg的加强版)方法可以提高效率,特意做了个比较测试如下。测试硬件:Xeon(R) CPU @ 1.80GHz 32核, 10G网卡 的两台服务器测试记录:单线程死循环发是的流量情况(结收方iftop统计,发送方打开iftop流量会下降很多):sendto : 2.55Gb, send:2.56Gb, sendmmsg:2.55Gb iftop统计的流量存在误差,可以看出3个函数的发送性能不相上下,当..

2020-09-27 17:22:12 5369

原创 excel中纯数字字符串递增和数字显示时添加自定义字符串

如图:对A栏“虚拟sdk相机_1”下拉,会得到“虚拟sdk相机_2”,“虚拟sdk相机_3”......,但是对B栏设备编码下拉则不会自动递增,原因是设备编码20位,如果当成数字会被用科学计数法代替,当成字符就不会递增。思路:既然A栏能递增,那只要B栏不是纯数字就可以了,将 71000000001321000001改为'710000000013210000$1就能拖动复制递增了,复制完后,ctrl+H 将 $符号换回0,但这时转换成纯数字字符后变成科学计算,所以在拖动前需要在纯数字字符前加.

2020-09-05 13:59:49 1059 1

原创 linux 下libevent偶现个别套接字不能触发数据读回调

问题描述:libevent 接收到客户端连接后,evutil_make_socket_noblocking(sock_fd); struct event *ev = event_new(base, sock_fd, EV_READ|EV_PERSIST, read_cb, NULL); event_add(ev, NULL); 之后偶现某个套接字接收到数据后,一直缓存在系统底层,netstat 能看到很多数据待接收,抓包也是正常的,就是read_cb一次也没被回调到。环境:双千兆网卡聚合标准服务器,k8

2020-08-21 10:13:51 344 2

原创 linux times(NULL)获取毫秒级时间戳

写线程循环调度时,总是需要获取系统时间戳来确定一次业务循环消耗长时间,我通常这样写:unsigned int start_tick, used_tick;while (!stop){ start_tick = get_sys_tick(); task_run(start_tick); used_tick = get_sys_tick() - start_tick; if (used_tick < 100) ...

2020-08-21 09:34:44 2517

原创 C++删除迭代器两种方法对比(list.erase(it++)和it=list.erase(it))

C++ STL容器初学使用时,遍历删除某值元素一定要注意以下几点:错误示范:修改方法一:修改方法二:两种正确编码对其它STL容器一样有效,区别在于: 第一种修改是 it 先++,指向下一个迭代器,再释放之前的迭代器,类似于:因为是值传递,在节点被析构之前,it已经安全地跳转到下一个节点,这里强调一下,值传递原因,erase函数调用和it++是同时的,可能和编译器有关,代码理论上是先调用完函数再做++操作,可能代码在将it值赋值到传参时就回头做++了,之后再执行erase里

2020-07-21 11:32:12 3660

原创 shell 脚本查找k8s pod中的日志

适用场景:k8s集群中跟踪某个字段的日志,比如某路视频流的唯一标识符,不知道被调度到哪个pod,需要一一进入到容器内查找。pod=$(kubectl get pod|grep *** |awk '{print $1}');for i in $pod;do# 输出容器名echo kubectl exec -it $i bash;#再各个容器中查找kubectl exec $i -- grep -rn $1 /var/log/;done;linux文件中字符替换1、将当前.

2020-06-01 22:58:46 902

原创 使用安装工厂打包程序成可执行安装包

对于使用vs打包发布程序,安装工厂操作简单,容易后期维护。下载安装工厂打包的安装包,安装后得到上图显示的文件,Daemon程序的功能见另一篇博客:https://blog.csdn.net/qq_24977505/article/details/106412866,里面有安装工厂的具体使用说明,以及安装工厂v9.0.3汉化版,以及工程文件.suf,用完删除即可。安装包下载链接:还在审核网盘下载链接:链接: https://pan.baidu.com/s/1Zb3h-dYptOrqwwt.

2020-05-28 23:27:06 785

原创 Windows守护进程实现/设置程序图标/隐藏黑窗/获取exe所在目录/设置开机自启动

功能:实现一个windows守护进程,设置有自定义图标,启动后隐藏黑窗口,获取exe所在目录,并设置开机自启动(需要以管理员权限运行)。如果需要打包成可执行的安装包程序,见另一篇博客。隐藏控制台窗口:main函数前添加#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 即可。设置自定义图标:Damon.exe设置heworld.ico图标,HelloWorld.exe没有1、需要先自制.

2020-05-28 21:02:00 1113

原创 docket/k8s 常用命令整理

docker:doker ps -a 查看所有docker,包括已经停止运行的docker rm -f `docker ps -a -q` 删除所有dockerdocker cp file_name (docker_name):/home/ 主机和docker之间互相拷贝文件,位置可颠倒若docker安装了scp scp hello.txt [email protected]:/home 效果一样。docker start 已停止的容器名docker load -i 镜像包.t...

2020-05-25 21:57:12 303

原创 linux/windows常用抓包分析操作

windows:Wireshark抓包,打开wireshark,选择抓包的网卡,输入过滤条件,常用过滤条件:1、过滤IP: ip.addr == 192.168.21.452、过滤端口:tcp.port == 5060 || udp.port == 50603、根据消息协议过滤,如:sip,sip.Call-ID == "MTI2Y2YyMD", rtp, rtp.ssrc == 12345, http等注:! && || 非且或3个符号linux/win通用,不喜欢写 no

2020-05-25 20:26:16 975

原创 树莓派4B+使用及性能测试笔记

性能测试:CPU频率:vcgencmd measure_clock arm 命令可以查询cpu当前工作频率,在没有负载时为600M,在某个核满载时工作频率为1.5G。未负载cpu频率截图:单核负载截图(top后输入1,单个进程死循环):单核负载cpu频率截图:4核负载cpu频率截图:从上面的截图还可以看出,树莓派4个核单独工作不会由系统均衡调度。每个线程绑定...

2020-05-02 13:42:30 6722 2

原创 大话音视频时间戳 采样率(3600来由)

最近公司技服同事问这视频流中时间戳是个啥,有什么用,为啥要3600的递增,单位是什么,我整理了一遍打了好长一段话给他说明了,不想浪打字,后续有人在问也方便解释,故记录一下。时间戳(pts): 视音频播放使用到。视频就是一张一张的图片的集合,播放视频就是把这些图片按时间间隔顺序显示出来,时间戳就是这个时间顺序,每一张图都有个时间戳,这个时间戳就会告诉播放器在什么时候把它显示到屏幕上,屏幕不...

2020-04-11 14:32:13 1079

原创 C++简单实现Base64的编解码

Base64是个很简单的将数据编码为可见字符的算法。就是将原始数据每6个位取出来,找一个可见字符代替,这样4个可见字符刚好可以代替原来的3个字节,原理不多说,直接上代码。PS:代码只实现对可见字符的加解密,不可打印的还要修改。#include <string>using namespace std;string Code("ABCDEFGHIJKLMNOPQRSTUVWX...

2019-12-31 15:31:57 700 1

原创 sql 按规则生成变量(根据另一个变量和自然递增值)批量修改、基本语句

最近遇到个需求,需要将数据库中一个字段设置为按给定的规则递增,比如下图:现在要将 dest_name 全部改为class_"班级"#student_"从1递增的序号" 的格式,也就是像第一个的dest_name那样。最后得到的数据库语句是:update test set dest_name = 'class_'||class||'#'||(select seq from (select...

2019-04-24 10:40:02 1139 1

原创 windows下sapi做TTS转化(修复)总结

TTS转换有很多第三方库,比如科大讯飞的sdk就很好用,但是对于一些简单的需求,用windows(win7)的sapi就可以了。sapi运用是很简单,但是在很多电脑上就上放不出声音,原因是这些电脑系统不是官网下载的,TTS功能被阉割了,本文记录的主要就是修复这个问题。由于不同电脑缺少的语音组件不同,所以试了一堆修复包,也不知道这些修复包谁有用,总之不行全执行一遍就行。为

2017-12-23 11:40:06 6005 1

原创 centos7.0 配置静态ip地址

最近升级服务器到centos7,在设置ip时由于centos 7 不再延用eth0遇到点小麻烦,整理一下,下次别浪费时间。第一步:编辑网络配置cd /etc/sysconfig/network-scripts每个人的网络配置文件名不同,不过都是ifcfg-ens**, ls看一下,我的是ifcfg-ens33nano ./ifcfg-ens33把它编辑成这样:T

2017-10-31 09:58:56 5126

最简单ps流封装示例程序.rar

100行实现最简单的PS流封装示例程序,代码很少我博客中都有

2021-04-21

简单的rtmp服务端实现

使用开源的media-server在windows上实现一个rtmp服务端,vlc和ffmpeg能点播视频,具体见博客,若需要c币下载,其它下载链接见博客。

2020-11-14

简单rtsp服务端实现

简单的rtsp服务端实现,代码300行内,可以用vlc和ffmpeg拉多路流,适用于新手学习rtsp服务端开发,或模拟onvif接入相机做视频源。如果需要下载积分,其它下载链接见博客。

2020-11-12

安装工厂使用详细说明.exe

文件为“安装工厂”打包的安装包,双击安装后里面有具体的“安装工厂”使用方法,以及一个windows守护进程的源码和可执行文集,用完删除即可。具体守护进程的功能见我的博客。

2020-05-28

vgb_ipc .zip

批量模拟国标28181设备注册到平台,基于resip1.12版本库,跨平台,源码中没有带linux下的编译点a文件。

2020-05-03

空空如也

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

TA关注的人

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