自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(78)
  • 收藏
  • 关注

原创 mediasoup simulcast实现分析

这种技术就是 simulcast,也就是大小流。而且网络是在波动的,某个用户可能一段时间内网络很好,足以接收质量最佳的流,但过一段时间可能网络变差了,SFU 要快速探测出用户下行可用带宽的的变化,切换给用户发送的视频流。在多人音视频会议中,不同用户的下行网络质量是不同的,假设 A 发送的视频编码码率是 1.5Mbps,经过 SFU 转发时,接收者 B 的网络较好,能够正常接收播放,而接收者 C 的下行网络带宽较小,SFU 将视频流发送给 C 时会出现丢包等问题,导致 C 观看 A 的视频流很卡顿。

2024-07-28 21:19:34 911

原创 mediasoup Lite ICE实现说明

ICE 是一种交互式连接建立的流程协议,ICE 有两种类型(Full ICE 和 Lite ICE),Full ICE 要求建立连接的双方都要执行连通性检测,而 Lite ICE 则只要求响应 STUN binding request 信息即可,它不需要添加候选者并对候选者进行连通性检测。媒体服务器一般都使用的是 Lite ICE 实现,因为媒体服务器通常部署在公网,它的网络没有限制,因此一般只需要客户端检测与媒体服务器提供的候选者地址是连通的即可。

2023-08-06 01:18:55 4873

原创 STUN工作原理

现实网络环境中绝大多数主机都是处于 NAT 之后,对于两个处于同一内网环境的主机,它们只要知道对端的内网地址就能进行通信,而对于不在同一内网的主机,如果它们想通信,要么借助带有公网地址的主机转发,要么通过一定的手段进行 NAT 穿越。STUN 协议是用来 NAT 穿越的工具,它允许位于 NAT 之后的主机查找到自己 NAT 映射后的公网地址,需要通信的双方交换映射后的公网地址再进行连通性检测。STUN 最先在。

2023-07-29 15:25:44 1678

原创 mediasoup Transport端口策略

mediasoup 支持多种类型的 Transport,有 WebRtcTransport,PlainTransport 以及 PipeTransport,对于 WebRtcTransport 目前 mediasoup 最新版本已经支持多个 WebRtcTransport 共用单个端口的模式了,而在此之前每个 WebRtcTransport 都需要使用一个端口,对于 PlainTransport 和 PipeTransport 现在还是每个通道需要对应一个端口。

2023-06-05 22:07:56 1221 5

原创 mediasoup create/connect WebRtcTransport 流程分析

在这篇博客中我们介绍了,关键信令包括 getRouterRtpCapabilites,join, createWebRtcTransport, connectWebRtcTransport, produce,本文将介绍 createWebRtcTransport 和 connectRtcTransport 的流程。

2022-12-29 20:12:15 1316

原创 使用FFmpeg+go搭建m3u8点播服务器

HLS(HTTP Live Streaming) 是苹果公司提出的基于 HTTP 的流媒体传输协议,它的工作原理是将整个文件切分成一个个小的文件(通常是 TS 格式文件),客户端通过 HTTP 下载播放。在准备播放某个 m3u8 媒体源时会先下载一个包含元数据信息的 .m3u8 索引文件,根据 .m3u8 索引文件信息依次下载媒体流文件。

2022-12-26 20:55:15 4851

原创 使用RTP包荷载AAC码流数据

参考这篇博客。AAC 有两种格式:ADIF,ADTS。ADIF(Audio Data Interchange Format),音频数据交换格式,这种格式的特点是只在文件头部存储用于音频解码播放的头信息(例如采样率,通道数等),它的解码播放必须从文件头部开始,一般用于存储在本地磁盘中播放。

2022-12-13 20:48:34 1782

原创 WebRTC GCC 拥塞控制算法(TCC-GCC)

网络传输中链路的带宽是有限的,为避免往链路发送过载的数据量导致网络拥塞,我们需要进行带宽预估,结合预估带宽作出调整避免网络拥塞。在《WebRTC GCC 拥塞控制算法(REMB-GCC)》中我们总结了 REMB-GCC 拥塞控制算法,并在文末提到 Google 已经推出 TCC-GCC 取代 REMB-GCC。TCC-GCC 的原理也是基于延时梯度和丢包率进行带宽预估并避免网络拥塞,不同之处在于逻辑都在发送端进行计算,接收端只是反馈包的接收状态(是否收到,以及与上一个包的接收时间差)。

2022-12-07 13:35:39 4460

原创 WebRTC Pacer

实时音视频通信发送端需要一个平滑发送模块(Pacer),因为视频的关键帧比非关键帧大很多,一般一个关键帧需要打到多个 RTP 报文中,此时如果直接把所有 RTP 报文发送到网络,很容易造成网络拥塞。WebRTC Pacer 模块的作用就是让数据在网络上发送更加平滑,防止因为数据量的突增造成网络发生拥塞,效果如下。假设是只发送音频数据包,平滑发送模块作用较小,因为音频帧产生的时间间隔是固定的,而且一个音频帧编码后的数据不大,一般一个 RTP 报文可以承载。

2022-11-21 17:36:29 1341

原创 WebRTC GCC 拥塞控制算法(REMB-GCC)

在网络传输中,所有应用程序都需要拥塞控制以避免网络出现拥塞的情况,对于音视频传输也是如此,假设发送方以某个码率值发送数据,但是网络出现拥塞,此时发送方应该降低发送码率,当网络拥塞情况好转,发送方又可以提升发送码率。GCC 算法是出自 Google 的一种结合延时梯度和丢包率的拥塞控制算法,WebRTC 默认使用该算法。

2022-11-19 15:44:29 4007

原创 WebRTC ULPFEC

网络中传输实时音视频数据通常使用 UDP,由于传输中存在丢包的问题可能使听到的声音有断续或者看到的视频卡顿,针对弱网场景可以通过添加适当的冗余包来对抗丢包引起的卡顿问题。FEC 基本原理是通过原始数据生成一定的冗余数据,如果原始数据在传输过程中有丢失,接收端也可以通过冗余数据恢复原始数据。本文介绍 ULPFEC 的基础理论,报文格式,并介绍 WebRTC ULPFEC 相关的源码实现。

2022-11-07 01:03:54 1929 1

原创 WebRTC Video JitterBuffer

音视频传输通常使用 UDP,由于网络中存在丢包,抖动,乱序等现象,接收端收到的媒体包需要有个包缓冲区存放,对于视频而言,一帧数据可能被打包到多个 RTP 包传输,因此接收端收到 RTP 包后会判断是否可以组成视频帧,如果可以组成视频帧还要判断其参考帧是否存在,如果存在则将该帧送入帧缓冲区,等待解码线程进行解码。 如上所示,RtpVideoStreamReceiver 是收视频包的处理类,其中的 Video JitterBuffer 逻辑主要由 PacketBuffer,RtpFrameRefe

2022-06-11 18:18:38 1327 1

原创 基于WebRTC实现浏览器端音视频聊天室

WebRTC(Web Real-Time Communication)旨在将实时通信功能引入到浏览器,用户无需安装其他任何软件或插件即可在浏览器间进行实时通信功能。本文介绍基于 WebRTC 实现一对一音视频实时聊天室功能,浏览器通过 HTTP 请求 Web 服务器前端页面运行元素(HTML, CSS, JS),之后与信令服务器进行交互,信令服务提供房间管理,信令消息转发等功能,媒体数据通过 STUN/TURN 服务器中转。

2022-05-20 17:32:47 1561

原创 mediasoup显示当前Speaker

使用 mediasoup 进行音视频通话时,客户端可以显示当前正在说话的用户,该功能是由 Speaker 端在发送音频 RTP 数据时携带这段音频音量值大小,mediasoup 从 RTP 包获取该信息后回调给 mediasoup-demo(音频值大小通常是计算一段时间的平均值),如果音量值大于设定的阈值则会通过 activeSpeaker 通知音频接收端当前用户正在讲话,音频接收客户端接收到该信令后做展示。

2022-05-02 23:59:36 917

原创 WebRTC收集中继地址候选者 源码剖析

在中我们介绍了 WebRTC candidate,重点分析了 WebRTC 收集 host candidate 的流程,本文将介绍 WebRTC 如何收集中继地址候选者(Relayed Address)。如果你对 Relay 的概念或者 TURN 工作原理不太熟悉,建议先阅读后再继续往下阅读。

2022-05-02 17:37:57 993

原创 TURN工作原理

TURN 全称是 Traversal Using Relays around NAT,它是 STUN 协议的扩展,主要是添加了 relay 的功能。如果两台主机处在不同的 NAT 之后,它们之间想要互相通信,要么通过 P2P 穿越,要么通过一台带公网 IP 的机器来中转,TURN 服务器提供了中继(relay)的功能,帮助主机间进行通信。

2022-05-02 01:08:19 4169

原创 WebRTC收集服务器反射地址候选者 源码剖析

在中我们介绍了 WebRTC candidate,重点分析了 WebRTC 收集 host candidate 的流程,本文将介绍 WebRTC 如何收集服务器反射地址候选者(Server Reflexive Address)。服务器反射候选者是通过发送 STUN Binding Request 给 STUN 服务器,STUN 服务器返回客户端 NAT 映射后的外网地址得到的。

2022-04-30 19:24:24 903

原创 WebRTC candidate

WebRTC 音视频通信的双方需要知道对端的通信地址才能进行通信,WebRTC 采用 ICE 方式与通信对端建立通信连接,ICE 中很关键的一个步骤就是收集候选者信息,本端需要将自己的主机候选者,NAT 映射后的候选者以及中继候选者等信息发送给对端,对端也需要发送候选者信息给到本端,双方进行媒体连通性检测,检测成功后才能进行通信。

2022-04-08 00:37:39 10028 1

原创 MediaRecorder录制流数据

在我们介绍了如何使用 WebRTC API 录制本地桌面数据并通过 HTML video 播放出来,现在我们想把采集到的本地桌面数据录制保存成文件并下载到本地,或者录制音视频设备采集到的数据,即可使用 MediaRecorder 类。stream:表示媒体流参数,可以是从 getUserMedia 或者 getDisplayMedia 获取到的流参数对象。options:表示限制选项,可以包含如下属性。

2022-03-20 19:55:46 4869 2

原创 WebRTC API获取本地桌面数据

WebRTC 提供了 mediaDevices.getDisplayMedia API 获取本地桌面数据,例如在共享屏幕时我们需要将本地桌面发送给对方。调用该函数后会弹窗提示选择希望共享的屏幕或窗口(例如本地有双显示器屏幕可以选择其中一个屏幕,或者选择希望共享的应用窗口),该函数调用成功后返回一个 Promise 对象,完成时会接收一个 MediaStream 对象。constraints 是一个 MediaStreamConstraints 对象,结构如下所示。

2022-03-20 18:23:23 3265

原创 WebRTC API获取音视频设备数据

WebRTC 提供了 mediaDevices.getUserMeida API 获取系统音视频设备数据。调用该函数后会提示用户给予访问音视频设备的许可,调用成功后返回一个 Promise 对象,完成时会接收一个 MediaStream 对象。constraints 是一个 MediaStreamConstraints 对象,结构如下所示。

2022-03-20 16:30:17 2442

原创 WebRTC API枚举音视频设备

WebRTC 提供了 mediaDevices.enumerateDevices API 来获取系统的音视频设备。上述调用返回值是一个 Promise 对象,当完成时会接收一个 MediaDeviceInfo 对象的数组,MediaDeviceInfo 属性值含义解释如下。

2022-03-20 15:07:09 888

原创 WebRTC收集网卡地址信息 源码剖析

WebRTC 音视频通话的双方需要交换候选者信息,然后进行连通性检测,因此对于通信的每一方都需要收集自己的主机地址,映射地址等,通过收集网卡信息我们可以知道网卡配置的地址信息。

2022-03-19 19:04:51 4048

原创 IO多路复用(select)

IO 多路复用技术是指由进程通知内核监听指定的一个或多个 IO 事件,当 IO 事件发生时由内核通知唤醒进程,它一般用在一个进程需要同时监听处理多个 IO 事件的场景,与多进程或多线程的方式相比,使用 IO 多路复用技术无需创建多个进程或线程,减少系统开销。本文将介绍 select 函数的用法,它允许进程通知内核监听多个 IO 事件,并在事件发生或者设置的超时时间到达时唤醒进程处理。

2022-02-28 12:50:41 1354

原创 WebRTC代理类

我们以 PeerConnectionFactory 为例说明如何定义一个代理类。首先定义一个 PeerConnectionFactoryInterface 类,它继承自 rtc::RefCountInterface,然后在接口类中声明需要暴露的接口,例如 SetOptions,CreatePeerConnection,GetRtpSenderCapabilities 等接口都是需要对外暴露的接口。

2022-02-27 23:59:46 951

原创 WebRTC CreateOffer源码剖析

在中我们介绍了 SDP 协议相关的内容,WebRTC 是按会话描述,媒体描述(媒体信息,网络描述,安全描述,服务质量)对 SDP 描述字段进行分类的,本文将以 CreateOffer 为例并从源码角度分析 WebRTC 是如何生成 SDP 的。

2022-02-20 00:55:08 2337

原创 会话描述协议-SDP

SDP(Session Description Protocol) 是一种通用的会话描述协议,例如在音视频通话前通话双方需要进行媒体能力协商,比如协商双方都可支持的编解码类型,交换候选地址等,因此通话前都会发送一个 SDP,描述自己的会话和媒体等信息。

2022-02-13 17:43:23 4212

原创 WebRTC线程介绍

WebRTC 有三类线程:信令线程,网络线程,工作线程。信令线程一般工作在 PeerConnection 层,它负责与应用层交互,例如 createOffer,createAnswer 等操作,并通知工作线程和网络线程相应的信号事件。网络线程工作在网络传输层,它负责网络收发包,从网络接收包数据并发送给工作线程,工作线程也会把要发送的包数据给网络线程。工作线程工作在媒体引擎层(engine),包含视频采集线程,视频渲染线程,视频编码线程,视频解码线程等。

2022-02-08 00:38:36 2475

原创 WebRTC example peerconnection剖析

WebRTC 提供了许多 example,本文介绍 peerconnection example 的使用与代码流程分析,通过该示例可以帮助理解 WebRTC 信令交互,媒体协商,音视频数据交互等流程。该示例涉及两个角色:peerconnection_server,peerconnection_client。peerconnection_server 是一个信令服务器,它负责连接成员的管理以及信令交互与转发。

2022-01-28 23:25:35 2385

原创 mac环境(intel芯片)编译WebRTC(基于声网镜像)

下载 Xcode,尽量不要选择太高的版本,否则编译可能会出现因 sdk 版本兼容问题的报错,如果你还没有安装 Xcode 可以选择下载安装。,如果你已安装 Xcode 也可以尝试直接使用该版本进入编译环节(编译不报错的话仍然用该版本就行),安装完成后执行如下命令。1. gn gen 命令用来生成编译文件,相当于 cmake,执行 gn clean out/Release 清理编译文件,3. out/Release 目录可以自己指定,编译完成后可以在目录下看到许多可执行文件。查看具体编译参数信息。

2022-01-16 00:17:00 1797 2

原创 数字证书介绍

一. 什么是数字证书在数字签名一节我们提到,使用数字签名存在的问题是公钥接收者无法确认公钥是否真的由发送者发送,如果公钥被中间人掉包,接收者也无从得知,数字证书就是为了解决这个问题的,所以数字证书又称为公钥证书,简称证书。它记录了公钥,并且有公钥对应的组织,签发证书的机构,证书序列号,密钥长度等,它由权威的认证机构颁发,接收者接收到证书之后,只要认证该证书确实是由权威机构颁发的,即可认为该证书对应的信息都是可信任的。 权威的证书颁发机构称为 CA(Cerificate ...

2022-01-11 00:37:01 3420

原创 golang实战-数字签名与认证

一. 数字签名设想一个场景:Alice 给 Bob 发送了一段消息(明天我请你吃饭),该消息使用 Bob 的公钥加密(公钥加密才能确保消息被截获后也只有 Bob 本人能用自己的私钥解密),但是由于 Bob 的公钥可能其他人也有,Tom 也可以使用 Bob 的公钥加密信息后发送给 Bob,所以 Bob 无法确保这条信息是 Alice 本人发送的,但是如果每条信息都加上 Alice 本人的签名,Bob 接收到信息之后就知道真的是 Alice 发送的,也能通过第三方机构防止 Alice 否认该...

2022-01-09 13:51:17 5340

原创 golang实战-单向散列函数

一. 什么是单向散列函数单向散列函数有多个术语变体,又称为消息摘要函数,或者哈希函数,或者杂凑函数。它主要应用在为一个输入消息输出一个对应的散列值(又称哈希值),不同的输入消息输出的散列值一般是不相同的(相同碰撞概率很小),因此可以用来检验消息的完整性。 如下在该网址下载文件时,网址就附上了每个文件对应的 sha256 哈希散列值,当我们下载完对应的文件时,在本地使用 sha256 为下载好的文件生成散列值,就可以校验在传输过程中内容是否被篡改,或者是否下载了正确的文件...

2022-01-06 22:19:29 662

原创 mediasoup丢包重传机制的实现

在音视频通话中,我们常常使用 RTP 协议包荷载音视频数据,底层经常使用 UDP 作为其传输层协议,而 UDP 并不保证数据可靠性,因此当 RTP 产生丢包时,接收端需要告知源端哪些序号的包认为丢失了,请重传一遍过来。

2021-12-21 00:04:33 2526 2

原创 使用RTP包荷载H264码流数据

在音视频通话中我们通常使用 RTP 协议包荷载音视频码流数据,例如用户摄像头采集图像后进行编码成帧,再将帧数据拆分到 RTP 协议包后发送到流媒体服务器,本文将介绍如何使用 JRTPLIB 发送 H264 码流数据。

2021-12-19 17:14:36 4429

原创 RTP协议与实战

在实时音视频通话中,我们通常使用 UDP 作为传输层协议,使用 RTP 协议包荷载音视频数据,RTP(Real-time Transport Protocol)是一种在 Internet 上传输多媒体数据的应用层协议,它通常建立在 UDP 之上(也可以建立在 TCP 上)。UDP 协议没有序号等信息,而 RTP 协议可以补充许多音视频传输必要的信息,让音视频数据到达对端后可以重新组合完整,RTP 本身只保证实时数据的传输,并不能提供可靠传输保证,也没有流量控制,拥塞控制机制,它通常与 RTCP 配合使用以提

2021-12-15 00:38:13 8237

原创 mediasoup PipeTransport

在一个音视频通话中,用户发送的音视频数据不一定只通过一个前端媒体服务器进行转发,有可能是 UserA 连接 ServerA,UserB 连接 ServerB,ServerA 与 ServerB 创建一条连接,UserA 发送的数据到达 ServerA 后由 ServerA 转发给 ServerB,ServerB 再发送给 UserB。mediasoup 提供了 PipeTransport 的方式实现服务器级联(数据从一个 Router 转发到另一个 Router)。

2021-12-12 00:19:44 1444

原创 RTCP协议与实战

在音视频通话中,我们常常使用 RTP 协议包承载音视频负载数据,使用 RTCP 协议包反馈当前传输统计数据,控制传输特性以保证提供较高的服务质量,本文将介绍 RTCP 协议以及 RTCP 常用报文的应用。

2021-12-11 15:17:34 9015

原创 Pantheon工具使用

一. 前言二. 使用1. 下载 pantheon 代码并安装子模块git clone https://github.com/StanfordSNR/pantheon.gitgit submodule update --init --recursive2. 安装依赖与初始化(1) 运行 tools/install_deps.sh 安装依赖(2) 运行 src/experiments/setup.py --install-deps (--all | --schemes "

2021-11-06 17:18:33 1103 1

原创 mediasoup数据转发 源码剖析

Worker:mediasoup 流媒体处理进程Router:路由对象,类似于房间的功能,保存了流之间的订阅关系,它接收 Producer 的数据并转发给订阅该 Producer 的 ConsumerProducer:音视频流生产者,一路音频就算一个单独的生产者,一路视频也算一个单独的生产者Consumer:音视频流消费者Transport:传输通道,有 WebRtcTransport,PlainRtpTransport 以及 PipeTransport。

2021-10-31 22:55:19 1790 2

空空如也

空空如也

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

TA关注的人

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