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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本地部署DeepSeek-R1模型(新手保姆教程)

背景 最近deepseek太火了,无数的媒体都在报道,很多人争相着想本地部署试验一下。本文就简单教学一下,怎么本地部署。 首先大家要知道,使用deepseek有三种方式: 1.网页端或者是手机app直接使用 2.使用代码调用API …

有关网络安全的案例分享 如何保障网络安全

网络发展是非常迅速的,互联网在给人们带来生活娱乐便利的同时,也带来了一些安全隐患,这就需要大家做好防骗规范,确保网络安全,51CTO学堂为大家分享下有关网络安全的案例,以供各位参考。 非法获取公民个人信…

2025新鲜出炉--前端面试题(一)

文章目录 1. vue3有用过吗, 和vue2之间有哪些区别2. vue-router有几种路由, 分别怎么实现3. webpack和rollup这两个什么区别, 你会怎么选择4. 你能简单介绍一下webpack项目的构建流程吗5. webpack平时有手写过loader和plugin吗6. webpack这块你平时做过哪些优化吗?7…

变化检测论文阅读合集

1. ChangeCLIP: Remote sensing change detection with multimodal vision-language representation learning 作者:Sijun Dong a, Libo Wang b, Bo Du c, Xiaoliang Meng a,* 年份:2024 研究方法/模型: 重构原始CLIP:提取双时…

viem库

viem是一个用于和以太坊进行交互的javascript库,它提供了简单的API进行智能合约的读取和写入操作,你可以使用它来与区块链上智能合约进行交互,查询链上数据等。 基本功能 1,创建公有客户端 createPublicClient 可以创建一个链接…

2025影视泛目录站群程序设计_源码二次开发新版本无缓存刷新不变实现原理

1. 引言 本设站群程序计书旨在详细阐述苹果CMS泛目录的创新设计与实现,介绍无缓存刷新技术、数据统一化、局部URL控制及性能优化等核心功能,以提升网站访问速度和用户体验。 2. 技术概述 2.1 无缓存刷新技术 功能特点: 内容不变性&#x…

OpenEuler学习笔记(二十三):在OpenEuler上部署开源MES系统

在OpenEuler上部署小企业开源MES(制造执行系统,Manufacturing Execution System)是一个非常有价值的项目,可以帮助企业实现生产过程的数字化管理。以下是基于开源MES系统(如 Odoo MES 或 OpenMES)的部署步骤…

大数据项目2:基于hadoop的电影推荐和分析系统设计和实现

前言 大数据项目源码资料说明: 大数据项目资料来自我多年工作中的开发积累与沉淀。 我分享的每个项目都有完整代码、数据、文档、效果图、部署文档及讲解视频。 可用于毕设、课设、学习、工作或者二次开发等,极大提升效率! 1、项目目标 本…

c++ haru生成pdf输出饼图

#define PI 3.14159265358979323846 // 绘制饼图的函数 void draw_pie_chart(HPDF_Doc pdf, HPDF_Page page, float *data, int data_count, float x, float y, float radius) { float total 0; int i; // 计算数据总和 for (i 0; i < data_count; i) { tot…

STM32 Unix时间戳

Unix时间戳 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒 时间戳存储在一个秒计数器中&#xff0c;秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同&#xff0c;不同时区通过…

Spring Boot启动内嵌tocmat原理

要研究Spring Boot启动内嵌tomcat的原理&#xff0c;就需要先了解一下Spring Boot自动配置的过程&#xff0c;首先简要的梳理一下springboot自动配置的步骤。 一、SpringBoot自动配置 当SpringBoot应用启动时&#xff0c;EnableAutoConfiguration注解被激活&#xff0c;该注解…

腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发

腾讯云AI代码助手评测&#xff1a;如何智能高效完成Go语言Web项目开发 ?? 文章目录 腾讯云AI代码助手评测&#xff1a;如何智能高效完成Go语言Web项目开发 ?? 背景引言开发环境介绍腾讯云AI代码助手使用实例 1. 代码补全2. 技术对话3. 代码优化4. 规范代码5. Bug处理 获得…

feign 远程调用详解

在平常的开发工作中&#xff0c;我们经常需要跟其他系统交互&#xff0c;比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么&#xff0c;我们应该通过什么方式进行系统之间的交互呢&#xff1f;今天&#xff0c;简单来总结下 feign 的用法。 1&#xff1a;引入依…

【JVM详解三】垃圾回收机制

一、对象是否存活 强引用&#xff1a;Object obj new Object(); 只要强引用还在&#xff0c;垃圾收集器永远不会回收掉被引用的对象。在不用对象的时将引用赋值为 null&#xff0c;能够帮助垃圾回收器回收对象。比如 ArrayList 的 clear() 方法实现。软引用&#xff08;SoftRe…

基于lstm+gru+transformer的电池寿命预测健康状态预测-完整数据代码

项目视频讲解: 毕业设计:基于lstm+gru+transformer的电池寿命预测 健康状态预测_哔哩哔哩_bilibili 数据: 实验结果:

opentelemetry-collector 配置elasticsearch

一、修改otelcol-config.yaml receivers:otlp:protocols:grpc:endpoint: 0.0.0.0:4317http:endpoint: 0.0.0.0:4318 exporters:debug:verbosity: detailedotlp/jaeger: # Jaeger supports OTLP directlyendpoint: 192.168.31.161:4317tls:insecure: trueotlphttp/prometheus: …

uniapp访问django目录中的图片和视频,2025[最新]中间件访问方式

新建中间件, middleware.py 匹配,以/cover_image/ 开头的图片 匹配以/episode_video/ 开头的视频 imageSrc: http://192.168.110.148:8000/cover_image/12345/1738760890657_mmexport1738154397386.jpg, videoSrc: http://192.168.110.148:8000/episode_video/12345/compres…

ChunkKV:优化 KV 缓存压缩,让 LLM 长文本推理更高效

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Windows下ollama详细安装指南

文章目录 1、Windows下ollama详细安装指南1.1、ollama介绍1.2、系统要求1.3、下载安装程序1.4、安装步骤1.5、验证安装1.6、环境变量配置1.7、模型选择与安装【deepseek 示例】1.7.1、拉取并运行模型1.7.2、进阶使用技巧 1、Windows下ollama详细安装指南 1.1、ollama介绍 olla…

【算法】动态规划专题⑥ —— 完全背包问题 python

目录 前置知识进入正题模板 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 完全背包问题是动态规划中的一种经典问题&#xff0c;它与0-1背包问题相似&#xff0c;但有一个关键的区别&#xff1a;在完全背包问题中&#xff0c;每种物品都有无限的数量可用。…