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

协议-WebRTC-HLS

是什么?

WebRTC(Web Real-Time Communication)

  • 实现 Web 浏览器和移动应用程序之间通过互联网直接进行实时通信。
  • 允许点对点音频、视频和数据共享,而无需任何插件或其他软件。
  • WebRTC 广泛用于构建视频会议、语音通话、直播、在线游戏等应用程序

![[Pasted image 20250207215319.png]]

HLS (HTTP Live Streaming)

  • HLS协议由苹果公司提出,解决RTMP协议不使用标准的HTTP接口传输数据,可能被防火墙屏蔽掉等问题

为什么?

说到 WebRTC,我们不得不提到 Gobal IP Solutions,简称 GIPS。这是一家 1990 年成立于瑞典斯德哥尔摩的 VoIP 软件开发商,提供了可以说是世界上最好的语音引擎。

Skype、腾讯 QQ、WebEx、Vidyo 等都使用了它的音频处理引擎,包含了受专利保护的回声消除算法,适应网络抖动和丢包的低延迟算法,以及先进的音频编解码器。

Google 在 Gtalk 中也使用了 GIPS 的授权。Google 在 2011 年收购了 GIPS,并将其源代码开源,加上在 2010 年收购的 On2 获取到的 VPx 系列视频编解码器,WebRTC 开源项目应运而生,即 GIPS 音视频引擎 + 替换掉 H.264 的 VPx 视频编解码器。

在此之后,Google 又将在 Gtalk 中用于 P2P 打洞的开源项目 libjingle 融合进了 WebRTC。所以目前 WebRTC 提供了在 Web、iOS、Android、Mac、Windows、Linux 在内的所有平台的 API,保证了 API 在所有平台的一致性。使用 WebRTC 的好处主要有以下几个方面:

  1. 免费的使用 GIPS 先进的音视频引擎,在此之前都需要付费授权。
  2. 由于音视频传输是基于点对点传输的,所以实现简单的 1 对 1 通话场景,需要较少的服务器资源,借助免费的 STUN/TURN 服务器可以大大节约成本开销。
  3. 开发 Web 版本的应用非常方便,使用简单的 JS 接口,无需安装任何插件,即可实现音视频互通。

WebRTC诞生纯粹就是Google的一个收购行为,并非像H.264是需求主动研发推动

  • 定义就是集各家所长的结合体
  • GIPS 音视频引擎 + 替换掉 H.264 的 VPx 视频编解码器 + Gtalk 中用于 P2P(Peer-to-Peer) 打洞的开源项目 libjingle

直播业务增长使得更多人选择WebRTC

  • RTMP 完全可以满足直播产品的需求,但由于其相对延时较高,不能满足视频互通的产品需求
  • 自研一套符合视频互通要求的通信系统相对复杂,对开发者的技术栈要求很高,所以越来越多的人选择 WebRTC

怎么做?

  • 流媒体服务软件可以使用SRS
    • SRS是国内研发的一个比较流行的开源流媒体服务软件
    • 囊括了RTMP、HLS、WebRTC、HTTP-FLV等主流协议

![[Pasted image 20250208005311.png]]

Live Streaming

docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5
ffmpeg -re -i ./doc/source.flv -c copy -f flv rtmp://localhost/live/livestream
  • 打开下面的页面播放流
    • RTMP (by VLC): rtmp://localhost/live/livestream
    • H5(HTTP-FLV): http://localhost:8080/live/livestream.flv
    • H5(HLS): http://localhost:8080/live/livestream.m3u8

SRS支持WebRTC,可以做会议或视频聊天

CANDIDATE="192.168.1.10"
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 1990:1990 -p 8088:8088 \--env CANDIDATE=$CANDIDATE -p 8000:8000/udp \registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5
  • 使用WebRTC推流到SRS:WebRTC: Publish
  • 打开页面观看WebRTC流:WebRTC: Play

WebRTC for Live Streaming

CANDIDATE="192.168.1.10"
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \--env CANDIDATE=$CANDIDATE -p 8000:8000/udp \registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 ./objs/srs -c conf/rtmp2rtc.conf
  • 如果RTMP转WebRTC流播放,必须使用配置文件rtmp2rtc.conf
ffmpeg -re -i ./doc/source.flv -c copy -f flv rtmp://localhost/live/livestream
  • 打开下面的页面播放流(若SRS不在本机,请将localhost更换成服务器IP)
    • WebRTC: http://localhost:1985/rtc/v1/whep/?app=live&stream=livestream
    • H5(HTTP-FLV): http://localhost:8080/live/livestream.flv
    • H5(HLS): http://localhost:8080/live/livestream.m3u8

使用 ffmpeg-webrtc

git clone  https://github.com/ossrs/ffmpeg-webrtc.git
./configure --enable-muxer=whip --enable-openssl --enable-version3 --enable-libx264 --enable-gpl --enable-libopus
make -j10
  • x264
  • libopus
  • openssl
  • whip-muxer
ffmpeg -re -i source.flv \
-c:v libx264 -profile:v baseline \
-c:a libopus -ar 48000 -ac 2 -ab 32k \
-f whip "http://192.168.1.100:1985/rtc/v1/whip/?app=live&stream=livestream"

WebRTC using HTTPS

  • 非本机推拉流,也就是不能用localhost访问SRS时,浏览器限制必须HTTPS才能推拉流
CANDIDATE="192.168.1.10"
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 1990:1990 -p 8088:8088 \--env CANDIDATE=$CANDIDATE -p 8000:8000/udp \registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 ./objs/srs -c conf/https.docker.conf

核心本质

WebRTC本质就三个名词 ,这是协商机制

  • ICE
  • STUN
  • TURN

WebRTC数据封装就两个名词

  • RTP
  • RTCP

HLS本质就两个后缀

  • .m3u8
  • .ts

WebRTC详解

  • WebRTC虽然是点对点的协议,应用在直播场景的话需要搭建WebRTC服务器作为流媒体服务

![[Pasted image 20250208085518.png]]

ICE(Interactive Connectivity Establishment)

  • 允许你的浏览器和对端浏览器建立连接的协议框架

为什么需要ICE协议

  • 在实际的网络当中,从 A 端到 B 端直连不能直接连接。
    • 需要绕过阻止建立连接的防火墙,给你的设备分配一个唯一可见的地址
    • 通常情况下我们的大部分设备没有一个固定的公网地址
    • 如果路由器不允许主机直连,还得通过一台服务器转发数据

NAT(Network Address Translation)

  • 给私网设备映射一个公网的 IP 地址和唯一的端口,以便被外网设备发现

![[Pasted image 20250208121822.png]]

STUN(Session Traversal Utilities for NAT)

  • 在两个用户通信前,首先会向公网的 STUN 服务发送请求获取自己的公网地址,然后通过服务器将各自的公网地址转发给对等端,这样双方就知道了对方的公网地址,根据这个公网地址就可以直接点对点通信了。

![[Pasted image 20250208101620.png]]

为什么需要TRUN协议

  • 一些路由器使用一种“对称型 NAT”的 NAT 模型,不同设备会产生不同端口
  • 无法通过STUN 服务器识别的该内网设备的公网 IP 和端口 传递给 要连接服务器,因为端口会改变

什么是对称NAT (Symmetric NAT),是如何运作的?

  • 同一个内部设备在与不同的外部设备通信时,可能会使用同一外部IP地址和不同的端口
  • 对称NAT对每个连接都进行严格管理,外部设备无法主动发起连接,只能由内部设备主动发起连接
  • 设备A与S1通信时使用的是(203.0.113.1:12345),而与S2通信时使用的是(203.0.113.1:12346)

![[Pasted image 20250208124214.png]]

TURN (Traversal Using Relays around NAT)

  • 通过 TURN 服务器中继所有数据的方式来绕过“对称型 NAT”。你需要在 TURN 服务器上创建一个连接,然后告诉所有对端设备发包到服务器上,TURN 服务器再把包转发给你。
  • 很显然这种方式是开销很大的,所以只有在没得选择的情况下采用。

![[Pasted image 20250208110559.png]]

SDP(Session Description Protocol)

  • 描述多媒体连接内容的协议,例如分辨率,格式,编码,加密算法等
  • SDP 由一行或多行 UTF-8 文本组成,每行以一个字符的类型开头,后跟等号(“ =”),然后是包含值或描述的结构化文本,其格式取决于类型

![[Pasted image 20250208130018.png]]

具体通讯流程

![[Pasted image 20250208112337.png]]

信令服务器 Signal Channel(图中) 实际应是 Signal Server

  • 信令服务器收到本地浏览器的 SDP 请求,它就会将其转发到远程浏览器
  • 然后远程浏览器生成其 SDP 应答并通过信令服务器将其发送回本地浏览器
  • 您可以使用各种技术来实现信令服务器,例如 WebSockets、HTTP 或任何其他合适的通信协议

ICE Candidate

  • Candidate 是 WebRTC 用来描述它可以连接的远端的基本信息, Candidate 是至少包括 IP 地址、端口号、协议的一个信息集。

ICE Candidate 有几种?

  • 主机候选者:网卡自己的 IP 地址及端口。通过设备网卡获取,优先级最高。
    • 在 WebRTC 底层首先会尝试本地局域网内建立连接。
  • 反射候选者:经过 NAT 之后的外网 IP 地址和端口,由 ICE(STUN)服务器获取
    • 其优先级低于主机候选者,当 WebRTC 尝试本地连接不通时,会尝试通过反射候选者获得的 IP 地址和端口进行连接。
  • 中继候选者:表示的是中继(TURN)服务器的转发 IP 地址与端口,由 ICE 中继服务器提供。
    • 优先级最低,前两个都不行则会按该种方式。

HLS协议详解

  • HLS协议的文件由两部分组成
    • 多个只有几秒长度的.ts碎片视频文件
    • 记录这些视频文件地址的.m3u8索引文件
    • 这些静态文件都是直接写入磁盘的

![[Pasted image 20250208002809.png]]

直播的场景下

  • 转码软件可以直接生成HLS相关文件到磁盘,客户端通过HTTP服务下载文件即可

![[Pasted image 20250208003424.png]]

直播场景下HLS不同

  • 在直播的场景下,客户端需要不断定时重新获取.m3u8索引文件
    • 每几秒打包成一个以.ts为后缀的碎片视频文件都会同步更新.m3u8索引文件
    • 碎片视频文件的个数是有上限的 ,默认会将最旧的视频文件删除且更新.m3u8索引文件

HLS劣势

  • 直播延迟很大,大概在5-30秒左右
  • 长时间且多个直播流同时处理,会造成磁盘写入压力过大,机械磁盘,固态硬盘的寿命会加速衰减

HLS优势

  • 直播转点播,点播转直播的场景, 理论上只需要修改索引文件就可以
  • HLS协议的.m3u8索引文件支持二级索引,高清、标清、流畅等多个观看地址可以整合到一个索引文件。播放器可以根据当前带宽自动切换不同的观看地址

文档链接说明

  • 参考文档
    [【音视频处理】RTMP、HLS、HTTP-FLV、WebRTC、RTSP的区别?直播协议详解_rtsp hls-CSDN博客

  • 参考文档
    WebRTC 入门:带有示例代码的实用指南-CSDN博客
    一文详解 WebRTC 基础 - 个人文章 - SegmentFault 思否

  • 参考文档
    进击的WebRTC:我们为什么需要它?_语言 & 开发_毛玉杰_InfoQ精选文章

  • 参考文档
    HLS直播取流协议及实现原理详解_hls直播流-CSDN博客

  • 参考文档
    Docker | SRS

  • 参考文档
    ubuntu22.10 ffmpeg-webrtc推拉流srs环境搭建_ffmpeg能推webrtc吗-CSDN博客

  • 参考文档
    NAT的四种分类:全锥形NAT,地址受限锥形NAT,端口受限锥形NAT,对称NAT-CSDN博客

相关文章:

协议-WebRTC-HLS

是什么? WebRTC(Web Real-Time Communication) 实现 Web 浏览器和移动应用程序之间通过互联网直接进行实时通信。允许点对点音频、视频和数据共享,而无需任何插件或其他软件。WebRTC 广泛用于构建视频会议、语音通话、直播、在线游…...

jQuery UI 下载指南

jQuery UI 下载指南 引言 jQuery UI 是一个基于 jQuery 的用户界面和交互库,它提供了一套丰富的交互组件和视觉效果,可以帮助开发者快速构建美观、交互性强的网页应用。本文将为您详细介绍如何下载 jQuery UI,并指导您进行安装和使用。 jQ…...

MySQL系列之数据类型(String)

导览 前言一、字符串类型知多少 1. 类型说明2. 字符和字节的转换 二、字符串类型的异同 1. CHAR & VARCHAR2. BINARY & VARBINARY3. BLOB & TEXT4. ENUM & SET 结语精彩回放 前言 MySQL数据类型第三弹闪亮登场,欢迎关注O。 本篇博主开始谈谈MySQ…...

Kotlin 2.1.0 入门教程(十)if、when

if 表达式 if 是一个表达式&#xff0c;它会返回一个值。 不存在三元运算符&#xff08;condition ? then : else&#xff09;&#xff0c;因为 if 在这种场景下完全可以胜任。 var max aif (a < b) max bif (a > b) {max a } else {max b }max if (a > b) a…...

编程式路由

<script> export default {name: video-Info1,created () {setTimeout(() > {this.$router.push({ name: home })}, 3000)} } </script> 编程式路由&#xff1a;实现 不需要用户点击router-link&#xff0c;由代码实现路由跳转。 应用场景&#xff1a;用户登录…...

openAI官方prompt技巧(一)

1. 使用最新的模型 2. 将指令放在提示词的开头&#xff0c;并使用 ### 或 """ 来分隔指令和上下文&#xff0c;例如 错误示范❌ 将下面的文本总结为一个要点列表&#xff0c;列出最重要的内容。 Summarize the text below as a bullet point list of the most…...

利用 Python 爬虫获取按关键字搜索淘宝商品的完整指南

在电商数据分析和市场研究中&#xff0c;获取商品的详细信息是至关重要的一步。淘宝作为中国最大的电商平台之一&#xff0c;提供了丰富的商品数据。通过 Python 爬虫技术&#xff0c;我们可以高效地获取按关键字搜索的淘宝商品信息。本文将详细介绍如何利用 Python 爬虫技术获…...

LeetCode 0080.删除有序数组中的重复项 II:双指针 - C++/Java5 行版

【LetMeFly】80.删除有序数组中的重复项 II&#xff1a;双指针 - C/Java5 行版 力扣题目链接&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/ 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超…...

【C++高并发服务器WebServer】-15:poll、epoll详解及实现

本文目录 一、poll二、epoll2.1 相对poll和select的优点2.2 epoll的api2.3 epoll的demo实现2.5 epoll的工作模式 一、poll poll是对select的一个改进&#xff0c;我们先来看看select的缺点。 我们来看看poll的实现。 struct pollfd {int fd; /* 委托内核检测的文件描述符 */s…...

MapReduce是什么?

MapReduce 是一种编程模型&#xff0c;最初由 Google 提出&#xff0c;旨在处理大规模数据集。它是分布式计算的一个重要概念&#xff0c;通常用于处理海量数据并进行并行计算。MapReduce的基本思想是将计算任务分解为两个阶段&#xff1a;Map 阶段和 Reduce 阶段。 Map 阶段&a…...

git提交到GitHub问题汇总

1.main->master git默认主分支是maser&#xff0c;如果是按照这个分支名push&#xff0c;GitHub会出现两个branch&#xff0c;与预期不符 解决方案&#xff1a;更改原始主分支名为main git config --global init.defaultBranch main2.git&#xff1a;OpenSSL SSL_read: SS…...

CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;CNN-GRU卷积神经网络门控循环单元多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) CNN-GRU卷积神经网络门控循环单元多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1、研究背景和意义 随着全球能源危机和环境问题的日…...

编译原理面试问答

编译原理面试拷打 1.编译原理的基本概念 编译原理是研究如何将高级程序语言转换为计算机可执行代码的理论与技术&#xff0c;其核心目标是实现高效、正确的代码翻译。 **编译器&#xff1a;**将源代码转化为目标代码&#xff08;机器码、字节码等&#xff09;。一次翻译整个程…...

LIMO:上海交大的工作 “少即是多” LLM 推理

25年2月来自上海交大、SII 和 GAIR 的论文“LIMO: Less is More for Reasoning”。 一个挑战是在大语言模型&#xff08;LLM&#xff09;中的复杂推理。虽然传统观点认为复杂的推理任务需要大量的训练数据&#xff08;通常超过 100,000 个示例&#xff09;&#xff0c;但本文展…...

Java 魔法:精准掌控 PDF 合同模板,指定页码与关键字替换签章日期

朋友们&#xff01;在实际业务场景中&#xff0c;经常会碰到处理 PDF 合同模板的需求&#xff0c;要在几十页的合同里对指定页面替换公章、签名和日期&#xff0c;还涉及多人签名以及多个公司盖公章。下面就给大家分享两种用 Java 处理这类问题的方法&#xff0c;一种是通过指定…...

Ollama 部署本地大语言模型

一、下载安装ollama 1.百度 ollama Ollama 2.点击下载 可以复制下载链接&#xff0c;使用下载器下载。 3.双击安装 默认安装目录&#xff1a;C:\Users\用户名\AppData\Local\Programs\Ollama 二、更改模型下载目录 0.默认下载目录 (跳过) 之前没下载过模型&#xff0c;不…...

Jackson扁平化处理对象

POJO对象 Data public class People {private PeopleInfo peopleInfo;private List<String> peopleIds;private Map<String, String> peopleMap;Datapublic static class PeopleInfo {private String name;private String address;} }JSON序列化处理 直接将对象进…...

在 Ubuntu 上安装 MySQL 的详细指南

在Ubuntu环境中安装 mysql-server 以及 MySQL 开发包&#xff08;包括头文件和动态库文件&#xff09;&#xff0c;并处理最新版本MySQL初始自动生成的用户名和密码&#xff0c;可以通过官方的APT包管理器轻松完成。以下是详细的步骤指南&#xff0c;包括从官方仓库和MySQL官方…...

pytest-xdist 进行多进程并发测试!

在软件开发过程中&#xff0c;测试是确保代码质量和可靠性的关键步骤。随着项目规模的扩大和复杂性的增加&#xff0c;测试用例的执行效率变得尤为重要。为了加速测试过程&#xff0c;特别是对于一些可以并行执行的测试用 例&#xff0c;pytest-xdist 提供了一种强大的工具&…...

24.ppt:小李-图书策划方案【1】

目录 NO1234​ NO5678​ NO1234 新建PPT两种方式&#x1f447;docx中视图→导航窗格→标题1/2/3ppt新建幻灯片→从大纲→重置开始→版式设计→主题插入→表格 NO5678 SmartArt演示方案&#xff1a;幻灯片放映→自定义幻灯片放映→新建→选中添加...

模型 替身决策

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。替身决策&#xff0c;换位思考&#xff0c;多角度决策。 1 替身决策模型的应用 1.1 替身决策模型在面试中的应用-小李的求职面试 小李是一名应届毕业生&#xff0c;正在积极寻找工作机会。在面试过程中…...

ESP32S3读取数字麦克风INMP441的音频数据

ESP32S3 与 INMP441 麦克风模块的集成通常涉及使用 I2S 接口进行数字音频数据的传输。INMP441 是一款高性能的数字麦克风&#xff0c;它通过 I2S 接口输出音频数据。在 Arduino 环境中&#xff0c;ESP32S3 的开发通常使用 ESP-IDF&#xff08;Espressif IoT Development Framew…...

docker环境下部署face-search开源人脸识别模型

由于我们是直接将face-search部署在docker容器中的,所以,在部署之前一定要检查一下自己的docker环境,要不然部署过程中会出现各种各样的问题 我这里的docker环境是 一、安装docker环境 如果docker版本比较低或者docker-compose的版本比较低的情况下,部署的时候docker的yml…...

301.华为交换机堆叠技术基础

华为交换机堆叠技术基础 一、概念及原理部分1.堆叠简介1.1 什么是堆叠1.2 可靠性网络架构1.3 华为堆叠设备1.4 其他厂商的堆叠2.堆叠的示意图3.堆叠的应用3.1 中小企业3.2 园区网4.堆叠的原理4.1基本的概念4.2 堆叠建立4.3 角色选举4.4 版本同步4.5 配置同步4.6 堆叠系统的登录…...

【数据库创建】用ij工具部署Derby数据库并验证

Java有一个内置的Derby数据库&#xff0c;是一个完全用Java语言编写的、功能强大的微型数据库&#xff0c;其基础引擎和内嵌的JDBC驱动总共大约2MB大小。Derby为用户提供了轻量的标准数据库引擎&#xff0c;它可以紧密地嵌入到任何基于Java的解决方案中。 Derby的特性令人惊奇&…...

飞牛fnOS安装了Airplay没有声音找不到声卡的问题

主要问题描述&#xff1a;我在飞牛的Docker里安装了 Airplay&#xff0c; 这样把NAS接一个外接音箱&#xff0c;就可以当成无线音箱来用&#xff0c;直接把手机的音乐播放投到上面来播放。 &#xff08;文章底部有写我是怎么安装Airplay的&#xff09; 我的报错如下&#xff1…...

netcore openTelemetry+prometheus+grafana

一、netcore项目 二、openTelemetry 三、prometheus 四、grafana添加Dashborad aspire/src/Grafana/dashboards at main dotnet/aspire GitHub 导入&#xff1a;aspnetcore.json和aspnetcore-endpoint.json 效果&#xff1a;...

全程Kali linux---CTFshow misc入门(38-50)

第三十八题&#xff1a; ctfshow{48b722b570c603ef58cc0b83bbf7680d} 第三十九题&#xff1a; 37换成1&#xff0c;36换成0&#xff0c;就得到长度为287的二进制字符串&#xff0c;因为不能被8整除所以&#xff0c;考虑每7位转换一个字符&#xff0c;得到flag。 ctfshow{5281…...

DeepSeek与人工智能的结合:探索搜索技术的未来

云边有个稻草人-CSDN博客 目录 引言 一、DeepSeek的技术背景 1.1 传统搜索引擎的局限性 1.2 深度学习在搜索中的优势 二、DeepSeek与人工智能的结合 2.1 自然语言处理&#xff08;NLP&#xff09; 示例代码&#xff1a;基于BERT的语义搜索 2.2 多模态搜索 示例代码&…...

用 DeepSeek + Kimi 自动做 PPT,效率起飞

以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤&#xff1a; 利用 DeepSeek 生成 PPT 内容&#xff1a; 访问 DeepSeek 官网&#xff0c;完成注册/登录后进入对话界面。输入指令&#xff0c;例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲&#xff0c;需包…...