致一
音视频行业深耕多年,熟悉直播、RTC,对在线教育、娱乐秀场等音视频技术与架构有深入研究,目前在一线互联网公司从事音视频开发工作。
展开
-
webrtc jitterbuffer 模块分析
介绍webrtc 的jitterbuffer原创 2022-07-10 17:53:56 · 924 阅读 · 3 评论 -
音频弱网优化Red
目录1、音频弱网优化的主要方法2、red 包格式3、audio red 封装逻辑4、audio red 的解析1、音频弱网优化的主要方法业界常用的音频抗丢包算法和相互对比,本文主要介绍的 red 方式2、red 包格式音频 red的协议见 :RFC 2198 - RTP Payload for Redundant Audio Data具体的格式如下 0 1 2 .原创 2022-05-04 18:37:57 · 975 阅读 · 0 评论 -
mediasoup 源码分析(二十八)rtx 重传包
文章目录rtx 协议格式字段细节上行rtx处理下行rtx处理rtx 主要用来进行封装重传包rtx 协议格式The format of a retransmission packet is shown below: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-原创 2021-08-24 18:20:51 · 838 阅读 · 2 评论 -
mediasoup 源码分析 (二十七)simulcast
原理介绍simulcast :字面意思是多播,在webrtc中指大小流。推流的客户端同时发生多路不同分辨率、帧率的视频到服务器,服务器根据下行用户网络情况,选择一路合适流进行转发。它的主要应用场景:一次视频会议时不同参会人员的网络带宽不一样,不能仅仅因为一个人的网络不好就降低分辨率,因为那样网络好的人体验效果也变差了。所以应该探测出谁的网络不好,只给他降码率、帧率就行了。如下图所示:pc客户端上行推送了1080p、720p、360p三路流,服务器在转发时给手机端下发了360p,给网络状...原创 2021-08-15 17:29:37 · 1193 阅读 · 0 评论 -
REMB 拥塞控制
REMB 协议介绍REMB (Receiver Estimated Maximum Bitrate) 接收端最大码率估计。REMB一直是一个草案,并没有定义到标准rfc文档中,虽然主流的webrtc开源服务器,如:mediasoup、licode都支持REMB方式进行拥塞控制,但是会逐步放弃支持,未来会在发送到进行码率估计,即通过transport-cc的方式。由于目前很多服务器还支持REMB方式,所以本篇文章打算介绍一下实现过程。协议格式文档:https://datatracker.ie原创 2021-05-19 18:43:46 · 1411 阅读 · 0 评论 -
解析RTCP组合包
目录RTCP 组合包介绍服务端解析组合包RTCP 组合包介绍在实际应用中RTCP包如:SR、RR包等可以做为一个单独包进行发送,也可以和其他包组合一起发送。当多个RTC包组合发送时,服务端需要拆分组合包得到单个包,然后再进行处理。如下图:RR包和Feedback反馈包组合一起发送。服务端解析组合包先看下RTCP 协议,以RR包为例:(mediasoup中解析rtcp逻辑见packet.cpp)RTCP包前四个字节都是一样的固定头,对应mediasoup..原创 2021-05-12 10:47:26 · 551 阅读 · 1 评论 -
RTP协议介绍
RTP协议介绍RTP即实时传输协议(real-time transport protocol),它是应用层协议,用来封装音视频包,下层通过UDP协议传输。协议格式 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1原创 2021-02-21 20:45:37 · 687 阅读 · 1 评论 -
mediasoup 源码分析(二十六)SRTP
目录协议介绍协议格式srtp加密上下文信息协议介绍SRTP,即安全实时传输协议(Secure Real-time Transport Protocol),是在实时传输协议(Real-time Transport Protocol)基础上所定义的一个协议。协议格式01234567890123456789012345678901+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...原创 2021-01-31 23:24:06 · 755 阅读 · 1 评论 -
mediasoup 源码分析(二十五)dtls握手协议(二)
目录DTLS 协议介绍DTLS交互过程抓包基于mediasoup 分析dtlsssl 中的BIO处理收到的DTLS数据,得到私钥基于获得的私钥key创建srtpDTLS 协议介绍DTLS(Datagram Transport Layer Security)数据包传输层安全协议。TLS不能保证UDP传输的安全性,DTLS在TLS基础上进行扩展,使之支持UDP。补充第十九篇dtls 握手,十九篇见下面链接。https://blog.csdn.net/lcalqf.原创 2021-01-25 01:58:07 · 803 阅读 · 1 评论 -
mediasoup 源码分析(二十四)stun 协议分析
目录stun介绍stun 协议分析属性消息stun介绍stun 即:Session Traversal Utilities for NAT。用于NAT穿透的网络协议。作用:stun协议主要用来得到自己的外网IP,然后进行连通性检测。客户端比如chrome会向stun服务器发送stun包得到自己的外网IP。对于mediasoup和srs等webrtc服务器,本身实现了ice-lite,不需要单独部署stun服务,只需要响应客户端发送的stun request就表明连接.原创 2021-01-16 22:01:30 · 1061 阅读 · 1 评论 -
mediasoup 源码分析(二十三)SDP 协议介绍
目录SDP 介绍协议介绍SDP 介绍SDP(Session Description Protocol)是一种会话描述协议,不是传输协议。什么意思呢?,就是说SDP不是传输层协议(如UDP、TCP),也不是应用层协议(如HTTP),它是一种自定义的私有协议格式,用来交换webrtc建联所需要的配置信息、媒体属性信息等。SDP 分为offer、answer两种类型,且服务端和客户端既可以做offer也可以做answer。v=0o=-14034283583473731...原创 2021-01-09 19:09:51 · 1020 阅读 · 1 评论 -
mediasoup 源码分析(二十二) XR包
目录协议介绍协议分析1、BT=42、BT=5协议介绍XR 包是RTCP 扩展报告的一种,PT=207,主要用来提供更加详细的时间、丢包等统计信息。XR包总共有七个报告块,mediasoup主要第四和第五即BT=4 ,BT=5两个。代码见:XR.cpp 、XrDelaySinceLastRr.cpp、XrReceiverReferenceTime.cpp协议分析协议文档:https://datatracker.ietf.org/doc/rfc3611/?include.原创 2020-12-14 00:32:02 · 784 阅读 · 2 评论 -
mediasoup源码分析 (二十一)sdp中profile-level-id 作用
目录一、格式二、作用一、格式SDP 中对于H264编码的协商 ,会有如下内容:a=rtpmap:126 H264/90000a=fmtp:126 profile-level-id=42e01f;level-asymmetry-allowed=1;packetization-mode=1表示H264 的playloadType=126,也可能是其他值。该类型的profile-level-id=42e01f。二、作用profile-level-id 用来设置H264的..原创 2020-12-10 00:29:16 · 1178 阅读 · 0 评论 -
mediasoup源码分析(二十)服务端架构设计
目录简介信令服务(房间服务)调度服务媒体服务简介流媒体服务器大的方向上可以分为上述三个模块。目前行业内都是分布式服务,独立部署。mediasoup信令与媒体之间虽然可以管道通信。但在行业内,服务之间通过管道通信用的少。一般是rpc、mq,或者传统的tcp。这块licode架构比较不错,licode是信令和媒体服务通过MQ消息队列解耦。下面介绍一下这三个服务主要功能,当然文中所说也是一家之言。信令服务(房间服务) 信令服务也称为房间服务。有的企业把信令和房间分开,信..原创 2020-11-07 21:03:08 · 1313 阅读 · 2 评论 -
mediasoup 源码分析(十九)dtls 握手
一、DTLS 作用dtls是udp层的安全传输协议,用来交换srtp的解密的秘钥。需要注意一点,dtls只用在srtp秘钥交换过程,秘钥交换完成后面发srtp的过程就不用dtls了。二、DTLS 关注点1、角色dtls角色是在sdp协商时确定的。sdp协议中有a=setup字段。有如下三个可选值:a=setup:actpass 既可以是客户端,也可以是服务器a=setup:active 客户端a=setup:passive 服务器chrome 浏览器和mediasoup 在d.原创 2020-10-27 00:41:26 · 2033 阅读 · 1 评论 -
mediasoup 源码分析(十八)关于多端口问题 参考srs4.0处理逻辑
1、多端口介绍 mediasoup中的多端口,指服务端对每个客户端都会开辟新的端口来监听,这样就会导致服务端同时暴露成百上千个端口,实际生产环境肯定是不行的。2、srs4.0 单端口连接管理介绍 srs中通过SrsRtcConnection来代表一个连接。注意这个SrsRtcConnection 并不代表一个发布者订阅者。具体见:// The RTC server instance, listen UDP port, handle UDP packet, m...原创 2020-10-02 17:52:27 · 1744 阅读 · 0 评论 -
mediasoup 源码分析(十七)tccClient模块分析(2)及RTCP反馈报文介绍
2、RTCP反馈信息文档:rfc4585https://tools.ietf.org/html/rfc4585#section-6.3rfc4585的补充信息rfc5124https://datatracker.ietf.org/doc/rfc5124/?include_text=1主要有两大类反馈,一类是传输层的反馈RTPFB,PT=205;一类是负载层的反馈PSFB PT=206。2.1 其中传输层的反馈 如:NACK 信息、TMMBR、TMMBN等 见rfc5104..原创 2020-10-02 12:07:40 · 857 阅读 · 2 评论 -
mediasoup 源码分析(十六)为何不需要单独部署stun server
一、stun 介绍STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议,用来得到自己的公网IP、PORT信息。协议文档rfc5389:https://datatracker.ietf.org/doc/rfc5389/?include_text=1一般流程客户端会发送stun包,即binding request到stun服务器,stun服务器返回 binding response携带该客户端的外网IP信息。而流媒体服务器是部署在原创 2020-09-16 23:43:34 · 1703 阅读 · 0 评论 -
mediasoup源码分析(十五)tccClient作用及RTP包整个收发流程
一、tccClient作用上篇文章最后介绍了 tccServer(RTC::TransportCongestionControlServer*tccServer),是用来处理Transport-cc的。当Producer收到对端发送的数据后,进行数据处理然后发送transport-cc反馈报文。tccClient是数据发给consumer时进行PacedSender平滑处理和码率修正。这块是webrtc的代码,具体见:mediasoup\worker\deps\libwebrtc\libwe..原创 2020-09-02 23:22:54 · 1312 阅读 · 4 评论 -
mediasoup源码分析(十四)拥塞控制 Transport-CC
一、Transport-CC 介绍webrtc有两种拥塞控制反馈方式,一种是REMB,另一种是Transport-CC。Transport-CC(Transport-wide Congestion Control)。REMB 用在接收端基于丢包率的码率反馈,Transport-CC是发送端基于延时的码率反馈。如果想开启该算法,发送端需要在RTP扩展头中添加transport-wide sequence number 字段,接收端RTCP 发送TransportFeedback报文。1、rtp..原创 2020-08-29 18:30:08 · 2184 阅读 · 0 评论 -
mediasoup 源码分析(十三) 丢包重传 webrtc nack 机制
一、丢包介绍 由于webrtc所用的rtp协议底层是基于udp传输,所以并不能保证数据的可靠性。在发生丢包时,为了保证音视频的质量需要进行 重传,而 nack机制就是用来处理重传逻辑的,需要注意一点由于udp本身是无序的,所以在进行丢包重传时要做一定的特殊处理。二、nack 报文介绍文档 :RFC4585其中PT=205,FMT=1 ,Packet identifier即为丢失的RTP数据包的序列号,BitMap of lost packets指从,Packet ident...原创 2020-08-21 23:45:48 · 1348 阅读 · 5 评论 -
mediasoup源码分析(十二)多端口问题 一个transport一个端口
一、多端口问题 mediasoup 一个transport 会开启一个udp端口进行监听,这样服务端就需要同时对外暴露出多个端口,在实际线上应用时 非常不安全。二、多端口问题的解决方案原创 2020-08-20 20:16:59 · 2100 阅读 · 4 评论 -
mediasoup 源码分析(十一) 调试node.js及添加日志输出到文件
一、调试node.js代码 调试界面二、 调试方法通过如下命令启动mediasoup server.js//记着把xx.xx修改为自己的iPnode --inspect-brk=xx.xx.xx.xx:9229 server.js app的启动方式不变,还是gulp live。打开Goggle浏览器,输入chrome://inspect,点击configure配置刚才服务器的ip:port,然后点击Done确定,再点击最下面的inspect。如图:二、...原创 2020-08-20 20:13:19 · 958 阅读 · 3 评论 -
mediasoup源码分析(十) ffmpeg推流到mediasoup 及调试
一、PlainTransport 介绍 mediasoup提供了PlainTransport可以接收裸RTP数据,所以可以通过ffmpeg.sh脚本推本地文件到mediasoup。二、ffmpeg.sh推流介绍脚本路径:mediasoup-demo/broadcasters/ffmpeg.sh注意:需要通过chrome网页请求提前创建好一个房间。1、安装脚本运行时的依赖库安装httpieyum install httpie安装urlibeasy_install...原创 2020-08-20 11:25:23 · 2611 阅读 · 5 评论 -
mediasoup 源码分析(九) libuv网络库学习及mediasoup数据接收分析
一、libuv 介绍 libuv是一个开源异步跨平台网络库,mediasoup中的网络模块,包括和node.js层通信的pipe管道,都是通过libuv实现的。 libuv github地址:https://github.com/libuv/libuv二、libuv 关键结构 晚上再写。。稍等三、网友 libuv demo https://gitee.com/sundq/uvz...原创 2020-08-18 14:30:58 · 1613 阅读 · 1 评论 -
mediasoup 源码分析(八) 服务器级联 PipeTransport 分析
一、级联概念 服务器级联通常指两个服务或者多个服务之间互相通信。比如视频会议或者在线教育中的小班课, 由于参会人员或者上课的学生分布在全国各地,如果是外教英语课还要跨国。这两种情况下用户会连接到不同的媒体服务,比如学生A连接华南节点、学生B连接华东节点、老师连北京某个节点。他们会进入同一个房间进行上课,此时就需要媒体服务之间进行夸地区、跨服通信,而级联就是用来解决这个问题的。二、mediasoup的级联方案PipeTransport mediasoup通过PipeTr...原创 2020-08-16 22:59:31 · 3383 阅读 · 10 评论 -
mediasoup 源码分析(七)consumer创建过程
一、consumer 类型介绍mediasoup总共有四种消费者Consumer类型,SimpleConsuer、PipeConsuer、SvcConsuer、SimucastConsumer,SimpleConsumer 普通RTP数据的消费者,比如有音频流和视频流每个都是SimpleConsumer,没有按类型区分,音视频流都是一样的,最简单的consumerPipeConsumer 不同Worker之间Router之间的数据流转,则其为接收或者消费从另外...原创 2020-08-14 20:50:15 · 1334 阅读 · 1 评论 -
mediasoup源码分析(六)数据分发 Transport 到 Router 、Consumer
一、Tansport 转发到ProducerTransport收到数据packet后,会解析出packet中所带的ssrc字段,然后基于ssrc找到该数据的Producer。Transport::ReceiveRtpPacket{ // Get the associated Producer. RTC::Producer* producer = this->rtpListener.GetProducer(packet);//基于包中的ssrc选出Producer}Produer也原创 2020-08-13 10:15:40 · 1306 阅读 · 0 评论 -
mediasoup 源码分析 (五) Congestion Control 拥塞控制
mediasoup支持两种类型的bwe(Bandwidthestimation)带宽估计反馈机制:TRANSPORT_CC 和REMB。具体处理类为:TransportCongestionControlServer。一、创建拥塞控制类TransportCongestionControlServer void Transport::HandleRequest(Channel::Request* request){ case Channel::Request::MethodId:...原创 2020-08-10 15:29:01 · 1759 阅读 · 0 评论 -
mediasoup 源码分析 (四)PlainTransport 分析
一、接收裸RTP流PlainTransport 可以接收裸RTP流,也可以接收AES加密的RTP流。源码中提供了一个通过ffmpeg发送裸RTP流到mediasoup的脚本,具体地址为:mediasoup-demo/broadcasters/ffmpeg.sh脚本就是通过HTTP Post发送创建PlainTranport请求,然后通过ffmpeg向指定地址+端口,发送RTP流res=$(${HTTPIE_COMMAND} \ POST ${SERVER_URL}/rooms/${ROOM原创 2020-08-10 14:59:16 · 1813 阅读 · 0 评论 -
mediasoup 源码分析(三) room 和 router 创建过程
一、server启动WebSockerServerserver.js会通过protoo 启动WebSocketServer// Run a protoo WebSocketServer.await runProtooWebSocketServer();当用户请求连接时会带着roomId,server接收到用户请求后会判断当前房间是否存在,如果不存在会就创建一个。具体详情见server.js的runProtoWebSockerServer()函数async function run.原创 2020-08-07 22:17:17 · 1556 阅读 · 4 评论 -
mediasoup源码分析(一) 编译过程
注意:mediasoup最终是作为一个node-module 模块,不要单独编译mediasoup,而是下载编译mediasoup-demo,在编译demo的过程中会自动下载编译c++代码mediasoup一、安装依赖环境1、下载安装nvm ,通过nvm管理安装nodegit地址:https://github.com/nvm-sh/nvm安装nvm:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/insta原创 2020-08-05 20:58:55 · 3227 阅读 · 5 评论 -
mediasoup源码分析(二) worker创建过程
打开server.js 文件server.js文件async function run(){ // Open the interactive server. await interactiveServer(); // Open the interactive client. if (process.env.INTERACTIVE === 'true' || process.env.INTERACTIVE === '1') await interactiveClient(); //原创 2020-08-05 19:54:26 · 2231 阅读 · 8 评论 -
vscode 附加到进程 调试 srs attach process
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ .原创 2020-08-05 18:09:47 · 3757 阅读 · 1 评论 -
mediasoup源码分析 (一)大纲
一、mediasoup编译过程 内容: centos7环境下编译mediasoup-demo,搭建好demo环境可进行1V1视频通话。二、分析mediasoup 源码编译过程 内容:介绍Makefile是如何编译worker项目 ,gyp如何管理项目。三 、数据传输过程 内容:分析从socket收到数据到音视频stream处理的整个过程。四、Transport模块 内容:介绍mediasoup各个Transport功能,如WebrtcT...原创 2020-08-02 23:16:10 · 3640 阅读 · 2 评论