自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 资源 (4)
  • 收藏
  • 关注

原创 ubuntu QT openssl支持https

QT5.12在Linux上默认不支持https,需要自行编译。本文记录了编译的详细过程,以及编译中遇到问题的解决方法。

2024-02-01 11:27:14 876 1

原创 基于QT C++封装微软开源的edge-TTS

edge-tts --voice zh-CN-XiaoyiNeural --text "白日依山尽,黄河入海流。在communica.py中发现edge-tts的本质是使用websocket和微软的服务器进行通信,服务器地址在constans.py中。微软Edge TTS是一种先进的语音合成技术,它能够将文本转换为自然流畅的语音。该技术基于深度学习和人工智能技术,能够模拟人类语音的音调、语速、语调和情感,使得合成的语音听起来非常自然。项目demo下载地址如下,可以在windows 64位系统运行。

2023-05-28 21:42:06 2308 3

翻译 一种用于实时通信的Google拥塞控制算法

draft-ietf-rmcat-gcc-02简介实时媒体的拥塞控制具有挑战性,原因如下:1、媒体的编码格式不能快速的适应不同的带宽,带宽需求经常被改变。2、参与者可能对如何响应有特定的期望,发现拥塞的流可能不会减少所需的带宽。3、编码通常对数据包丢失很敏感,而实时性和通过重传修复数据包丢失相排斥。本文描述了两种拥塞控制算法,它们共同能够提供良好的性能,并与使用相同拥塞控制的其他视频流以及共享相同链路的TCP流合理共享带宽。系统模型系统中包含以下元素:1、RTP pack

2022-05-30 15:43:03 451

原创 webrtc twcc接收端处理在Nginx RTC SFU 服务端的实现

twcc简介TWCC全称是Transport wide Congestion Control,是webrtc的最新的拥塞控制算法。其原理是在接收端保存数据包状态,然后构造RTCP包反馈给发送端,反馈信息包括包到达时间、丢包状态等;在发送端进行带宽估计,进行拥塞控制。发送方带宽估计有什么好处?谷歌解释的理论是,通过这种方式,所有的决策逻辑都在一个地方(发送方),因此可以轻松测试新算法,因为你不依赖两个端点。老实说,考虑到浏览器自动更新,我不认为这一点有什么大的优势,但它肯定更干净,即使它在带宽使用方面

2022-03-13 16:23:18 6887

原创 Nginx RTC服务SFU级联的实现

前言级联解决的主要问题是媒体分发。横向扩展:在大主播场景下,一个主播对应成千上万的观众,服务器的性能和带宽限制了观众人数的上限,为了能够支持更多的观众,需求从单个服务器扩展到集群服务器。分发质量:同样对于大规模观众来说,不同的观众分布在不同的地域,可能出现跨国或跨省传输,还有就是不同的观众对应的电信网络运营商不同,也会影响媒体分发传输质量,所以需要观众可以就近接入高质量的服务器节点。这些不同的服务器节点组成了服务器集群,服务器间的媒体分发采用级联的形式。由于网上介绍为什么需要级联SFU的文章已经很

2022-01-16 21:28:42 4526

原创 SRS4.0 RTC模块增加Gop cache

简介随着对直播延迟要求的不断提高,原来的RTMP直播已经不能满足要求,需要使用基于RTC的低延迟直播。SRS中提供了RTC推拉流的能力,并且提供了RTMP和RTC互相转换的能力。为什么需要在SRS的RTC模块中增加Gop缓存,目的是为了降低起播等待时长。对于超大规模的低延迟直播来说,不能每加入一个用户向服务器发送PLI/SLI/FIR请求,服务器就编码一个I帧或向推流端请求I帧。对于从RTMP转RTC,由于RTMP存在gop,没有gop cache时最长需要等待一个gop才能起播。我在原始的RT

2021-11-14 16:02:28 2241 3

原创 Nginx RTMP源码分析--record module

简介本章介绍RTMP的录制模块。Nginx RTMP中,直播流可以被录制为FLV格式的文件。录制模块配置解析record指令指定了应该被准确录制的内容:off:不开启录制;all:音频和视频录制;audio:只录制音频video:只录制视频;keyframes:只录制视频关键帧;manual:从不自动开启录制,使用录制接口控制开始/结束录制。record_path指定录制的FLV文件的路径record_path /tmp/rec;record_suffix设置录制文件后缀名

2021-08-06 22:41:45 1153

原创 Nginx RTMP源码分析--stat module

简介RTMP的静态模块和其他的模块不太一样,其是Nginx HTTP模块,它应该被设置在http{}块中。静态模块的主要作用是获取当前RTMP服务中的直播流状态,包括推流和拉流的具体信息。可以通过配置rtmp_stat_stylesheet,使获取到的静态信息以XML格式显示,这样更具可视化。源码分析接收到HTTP请求后的主要处理函数是ngx_rtmp_stat_handler。我们就来看看这个函数的具体实现逻辑。 slcf = ngx_http_get_module_loc_conf(r,

2021-08-06 22:39:36 836 2

原创 Nginx RTMP源码分析--auto_push_module

简介本章我们来看看RTMP服务的auto_push模块。我们知道当一个推流客户端将一路直播流上行推到RTMP直播服务器上,此时由一个worker进程负责接收上行推流数据的。如果我们在nginx.conf文件中配置开启多个worker,那么当有用户进行播放拉流的时候,其创建的socket连接是随机分配到一个worker上的,并不能保证一定是在我们的接收推流的进程上。而auto_push的主要功能是接收推流的进程将其接收到上行数据,再转发给所有的兄弟worker进程一份。这样就可以保证所有的worker进程上

2021-08-06 22:38:08 1050 2

原创 Nginx RTMP源码分析--ngx_rtmp_control_module

ngx_rtmp_control_moduleRTMP控制模块主要包括录制指令、关闭指令、重定向指令三个控制命令。和其他RTMP有所不同的地方是:RTMP控制模块是注册在HTTP模块下的,它是通过在HTTP配置域下进行控制配置,并通过HTTP Get请求来实现外部对RTMP服务的控制功能。源码分析注册HTTP回调static char *ngx_rtmp_control(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){ ngx_http_c

2021-08-06 22:35:05 876

原创 Nginx RTMP源码分析--ngx_rtmp_codec_module

本章主要是关于RTMP直播系统中音视频编解码模块的介绍。预处理static ngx_rtmp_module_t ngx_rtmp_codec_module_ctx = { NULL, /* preconfiguration */ ngx_rtmp_codec_postconfiguration, /* postconfiguration */ NULL,

2021-08-06 22:33:13 581

原创 WebRTC Qos策略--PACER网络报文平滑策略

简介PACER网络报文平滑策略是webrtc Qos策略之一,是针对数据发送端的。如果是单纯的音频数据通信,由于一帧音频数据的长度固定并且音频码率较平稳,不会出现忽高忽低的现象,可以不考虑使用pacer。但是对于视频数据来说,一帧视频的数据量可能很大,已经大于网络的MTU,尤其是I帧(关键帧)数据量更是通常远大于MTU,所以需要封装到多个RTP报文中,如果这些视频RTP报文同时一起发生到网络上可能会引起网络衰减和通信恶化。WebRTC引入Pacer,pacer会根据estimator中计算出来的码率调整发

2021-08-06 22:21:03 1220

原创 SRS RTC NACK源码分析—1

SRS作为接收方,对端作为发送方生成Nack RTCP包的流程SrsRtcConnection::SrsRtcConnection(SrsRtcServer* s, const SrsContextId& cid){ req = NULL; cid_ = cid; hijacker_ = NULL; sendonly_skt = NULL; server_ = s; transport_ = new SrsSecurityTransport(

2021-07-18 22:09:47 795

原创 排查SRS问题记录一(RTMP推流,RTC播放卡住)

问题描述:SRS Version=4.0.126. 配置文件配置:listen 1935;max_connections 100;daemon off;srs_log_tank console;http_server { enabled on; listen 8080; dir ./objs/nginx/html;}http_api

2021-06-26 21:21:23 8597 2

原创 SRS中RTMP推流RTC播放的实现原理及函数执行流程

RTMP转RTC;或者RTC转RTMP,是通过Bridger实现的。RTMP转RTCclass SrsRtcFromRtmpBridger : public ISrsLiveSourceBridgerRTMP推流#mermaid-svg-5GDqSCrD6tqxIolT .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#merma

2021-06-20 23:05:23 1261

原创 SRS webrtc 播放源码分析

在上一节中,我们知道在SrsRtcServer::listen_api()中启动了HTTP接口/rtc/v1/play/用于接收RTC播放的请求。RTC play接口分析在文件trunk/src/app/srs_app_rtc_api.cpp中。以http://127.0.0.1:8080/players/rtc_player.html中的RTC播放demo为例。http://127.0.0.1:1985/rtc/v1/play/请求参数为:api: "http://127.0.0.1:1985/r

2021-06-16 22:29:06 2082 2

原创 SRS服务启动的源码实现及分析

SRS服务启动SRS服务的main函数在trunk/src/main/srs_main_server.cpp中。#mermaid-svg-ABEihCzESwslxQJh .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-ABEihCzESwslxQJh .label text{fill:#333}#merma

2021-06-16 22:25:08 647

原创 Nginx RTMP源码分析--ngx_rtmp_notify_module源码分析

ngx_rtmp_notify_module 简介及配置ngx_rtmp_notify_module的主要功能是上报RTMP Session的状态。在直播系统中非常重要,我们可以通过notify事件上报,来实时监控直播流状态。并且还可以根据on_play和on_publish的重定向功能,做直播服务器集群内部的直播流调度功能。on_connect设置连接回调HTTP的请求。当接收到客户端connect指令,会创建一个同步的HTTP请求,在请求返回前,进程被挂起。如果HTTP返回2xx,会继续RTMP

2020-05-24 23:00:49 966

原创 Nginx RTMP源码分析--HTTP-FLV的实现

HTTP-FLV 协议简介HTTP-FLV:通过HTTP协议传输FLV封装格式的流媒体数据。HTTP协议中content-length字段表明客户端需要接收的body长度,在HTTP-FLV中,媒体服务器不设置content-length,客户端会持续接收数据,直到链接断开。HTTP-FLV相比RTMP协议的优势:防火墙限制:部分防火墙会屏蔽RTMP的1935端口,但是HTTP协议不会被屏蔽。简单:HTTP是最广泛的协议。调度:根据默认的HTTP 302即可实现拉流调度。在SRS中有针对RTMP

2020-05-09 21:57:25 1121

原创 Nginx RTMP源码分析--ngx_rtmp_live_module源码分析之音视频数据分发

直播音视频数据分发我知道,在直播过程中会有成千上万的用户同时观看,对应到Nginx RTMP到实现中,就是支持一个publisher,同时有多个subscriber进行拉流播放。本节我们将重点介绍ngx_rtmp_live_module模块是如何实现将直播音视频数据分发给多个subscriber的。注册音视频数据回调处理函数static ngx_int_tngx_rtmp_live_pos...

2020-04-10 15:40:35 1050

原创 Nginx RTMP源码分析--ngx_rtmp_live_module源码分析之添加stream

ngx_rtmp_live_module 概述ngx_rtmp_live_module模块负责直播音视频数据的转发。它将从publisher推流上来的音视频数据,转发给每个player进行播放。本章主要包括以下两个方面:live module数据结构分析Nginx RTMP服务器支持多个直播同时推流,并且支持每个直播有多个客户端进行播放观看。那么RTMP是如何将这些直播流组织在一起的?直播...

2020-04-08 15:48:11 1706 1

原创 Nginx RTMP源码分析--GOP的实现

nginx rtmp module的默认实现中,不支持gop缓存。我们可以自己进行开发,实现的主要原理是:当遇到关键帧时,清空旧的gop缓存并开始缓存新的帧数据;当play时,先将缓存的gop发送给对方,然后开始正常的发送的逻辑。具体逻辑如下:(这里只列出了主要的流程,并不是全部的代码实现)初始化在ngx_rtmp_session_t增加gop相关的字段:typedef struct {...

2019-10-15 18:56:13 2131

原创 Nginx RTMP源码分析--直播流的存储结构

ngx_rtmp_blockngx_rtmp_add_portsaddr.ctx=listen.ctx初始化connectionNGX_RTMP_CONNECTfind application & set app_confconnection和session绑定read-handler=ngx_rtmp_recv,write-handler=ngx_rtmp_sendpublish=1p...

2019-10-02 15:43:12 1176

原创 Nginx源码分析--进程间通信--Signal篇

Nginx进程间通信–Signal篇Nginx使用信号来管理master进程和worker进程。信号Signal的概念信号是软件中断。很多比较重要的应用程序都需要处理信号。信号提供了一种处理异步事件的方法。 当某个信号出现时,可以告诉内核按下列3种方式之一进行处理:1、忽略信号。有两种信号不能被忽略,它们是SIGKILL和SIGSTOP,原因是它们向内核和超级用户提供了使进程终止或停止的...

2019-10-02 15:10:44 990

原创 Nginx源码分析--进程间通信--Channel篇

Nginx进程间通信–Channel篇Nginx中全局变量ngx_processes数组,存储所有进程的信息。work进程在创建时,从master进程继承了ngx_processes数组。worker_processes=4,由于worker是顺序创建的,当work2创建时,它可以从master继承ngx_processes,从而得知worker1已经创建成功;但是在worker1创建的时候,w...

2019-09-30 15:09:48 1180

原创 Go单元测试实例

单元测试Go语言为我们提供了测试框架,以便帮助我们更容易的进行单元测试,但是要使用这个框架,需要遵循如下几点规则:1、含有单元测试代码的go文件必须以_test.go结尾,Go语言测试工具只认符合这个规则的文件2、单元测试文件名_test.go前面的部分最好是被测试的方法所在go文件的文件名,比如例子中是wxidcmdqueue_test.go。3、单元测试的函数名必须以Test开头,是可...

2019-09-27 17:05:58 351

原创 Redis源码解析--哈希表的实现

typedef struct dict { //字典类型 dictType *type; void *privdata; //两个哈希表 dictht ht[2]; //如果rehashidx == -1,重新哈希没有在进行中。 long rehashidx; /* rehashing not in progress if rehashidx...

2019-09-27 16:08:35 249

原创 Nginx源码分析--平滑升级原理

一、Nginx平滑升级指令Nginx的MakeFile文件:default: buildclean: rm -rf Makefile objsbuild: $(MAKE) -f objs/Makefileinstall: $(MAKE) -f objs/Makefile installmodules: ...

2019-09-27 15:49:31 482

转载 STL源码剖析 deque的中控器

Deque是连续空间(至少逻辑上看来如此),连续线性空间总令我们联想到array或vector。Array无法成长,vector虽可成长,却只能向尾端成长,而且其所谓成长原是个假象,事实上是(1)另觅更大空间;(2)将原数据复制过去;(3)释放原空间三部曲。如果不是vector每次配置新空间时都有留下一些余裕,其成长假象所带来的代价将是相当高昂。Deque系由一段一段的定量连续空间构成。一旦有

2016-09-09 15:12:50 360

linux内核源代码情景分析

linux内核源代码情景分析,学习linux内核的好书。。

2011-02-27

红黑树的设计和实现(插入,删除)

算法导论中红黑树的实现。包括插入,删除,旋转。 能够实现红黑树的基本操作

2011-01-07

C和C++代码精粹,C/C++

C和C++代码精粹. 写出更好的C/C++代码。

2011-04-05

空空如也

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

TA关注的人

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