当前位置: 首页 > news >正文

WebRTC | 音视频直播客户端框架

        端到端通信互动技术可分解为以下几个技术难点:客户端技术、服务器技术、全球设备网络适配技术和通信互动质量监控与展示技术。

一、音视频直播

        音视频直播可分成两条技术路线:一条是以音视频会议为代表的实时互动直播;另一条是以娱乐直播为代表的流媒体分发。

        互动直播主要解决人们远程音视频交流的问题,所以其优点是实时性强,时延一般低于500ms;而娱乐直播则主要解决音视频的大规模分发问题,因此其在大规模分发上更具优势,但实时性比较差,通常时延在3s以上。

1.常见的直播技术

常见的直播技术

        上表中,只有WebRTC技术用于实时互动直播,而其他几种技术都用于娱乐直播。

        HLS是基于HTTP的,它首先对媒体流(文件)进行切片,然后通过HTTP传输,接收端则需要将接收到的切片进行缓冲,之后才能将媒体流平稳地播放出来。(实际上,最初娱乐直播也只有RTMP这一种方案可选,但后来由于苹果宣布不再支持RTMP,并推出了自己的解决方案HLS,最终导致RTMP走向了消亡。

        将RTMP换成HLS需要付出高昂的成本,于是有人提出了HTTP-FLV方案,即传输的内容仍然使用RTMP格式,但底层传输协议换成HTTP,这种方案既可以保障其实时性比HLS好,又可以节约升级的成本,因此也受到各方的欢迎。不过HTTP-FLV的扩展性比较差,因此它只是一种临时方案。

        HLS方案虽然不错(有大量的用户使用),但其他公司也有类似的方案,这使得各直播厂商不得不写多套代码,费时费力。于是,FFMPEG推出了DASH方案,该方案与HLS类似,也是以切片的方式传输数据,最终该方案成为国际标准,从而使直播厂商只要写一套代码就可以实现切片传输了。

2.音视频直播的现状

        WebRTC的愿景是让浏览器间可以快速、方便地实现端到端的实时音视频互动。实时互动直播与娱乐直播技术相结合成为现在直播服务器的主流技术方案。

        音视频直播技术有两个重要趋势:一是实时互动直播技术与娱乐直播技术合二为一;二是WebRTC已经是直播技术的标准,大家都在积极地拥抱WebRTC。

二、自研直播客户端架构

1.基本的五大模块

        一个最简单的直播客户端至少应该包括:音视频采集模块、音视频编码模块、网络传输模块、音视频解码模块和音视频渲染模块五大部分。

        细化一下,音频的采集模块与视频的采集模块是分开的,而音频编解码模块与视频的编解码模块也是分开的。也就是说,音频采用了一条处理流程,视频则采用了另外一条处理流程,它们之间并不相交。在音视频处理中,我们一般称每一路音频或每一路视频为一条轨。

2.支持跨平台

        除上述笼统的五大模块之外,还需考虑跨平台问题。只有在各个平台上都能实现音视频的互联互通,才能称得上是一个合格的音视频直播客户端。以音频采集为例,在不同的平台上,采集音频数据时使用的系统API是不一样的。PC端使用的是CoreAudio;Mac端使用的系统API也称为CoreAudio,不过具体的函数名是不同的;Android端使用的是AudioRecord;iOS端使用的是AudioUnit;Linux端使用的是PulseAudio。

3.编解码的插件化管理

        对于音视频直播客户端来说,我们不但希望它可以处理音频数据、视频数据,而且还希望它可以分享屏幕、播放多媒体文件、共享白板……即使是处理音视频,我们也希望它可以支持多种编解码格式:

  • 音频除了可以支持Opus、AAC外,还可以支持G.711/G.722、iLBC、Speex等;
  • 视频除了可以支持H264外,还可以支持H265、VP8、VP9、AVI等。

        G.711/G.722主要用于电话系统,音视频直播客户端要想与电话系统对接,就要支持这种编解码格式;Opus主要用于实时通话;AAC主要用于音乐类的应用,如钢琴教学等。实现插件化管理可以很方便的使直播客户端能够支持尽可能多的编解码器。

4.关注其他问题

  • 音视频不同步问题

        音视频数据经网络传输后,由于网络抖动和延迟等问题,很可能造成音视频不同步。对此,可在音视频直播客户端增加音视频同步模块以保障音视频的同步。

  • 3A问题

        3A是指:Acoustic Echo Cancelling(AEC),即回音消除;Automatic Gain Control(AGC),即自动增益;Active Noise Control(ANC,也称为Noise Cancellation、Noise Suppression),即降噪。

  • 音视频实时问题

        TCP是以牺牲实时性来保障网络服务质量的。所以,为了保证实时性,一般情况下实时直播应该首选UDP。

三、WebRTC客户端架构

         从WebRTC架构图中可以了解到,它大体上可以分成四层:接口层、Session层、核心引擎层和设备层。

  • 接口层包括两部分:一是Web层接口;二是Native层接口。也就是说,既可以使用浏览器开发音视频直播客户端,也可以使用Native(C++、Android、OC等)开发音视频直播客户端。
  • Session层的主要作用是控制业务逻辑,如媒体协商、收集Candidate等。
  • 核心引擎层包括的内容比较多。从大的方面说,它包括音频引擎、视频引擎和网络传输层。音频引擎层包括NetEQ、音频编解码器(如Opus、iLBC)、3A等;视频引擎包括JitterBufer、视频编解码器(VP8、VP9、H264)等;网络传输层包括SRTP、网络I/O多路复用、P2P等。
  • 设备层主要与硬件打交道,它涉及的内容包括:在各终端设备上进行音频的采集与播放,视频的采集,以及网络层等。

四、自研系统与WebRTC比较

 

相关文章:

WebRTC | 音视频直播客户端框架

端到端通信互动技术可分解为以下几个技术难点:客户端技术、服务器技术、全球设备网络适配技术和通信互动质量监控与展示技术。 一、音视频直播 音视频直播可分成两条技术路线:一条是以音视频会议为代表的实时互动直播;另一条是以娱乐直播为代…...

flutter开发实战-实现marquee根据文本长度显示文本跑马灯效果

flutter开发实战-实现marquee文本跑马灯效果 最近开发过程中需要marquee文本跑马灯效果,这里使用到了flutter的插件marquee 效果图如下 一、marquee 1.1 引入marquee 在pubspec.yaml中引入marquee # 跑马灯效果marquee: ^2.2.31.2 marquee使用 marquee使用也是…...

8.10论文阅读

文章目录 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法损失函数 实验结果 max-vit - unet:多轴注意力医学图像分割摘要本文方法实验结果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模态胶质瘤…...

【计算机网络笔记】第一章

1、计算机网络定义 计算机网络主要是由一些通用的、可编程的硬件(包含CPU、计算机、手机、智能电器…)互连而成的,而这些硬件并非专门用来实现某一特定目的(例如,传送数据或视频信号)。这些可编程的硬件能…...

开源力量再现,国产操作系统商业化的全新探索

文章目录 1. 开源运动的兴起2. 开源力量的推动3. 国产操作系统的崭露头角3.1 国产操作系统有哪些 4.国产操作系统的商业化探索5.开源力量对国产操作系统商业化的推动 操作系统作为连接硬件、中间件、数据库、应用软件的纽带,被认为是软件技术体系中最核心的基础软件…...

uni-app uView自定义底部导航栏

因项目需要自定义底部导航栏&#xff0c;我把它写在了组件里&#xff0c;基于uView2框架写的&#xff08;vue2&#xff09;&#xff1b; 一、代码 在components下创建tabbar.vue文件&#xff0c;代码如下&#xff1a; <template><view><u-tabbar :value"c…...

效率指数级提升的Intellij IDEA快捷键集合

温馨提示&#xff1a;全文有18个小技巧&#xff0c;为了阅读体验&#xff0c;可以直接先看文章目录。 1&#xff0c;打开一个文件中的所有方法展示框 CtrlF12 Alt7 2&#xff0c;打开一个类的所有使用位置 AltF7 3&#xff0c;打开一个类在项目使用的位置 CtrlAltF7 4&#…...

TS学习05-泛型

泛型 目的&#xff1a;可重用性 支持当前数据类型&#xff0c;也支持未来的数据类型。 提供灵活的功能 无法创建泛型枚举和泛型命名空间。 function identity(arg: any): any { return arg }function identity<T>(arg: T) : T { return arg}使用any类型会导致这个函数可以…...

windos wsl2 docker unix:///var/run/docker.sock

解决方案 问题如下 rootDESKTOP-VM0J0I4:~# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?启动下docker sudo service docker startcsdn 等风来不如迎风去 htp://t.csdn.cn/Gh365...

前端面试经典手写题

1、手写Promise class Promise2 {state "pending";callbacks [];constructor(fn) {fn(this.resolve.bind(this), this.reject.bind(this));}resolve(result) {if (this.state ! "pending") return;this.state "fullFilled";nextTick(() > …...

Tomcat 部署及优化

Tomcat概述 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;是 Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。在中小型系统和并发访问用户不是很…...

Selenium入门详细教程+实例演示

目录 1.Selenium概述 1.1什么是Selenium 1.2Selenium的优势 1.3Selenium WebDriver原理 2.Selenium环境搭建 3.Selenium 简单示例 4.八大元素定位 4.1定位方式 4.2定位方式的用法 5.Selenium API 5.1WebDriver 常用 API 5.2WebElement 常用 API 5.3代码示例 6.元素等待机…...

ATFX汇评:美国7月CPI数据即将揭晓,市场预期将有所反弹

ATFX汇评&#xff1a;今日20:30&#xff0c;美劳工部将公布7月未季调CPI年率&#xff0c;前值为3%&#xff0c;预期值3.3%&#xff1b;同一时间公布7月未季调核心CPI年率&#xff0c;前值为4.8%&#xff0c;预期值持平&#xff1b;至8月5日当周初请失业金人数也将同时发布&…...

23、springboot日志使用入门-- SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件

springboot日志使用入门 ★ 典型的Spring Boot日志依赖&#xff1a; spring-boot-start.jar -- spring-boot-starter-logging.jar (Spring Boot的日志包&#xff09;-- logback&#xff08;core、classic&#xff09;-- log4j-to-slf4j.jar-- jul-to-slf4j.jar就是springboo…...

【uniapp】 软键盘弹出后fixed定位被顶上去问题

问题描述 当手机设计的导航栏为fixed定位上去时&#xff0c;输入框获取焦点就会把顶部自定义的导航栏顶到上面去&#xff0c;如下图所示 解决办法 输入框设置 :adjust-position“false” <input type"text" :adjust-position"false" focus"i…...

HarmonyOS应用开发者基础认证考试题库

此博文为HarmonyOS应用开发者基础认证考试的最后的大考&#xff0c;要求100分取得90分方可获取证书、现将考试的题库进行分享&#xff0c;希望能帮到大家。但是需要注意的是&#xff0c;题库会不定时的进行题目删减&#xff0c;但是大概的内容是不会进行改变的。真心希望这篇博…...

FANUC机器人SRVO-105和SRVO-067故障报警原因分析及处理方法

FANUC机器人SRVO-105和SRVO-067故障报警原因分析及处理方法 如下图所示,公司的一台机器人在正常工作时突然报警SRVO-105门打开或紧急停止,同时还有SRVO-067 OHAL2报警(G:1 A:2),按Reset键无法消除报警, 那么遇到这种情况,首先,我们来看一下报警说明书上的解释: 首先…...

在vue中Antv G2 折线图如何添加点击事件获取折线上点的值

在项目中有个需求是点击折线图的点&#xff0c;获取当前点的信息&#xff0c;其它图形都可以参考相关的API获取到&#xff0c;但area做的折线图怎么都获取不到点击的信息&#xff0c;只能获取全部的信息&#xff0c;最终解决如下&#xff1a; 实现思路 用户的鼠标在折线图上移…...

深度学习中训练、推理和验证分别都是什么意思

在深度学习中&#xff0c;推理&#xff08;Inference&#xff09;、训练&#xff08;Training&#xff09;和验证&#xff08;Validation&#xff09;是三个关键概念&#xff0c;它们分别表示了不同的阶段和任务&#xff1a; 训练&#xff08;Training&#xff09;&#xff1a;…...

C语言规范

C语言规范 1.头文件 若包含了头文件aa.h&#xff0c;则就引入了新的依赖&#xff1a;一旦aa.h被修改&#xff0c;任何直接和间接包含aa.h代码都会被重新编译。如果aa.h又包含了其他头文件如bb.h&#xff0c;那么bb.h的任何改变都将导致所有包含了aa.h的代码被重新编译&#x…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

篇章一 论坛系统——前置知识

目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构​编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...

vue3 手动封装城市三级联动

要做的功能 示意图是这样的&#xff0c;因为后端给的数据结构 不足以使用ant-design组件 的联动查询组件 所以只能自己分装 组件 当然 这个数据后端给的不一样的情况下 可能组件内对应的 逻辑方式就不一样 毕竟是 三个 数组 省份 城市 区域 我直接粘贴组件代码了 <temp…...

Docker 镜像上传到 AWS ECR:从构建到推送的全流程

一、在 EC2 实例中安装 Docker&#xff08;适用于 Amazon Linux 2&#xff09; 步骤 1&#xff1a;连接到 EC2 实例 ssh -i your-key.pem ec2-useryour-ec2-public-ip步骤 2&#xff1a;安装 Docker sudo yum update -y sudo amazon-linux-extras enable docker sudo yum in…...

Java中Git基础操作详解(clone、commit、push、branch)

Git是Java开发者必备的版本控制工具&#xff0c;以下是核心操作的详细说明及示例&#xff1a; ​​一、Git基础概念​​ ​​仓库&#xff08;Repository&#xff09;​​&#xff1a;存储代码的目录&#xff0c;包含所有版本历史。​​提交&#xff08;Commit&#xff09;​​…...