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比较

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/28218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在工作中使用ChatGPT需要担心泄密问题吗?

​OpenAI的ChatGPT可以通过自动简化繁琐的任务,针对挑战性问题的提供创造性的解决方案来提高员工的生产力。但随着这项技术被整合到人力资源平台和其他工作场所中,它给各个企业带来了巨大的挑战。苹果、Spotify、Verizon和三星等大公司已禁止或限制员工在…

Java分布式微服务1——注册中心(Eureka/Nacos)

文章目录 基础知识注册中心Eureka注册中心与Ribbon负载均衡1、Eureka注册中心2、Eureka的搭建3、Eureka服务注册4、复制服务实例5、拉取服务6、Ribbon负载均衡的流程及Eureka规则调整:7、Ribbon负载均衡饥饿加载 Nacos注册中心1、服务端Nacos安装与启动2、客户端Nac…

【如何构建自己的基于Arduino的Scara 机器人】

【如何构建自己的基于Arduino的Scara 机器人】 1. 概述2. Scara机器人3D模型3. 3D打印机器人零件4. 组装机器人5. SCARA机器人电路图6. 完成装配7. SCARA机器人的工作原理8. 对 SCARA 机器人进行编程 – Arduino 和处理代码9. 总结在本教程中,我们将学习如何构建基于 Arduino …

明年,HarmonyOS不再兼容Android应用!

2023年华为开发者大会,不知道各位老铁们是否观看了,一个震撼的消息就是,首次公开了HarmonyOS NEXT的概念,简而言之就是,这是一款专为开发者打造的预览版操作系统,旨在提供"纯正鸿蒙操作系统"的体…

【前端实习生备战秋招】—HTML 和 CSS面试题总结(三)

【前端实习生备战秋招】—HTML 和 CSS面试题总结(三) 1.行内元素有哪些?块级元素有哪些? 空(void)元素有那些? CSS 规范规定,每个元素都有 display 属性,确定该元素的类型,每个元素…

体验自制免费开源闯关学SQL

文章目录 前言mac安装nodejs启动体验 前言 sql是常用必不可少的一种语言,我们都或有各种各样的学习经历,最近看鱼皮大佬开源了一款自制的闯关学SQL项目,该项目是纯前端语言,不需要太多依赖以及前置知识,直接下载就可以…

pg实现月累计

获取每月累计数据: ​​​ SELECT a.month, SUM(b.total) AS total FROM ( SELECT month, SUM(sum) AS total FROM ( SELECT to_char(date("Joinin"),YYYY-MM) AS month , COUNT(*) AS sum FROM "APP_HR_Staff_Basic_Info" GROUP BY month ) …

Clickhouse 存储引擎

一、常用存储引擎分类 1.1 ReplacingMergeTree 这个引擎是在 MergeTree 的基础上,添加了”处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。 特点: 1使用ORDERBY排序键作为判断重复的唯一键 2.数据的去重只会在合并…

Android 13 Launcher——屏蔽长按非icon区域出现弹窗

目录 一.背景 二.屏蔽此功能 一.背景 长按Launcher非icon区域也是会有弹窗的,会显示小组件等信息,定制开发要求长按非icon区域不要弹窗,我们来实现此功能,先看下未修改前的长按非icon区域的效果 如上图可以看出长按功能显示出壁…

电力系统电流三段式保护MATLAB仿真模型

整体模型如下: Matlab/Simulink搭建的电力系统电流保护模型采用辐射型单电源供电的运行方式 Ⅰ段保护的搭建 Ⅰ段保护为瞬时速断保护,根据Ⅰ段整定原则确定整定值。线路发生短路故障时,短路电流急剧增大;超过设置的整定值时&…

大数据-玩转数据-Flink-Transform

一、Transform 转换算子可以把一个或多个DataStream转成一个新的DataStream.程序可以把多个复杂的转换组合成复杂的数据流拓扑. 二、基本转换算子 2.1、map(映射) 将数据流中的数据进行转换, 形成新的数据流,消费一个元素并产出一个元素…

Unity 3D中使用tilemap创建关卡地图,瓦片间隙有漏缝

我们使用一张图片来作为Sprite图集,创建地形图: 运行后,会发现,瓦片之间似乎总是有间距。 检查了图片发现,并不是图片边界存在间隙。 最后发现问题是出在图片资源中的线性过滤属性值: 在设计界面就能够看…

ETHERCAT转CANOPEN协议网关canopen分类

1.产品功能 JM-ECT-COP是自主研发的一款 ETHERCAT 从站功能的通讯网关。该产品主要功能是将 ETHERCAT 网络和 CANOPEN 网络连接起来。 本网关连接到 ETHERCAT 总线中做为从站使用,连接到 CANOPEN 总线中做为主站使用。 3.技术参数 ETHERCAT 技术参数 网关做为 E…

【设计模式——学习笔记】23种设计模式——中介者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入案例一普通实现中介者模式 案例二 介绍基础介绍登场角色尚硅谷 《图解设计模式》 案例实现案例一:智能家庭类图实现 案例二:登录页面逻辑实现说明类图实现 总结文章说明 案例引入 案例一 普通实现 在租房过程中,客户可能…

PHP最简单自定义自己的框架定义常量自动生成目录(三)

1、框架入口增加模块定义&#xff0c;实现多模块功能 index.php 定义模块 <?php //定义当前请求模块 define("MODULE",index); require "./core/KJ.php"; 创建后台模块admin.php <?php define("MODULE",admin); require "./cor…

每日一题——最小花费爬楼梯

题目 给定一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第i 个台阶向上爬需要支付的费用&#xff0c;下标从0开始。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的…

计算机网络(8) --- IP与IP协议

计算机网络&#xff08;7&#xff09; --- UDP协议和TCP协议_哈里沃克的博客-CSDN博客UDP协议和TCP协议https://blog.csdn.net/m0_63488627/article/details/132125374?spm1001.2014.3001.5501 目录 1.IP与IP协议 IP作用 协议​编辑 2.网段划分 DHCP划分 CIDR划分 特殊…

【果树农药喷洒机器人】Part5:基于深度相机与分割掩膜的果树冠层体积探测方法

文章目录 一、引言二、树冠体积测量对比方法2.1冠层体积人工测量法2.2冠层体积拟合测量法 三、基于深度相机与分割掩膜探测树冠体积方法3.1像素值与深度值的转换3.2树冠体积视觉探测法3.3实验分析 总结 一、引言 果树靶标探测是实现农药精准喷施的关键环节&#xff0c;本章以果…

Syncfusion Essential Edit for WPF Crack

Syncfusion Essential Edit for WPF Crack 在任何WPF应用程序中启用语法高亮显示。 Syncfusion Essential Edit for WPF是一款具有所有基本功能的编辑器&#xff0c;如文本编辑、剪切、复制和粘贴。它允许用户从各种文件格式打开文件并将其保存为各种文件格式。Syncfusion Esse…

java.lang.IllegalStateException: 不允许修改锁定的参数映射

问题描述&#xff1a; 这个问题是在我写javaweb项目&#xff0c;做敏感词过滤时出现的 需求是&#xff1a;如果是由 getParameter(String s) 得到的数据&#xff0c;可以直接修改value值&#xff0c;将含有敏感词的部分替换为 *** request.getParameterMap() 方法返回一个包…