协议-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博客

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

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

相关文章

vscode设置保存时自动缩进和格式化

参考博客 如何在 VSCode 中自动缩进你的代码 | Linux 中国 省流 使用 Ctrl Shift P 来打开命令模式,搜索 Open User Settings 并按下回车你需要搜索 Auto Indent,并在 “编辑器:自动缩进(Editor: Auto Indent)” 中选择 “全部(Full)”P…

LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab)

代码下载:LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab) LSSVM最小二乘支持向量机多变量多步光伏功率预测 一、引言 1.1、研究背景与意义 随着全球能源危机和环境问题的日益严重,可再生能源的开发利用成为了世界各国…

从家庭IP到全球网络资源的无缝连接:Cliproxy的专业解决方案

数字化时代,家庭IP作为个人或家庭接入互联网的门户,其重要性日益凸显。然而,要实现从家庭IP到全球网络资源的无缝连接,并享受高效、安全、稳定的网络访问体验,往往需要借助专业的代理服务。Cliproxy,作为业…

ubuntu 22.04 安装 cuda sdk 11.8

ubuntu 22.04 安装 cuda sdk 11.8 linux kernel 版本太高的问题 主要思路是先安装 nv 显卡驱动,这会同时安装 kmd driver 然后安装 cuda sdk 11.x 时不安装 kernel driver 下载 display driver 搜索 display driver https://www.nvidia.com/en-us/drivers/ 选择比…

Day.23

leetcode 413.等差数列划分 问题:如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。 子数组 是数组中的一个连续序列…

leetcode 做题思路快查

58. 最后一个单词的长度 考虑从字符串size() - 1处倒序的定义两个指针;多的空格用while(j > 0 && s[j] ) j--跳过; 考虑"a" "_"这两个场景 s45. 跳跃游戏 II 思路:动态规划,f[i] 0...i-1跳到…

Ollama 部署 DeepSeek-R1 及Open-WebUI

Ollama 部署 DeepSeek-R1 及Open-WebUI 文章目录 Ollama 部署 DeepSeek-R1 及Open-WebUI〇、说明为什么使用本方案 一、 安装Ollama1、主要特点:2、安装3、验证 二、Ollama 部署 DeepSeek1、部署2、模型选用3、Ollama 常用命令4、Ollama模型默认存储路径 安装open-w…

feign Api接口中注解问题:not annotated with HTTP method type (ex. GET, POST)

Bug Description 在调用Feign api时,出现如下异常: java.lang.IllegalStateException: Method PayFeignSentinelApi#getPayByOrderNo(String) not annotated with HTTPReproduciton Steps 1.启动nacos-pay-provider服务,并启动nacos-pay-c…

网络计算机的相关概念整理

网络计算机的五个组成部分 单个计算机是无法进行通信的。所以需要借助网络。 下面介绍一些在网络里常见的设备。 一、服务器 服务器是在网络环境中提供计算能力并运行软件应用程序的特定IT设备 它在网络中为其他客户机(如个人计算机、智能手机、ATM机等终端设备&…

Python微博动态爬虫

本文是刘金路的《语言数据获取与分析基础》第十章的扩展,详细解释了如何利用Python进行微博爬虫,爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。 整个过程十分明了,就是用户利用代码模拟Ajax请求,发…

[NKU]C++安装环境 VScode

bilibili安装教程 vscode 关于C/C的环境配置全站最简单易懂!!大学生及初学初学C/C进!!!_哔哩哔哩_bilibili 1安装vscode和插件 汉化插件 ​ 2安装插件 2.1 C/C 2.2 C/C Compile run ​ 2.3 better C Syntax ​ 查看已…

SpringCloud学习笔记(五)

8.Seata分布式事务 8.1. Seata简介 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。 8.2. Seata工作组件 XID:全局事务的唯一标识,在微服务调用链中传递,绑定到服务的事务的上下文。TC&…

(14)gdb 笔记(7):以日志记录的方式来调试多进程多线程程序,linux 命令 tail -f 实时跟踪日志

(44)以日志记录的方式来调试多进程多线程程序 : 这是老师的日志文件,可以用来模仿的模板: (45)实时追踪日志的 tail -f 命令: (46) 多种调试方法结合起来用 …

重生之我要当云原生大师(十四)分析和存储日志

目录 一、简述常用的日志文件所存储的消息类型。 二、syslog的优先级? 三、维护准确时间的意义? 一、简述常用的日志文件所存储的消息类型。 1. 系统日志文件 /var/log/messages 消息类型:通用的系统日志文件,记录系统启动、…

Goland 内存逃逸问题

内存逃逸是什么? 在go语言中,内存分配存在两个方式:堆分配;栈分配。 栈分配:是在函数调用时为局部变量分配内存,当函数返回时,这些内存会自动释放。 堆分配:通过 new 或者 make 函…

视觉硬件选型和算法选择(CNN)

基础知识 什么是机械视觉: 机械视觉是一种利用机器代替人眼来进行测量和判断的技术,通过光学系统、图像传感器等设备获取图像,并运用图像处理和分析算法来提取信息,以实现对目标物体的识别、检测、测量和定位等功能。 机械视觉与人类视觉有什…

尝试一下,交互式的三维计算python库,py3d

py3d是一个我开发的三维计算python库,目前不定期在PYPI上发版,可以通过pip直接安装 pip install py3d 开发这个库主要可视化是想把自己在工作中常用的三维方法汇总积累下来,不必每次重新造轮子。其实现成的python库也有很多,例如…

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

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

深度分析:网站快速收录与网站内容多样性的关系

本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/87.html 网站快速收录与网站内容多样性之间存在着密切的关系。以下是对这一关系的深度分析: 一、网站内容多样性对快速收录的影响 提升搜索引擎抓取效率: 多样化的…

接入 deepseek 实现AI智能问诊

1. 准备工作 注册 DeepSeek 账号 前往 DeepSeek 官网 注册账号并获取 API Key。 创建 UniApp 项目 使用 HBuilderX 创建一个新的 UniApp 项目(选择 Vue3 或 Vue2 模板)。 安装依赖 如果需要在 UniApp 中使用 HTTP 请求,推荐使用 uni.requ…