WebRTC
文章平均质量分 88
椛茶
音视频,RTC,后端开发,C++,golang
展开
-
使用RTP包荷载H264码流数据
在音视频通话中我们通常使用 RTP 协议包荷载音视频码流数据,例如用户摄像头采集图像后进行编码成帧,再将帧数据拆分到 RTP 协议包后发送到流媒体服务器,本文将介绍如何使用 JRTPLIB 发送 H264 码流数据。原创 2021-12-19 17:14:36 · 4193 阅读 · 0 评论 -
WebRTC代理类
我们以 PeerConnectionFactory 为例说明如何定义一个代理类。首先定义一个 PeerConnectionFactoryInterface 类,它继承自 rtc::RefCountInterface,然后在接口类中声明需要暴露的接口,例如 SetOptions,CreatePeerConnection,GetRtpSenderCapabilities 等接口都是需要对外暴露的接口。原创 2022-02-27 23:59:46 · 856 阅读 · 0 评论 -
WebRTC收集网卡地址信息 源码剖析
WebRTC 音视频通话的双方需要交换候选者信息,然后进行连通性检测,因此对于通信的每一方都需要收集自己的主机地址,映射地址等,通过收集网卡信息我们可以知道网卡配置的地址信息。原创 2022-03-19 19:04:51 · 3907 阅读 · 0 评论 -
WebRTC ULPFEC
网络中传输实时音视频数据通常使用 UDP,由于传输中存在丢包的问题可能使听到的声音有断续或者看到的视频卡顿,针对弱网场景可以通过添加适当的冗余包来对抗丢包引起的卡顿问题。FEC 基本原理是通过原始数据生成一定的冗余数据,如果原始数据在传输过程中有丢失,接收端也可以通过冗余数据恢复原始数据。本文介绍 ULPFEC 的基础理论,报文格式,并介绍 WebRTC ULPFEC 相关的源码实现。原创 2022-11-07 01:03:54 · 1736 阅读 · 1 评论 -
STUN工作原理
现实网络环境中绝大多数主机都是处于 NAT 之后,对于两个处于同一内网环境的主机,它们只要知道对端的内网地址就能进行通信,而对于不在同一内网的主机,如果它们想通信,要么借助带有公网地址的主机转发,要么通过一定的手段进行 NAT 穿越。STUN 协议是用来 NAT 穿越的工具,它允许位于 NAT 之后的主机查找到自己 NAT 映射后的公网地址,需要通信的双方交换映射后的公网地址再进行连通性检测。STUN 最先在。原创 2023-07-29 15:25:44 · 1291 阅读 · 0 评论 -
使用RTP包荷载AAC码流数据
参考这篇博客。AAC 有两种格式:ADIF,ADTS。ADIF(Audio Data Interchange Format),音频数据交换格式,这种格式的特点是只在文件头部存储用于音频解码播放的头信息(例如采样率,通道数等),它的解码播放必须从文件头部开始,一般用于存储在本地磁盘中播放。原创 2022-12-13 20:48:34 · 1617 阅读 · 0 评论 -
RTCP协议与实战
在音视频通话中,我们常常使用 RTP 协议包承载音视频负载数据,使用 RTCP 协议包反馈当前传输统计数据,控制传输特性以保证提供较高的服务质量,本文将介绍 RTCP 协议以及 RTCP 常用报文的应用。原创 2021-12-11 15:17:34 · 8611 阅读 · 0 评论 -
RTP协议与实战
在实时音视频通话中,我们通常使用 UDP 作为传输层协议,使用 RTP 协议包荷载音视频数据,RTP(Real-time Transport Protocol)是一种在 Internet 上传输多媒体数据的应用层协议,它通常建立在 UDP 之上(也可以建立在 TCP 上)。UDP 协议没有序号等信息,而 RTP 协议可以补充许多音视频传输必要的信息,让音视频数据到达对端后可以重新组合完整,RTP 本身只保证实时数据的传输,并不能提供可靠传输保证,也没有流量控制,拥塞控制机制,它通常与 RTCP 配合使用以提原创 2021-12-15 00:38:13 · 7974 阅读 · 0 评论 -
WebRTC example peerconnection剖析
WebRTC 提供了许多 example,本文介绍 peerconnection example 的使用与代码流程分析,通过该示例可以帮助理解 WebRTC 信令交互,媒体协商,音视频数据交互等流程。该示例涉及两个角色:peerconnection_server,peerconnection_client。peerconnection_server 是一个信令服务器,它负责连接成员的管理以及信令交互与转发。原创 2022-01-28 23:25:35 · 2161 阅读 · 0 评论 -
WebRTC线程介绍
WebRTC 有三类线程:信令线程,网络线程,工作线程。信令线程一般工作在 PeerConnection 层,它负责与应用层交互,例如 createOffer,createAnswer 等操作,并通知工作线程和网络线程相应的信号事件。网络线程工作在网络传输层,它负责网络收发包,从网络接收包数据并发送给工作线程,工作线程也会把要发送的包数据给网络线程。工作线程工作在媒体引擎层(engine),包含视频采集线程,视频渲染线程,视频编码线程,视频解码线程等。原创 2022-02-08 00:38:36 · 2172 阅读 · 0 评论 -
会话描述协议-SDP
SDP(Session Description Protocol) 是一种通用的会话描述协议,例如在音视频通话前通话双方需要进行媒体能力协商,比如协商双方都可支持的编解码类型,交换候选地址等,因此通话前都会发送一个 SDP,描述自己的会话和媒体等信息。原创 2022-02-13 17:43:23 · 3826 阅读 · 0 评论 -
WebRTC CreateOffer源码剖析
在中我们介绍了 SDP 协议相关的内容,WebRTC 是按会话描述,媒体描述(媒体信息,网络描述,安全描述,服务质量)对 SDP 描述字段进行分类的,本文将以 CreateOffer 为例并从源码角度分析 WebRTC 是如何生成 SDP 的。原创 2022-02-20 00:55:08 · 2148 阅读 · 0 评论 -
WebRTC Pacer
实时音视频通信发送端需要一个平滑发送模块(Pacer),因为视频的关键帧比非关键帧大很多,一般一个关键帧需要打到多个 RTP 报文中,此时如果直接把所有 RTP 报文发送到网络,很容易造成网络拥塞。WebRTC Pacer 模块的作用就是让数据在网络上发送更加平滑,防止因为数据量的突增造成网络发生拥塞,效果如下。假设是只发送音频数据包,平滑发送模块作用较小,因为音频帧产生的时间间隔是固定的,而且一个音频帧编码后的数据不大,一般一个 RTP 报文可以承载。原创 2022-11-21 17:36:29 · 1164 阅读 · 0 评论 -
WebRTC GCC 拥塞控制算法(REMB-GCC)
在网络传输中,所有应用程序都需要拥塞控制以避免网络出现拥塞的情况,对于音视频传输也是如此,假设发送方以某个码率值发送数据,但是网络出现拥塞,此时发送方应该降低发送码率,当网络拥塞情况好转,发送方又可以提升发送码率。GCC 算法是出自 Google 的一种结合延时梯度和丢包率的拥塞控制算法,WebRTC 默认使用该算法。原创 2022-11-19 15:44:29 · 3449 阅读 · 0 评论 -
WebRTC GCC 拥塞控制算法(TCC-GCC)
网络传输中链路的带宽是有限的,为避免往链路发送过载的数据量导致网络拥塞,我们需要进行带宽预估,结合预估带宽作出调整避免网络拥塞。在《WebRTC GCC 拥塞控制算法(REMB-GCC)》中我们总结了 REMB-GCC 拥塞控制算法,并在文末提到 Google 已经推出 TCC-GCC 取代 REMB-GCC。TCC-GCC 的原理也是基于延时梯度和丢包率进行带宽预估并避免网络拥塞,不同之处在于逻辑都在发送端进行计算,接收端只是反馈包的接收状态(是否收到,以及与上一个包的接收时间差)。原创 2022-12-07 13:35:39 · 3572 阅读 · 0 评论 -
WebRTC Video JitterBuffer
音视频传输通常使用 UDP,由于网络中存在丢包,抖动,乱序等现象,接收端收到的媒体包需要有个包缓冲区存放,对于视频而言,一帧数据可能被打包到多个 RTP 包传输,因此接收端收到 RTP 包后会判断是否可以组成视频帧,如果可以组成视频帧还要判断其参考帧是否存在,如果存在则将该帧送入帧缓冲区,等待解码线程进行解码。 如上所示,RtpVideoStreamReceiver 是收视频包的处理类,其中的 Video JitterBuffer 逻辑主要由 PacketBuffer,RtpFrameRefe原创 2022-06-11 18:18:38 · 1150 阅读 · 1 评论 -
基于WebRTC实现浏览器端音视频聊天室
WebRTC(Web Real-Time Communication)旨在将实时通信功能引入到浏览器,用户无需安装其他任何软件或插件即可在浏览器间进行实时通信功能。本文介绍基于 WebRTC 实现一对一音视频实时聊天室功能,浏览器通过 HTTP 请求 Web 服务器前端页面运行元素(HTML, CSS, JS),之后与信令服务器进行交互,信令服务提供房间管理,信令消息转发等功能,媒体数据通过 STUN/TURN 服务器中转。原创 2022-05-20 17:32:47 · 1423 阅读 · 0 评论 -
WebRTC收集中继地址候选者 源码剖析
在中我们介绍了 WebRTC candidate,重点分析了 WebRTC 收集 host candidate 的流程,本文将介绍 WebRTC 如何收集中继地址候选者(Relayed Address)。如果你对 Relay 的概念或者 TURN 工作原理不太熟悉,建议先阅读后再继续往下阅读。原创 2022-05-02 17:37:57 · 877 阅读 · 0 评论 -
TURN工作原理
TURN 全称是 Traversal Using Relays around NAT,它是 STUN 协议的扩展,主要是添加了 relay 的功能。如果两台主机处在不同的 NAT 之后,它们之间想要互相通信,要么通过 P2P 穿越,要么通过一台带公网 IP 的机器来中转,TURN 服务器提供了中继(relay)的功能,帮助主机间进行通信。原创 2022-05-02 01:08:19 · 3672 阅读 · 0 评论 -
WebRTC收集服务器反射地址候选者 源码剖析
在中我们介绍了 WebRTC candidate,重点分析了 WebRTC 收集 host candidate 的流程,本文将介绍 WebRTC 如何收集服务器反射地址候选者(Server Reflexive Address)。服务器反射候选者是通过发送 STUN Binding Request 给 STUN 服务器,STUN 服务器返回客户端 NAT 映射后的外网地址得到的。原创 2022-04-30 19:24:24 · 791 阅读 · 0 评论 -
WebRTC candidate
WebRTC 音视频通信的双方需要知道对端的通信地址才能进行通信,WebRTC 采用 ICE 方式与通信对端建立通信连接,ICE 中很关键的一个步骤就是收集候选者信息,本端需要将自己的主机候选者,NAT 映射后的候选者以及中继候选者等信息发送给对端,对端也需要发送候选者信息给到本端,双方进行媒体连通性检测,检测成功后才能进行通信。原创 2022-04-08 00:37:39 · 9466 阅读 · 1 评论 -
MediaRecorder录制流数据
在我们介绍了如何使用 WebRTC API 录制本地桌面数据并通过 HTML video 播放出来,现在我们想把采集到的本地桌面数据录制保存成文件并下载到本地,或者录制音视频设备采集到的数据,即可使用 MediaRecorder 类。stream:表示媒体流参数,可以是从 getUserMedia 或者 getDisplayMedia 获取到的流参数对象。options:表示限制选项,可以包含如下属性。原创 2022-03-20 19:55:46 · 3973 阅读 · 2 评论 -
WebRTC API获取本地桌面数据
WebRTC 提供了 mediaDevices.getDisplayMedia API 获取本地桌面数据,例如在共享屏幕时我们需要将本地桌面发送给对方。调用该函数后会弹窗提示选择希望共享的屏幕或窗口(例如本地有双显示器屏幕可以选择其中一个屏幕,或者选择希望共享的应用窗口),该函数调用成功后返回一个 Promise 对象,完成时会接收一个 MediaStream 对象。constraints 是一个 MediaStreamConstraints 对象,结构如下所示。原创 2022-03-20 18:23:23 · 2840 阅读 · 0 评论 -
WebRTC API枚举音视频设备
WebRTC 提供了 mediaDevices.enumerateDevices API 来获取系统的音视频设备。上述调用返回值是一个 Promise 对象,当完成时会接收一个 MediaDeviceInfo 对象的数组,MediaDeviceInfo 属性值含义解释如下。原创 2022-03-20 15:07:09 · 803 阅读 · 0 评论 -
mac环境(intel芯片)编译WebRTC(基于声网镜像)
下载 Xcode,尽量不要选择太高的版本,否则编译可能会出现因 sdk 版本兼容问题的报错,如果你还没有安装 Xcode 可以选择下载安装。,如果你已安装 Xcode 也可以尝试直接使用该版本进入编译环节(编译不报错的话仍然用该版本就行),安装完成后执行如下命令。1. gn gen 命令用来生成编译文件,相当于 cmake,执行 gn clean out/Release 清理编译文件,3. out/Release 目录可以自己指定,编译完成后可以在目录下看到许多可执行文件。查看具体编译参数信息。原创 2022-01-16 00:17:00 · 1667 阅读 · 2 评论 -
WebRTC API获取音视频设备数据
WebRTC 提供了 mediaDevices.getUserMeida API 获取系统音视频设备数据。调用该函数后会提示用户给予访问音视频设备的许可,调用成功后返回一个 Promise 对象,完成时会接收一个 MediaStream 对象。constraints 是一个 MediaStreamConstraints 对象,结构如下所示。原创 2022-03-20 16:30:17 · 2255 阅读 · 0 评论