webrtc 支持H265(三) 总结
文章目录
- web端的解码及渲染的实现
- 应用场景
- 单向视频流的场景
- datachannel通道的稳定性
- 解码性能
- 双向视频流的场景
- 有音频流的场景
web端的解码及渲染的实现
在前面的文章中介绍了ZLMediaKit的修改方法,在web端的播放器可以参照这个实现,基于wasm H265播放器。
基本思路就是通过emscripten将ffmpeg的编译成wasm,可以直接在浏览器中运行的软解码器。然后用webgl渲染出图像。
应用场景
单向视频流的场景
这是这个方案着重解决的场景。
webrtc datachannel(基于ZLMediaKit) + wasm解码 + webgl渲染。这种方案,非常适合单向视频流的应用场景,比如:web看摄像头。在这样的场景中,视频流是单向的,码流从摄像头到ZLMediaKit到浏览器并且没有音频。
但是方案的应用有两个需要考虑的问题:
datachannel通道的稳定性
稳定性是从传输大数据量和可靠性两个角度衡量。
datachannel是可以传输大数量的,并且也有可靠性保证:丢包重传和保证有序。为此我做了两个场景的测试:
- 内网测试:ZLMediaKit与rtmp推流端,web都部署在内网。web通过datachannel拉8M的H265码流,并没有出现过丢包。
- 外网测试:ZLMediaKit部署在外网,rtmp推流端和web部署在内网。web拉H265码流,根据云服务的带宽设置推流码率大小,只要码率值小于带宽,则并不会出现丢包和乱序(说明datachannel通道是有可靠性保证的)。
关于延迟,对于webrtc datachannel通道的延迟我并没有专门进行测试,但是在后续的播放器整体测试时,webrtc datachannel通道并没有引入不可接受的延迟。
解码性能
浏览器通过ffmpeg软解码,对于分辨率大,码流大的情况或多路视频时,还是会出现性能不足的情况。可以通过以下两种方式进行优化:
- simd解码
simd介绍见这个链接 WebAssembly中的simd。
在emscripten中通过msimd128
编译选项进行了支持。
实测效果,simd比ffmpeg的软件解码方式,性能提高了一倍。
- 硬解码
浏览器已经可以支持对H265的硬解码,但是有浏览器的版本限制。
在chrome 浏览器中可以通过webcodec的API来使用硬解码。
可以看下这个链接,chrome支持hevc硬编解码。
双向视频流的场景
我没有实际的测试经验,但是基于webrtc datachannel + wasm 编解码的方案应该是能走通的。首先data channel通道是支持双向流,稳定性也不错。编码性能方面可以通过simd编码或硬编码解决。
有音频流的场景
有音频流最大的难点是要做音视频同步,也意味着web端不再只是单纯的解码,渲染,回放。还需要与ZLMediaKit服务器交互时间同步信息(比如rtcp的sr包)。这种需求比单向视频流的场景复杂很多,并且大概率效果还不好(因为限制太多)。所以如果同时有音视频流场景,还是在服务端做转码,将H265转成H264,然后在web端通过webrtc实现音视频处理更好。
相关文章:
webrtc 支持H265(三) 总结
文章目录 web端的解码及渲染的实现应用场景单向视频流的场景datachannel通道的稳定性解码性能 双向视频流的场景有音频流的场景 web端的解码及渲染的实现 在前面的文章中介绍了ZLMediaKit的修改方法,在web端的播放器可以参照这个实现,基于wasm H265播放…...

Windows使用Notepad++编辑Linux服务器的文件
🚀 Windows使用Notepad编辑Linux服务器的文件 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介…...
升级你的数据采集引擎 使用多线程与代理池提升HTTP代理爬虫性能
在信息爆炸的时代,海量数据的采集和分析成为了企业发展和决策的关键。本文将分享如何通过多线程和代理池的应用,助您升级数据采集引擎,提高数据获取效率和稳定性。 HTTP代理爬虫作为数据采集的重要工具,其性能直接影响着数据采集…...

flask实现一个登录界面
flask实现一个登录界面 基础的Flask项目结构 forms.py:定义登录表单和表单字段的文件。templates/login.html:用于渲染登录表单的 HTML 模板文件。routes.py:定义应用的路由和视图函数的文件。__init__.py:创建并初始化 Flask 应…...

redis的四种模式优缺点
redis简介 Redis是一个完全开源的内存数据结构存储工具,它支持多种数据结构,以及多种功能。Redis还提供了持久化功能,可以将数据存储到磁盘上,以便在重启后恢复数据。由于其高性能、可靠性和灵活性,Redis被广泛应用于…...

maven本地仓库地址修改+maven国内镜像设置+maven运行所需pos.xml文件配置基本写法
1,maven本地仓库地址修改 maven在使用过程中,本地项目仓库其空间占用会越来越大,但是其默认仓库位置往往是以C盘为主,C盘作为系统盘常常会遇到所在盘空间占满的情况,所以我们将其改至其他硬盘空间位置为适合做法&#…...

Jenkins集成SonarQube保姆级教程
Jenkins是自动化部署平台,一个粗眉大眼的糙汉子! SonarQube是代码扫描平台,一个眉目清秀的小女子! 有一天,上天交给我一个任务,去撮合撮合他们! 我抬头看了看天, 不,…...

Git的安装以及本地仓库的创建和配置
文章目录 1.Git简介2.安装Git2.1在Centos上安装git2.2 在ubuntu上安装git 3.创建本地仓库4.配置本地仓库 1.Git简介 Git是一个分布式版本控制系统,用于跟踪和管理文件的更改。它可以记录和存储代码的所有历史版本,并可以方便地进行分支管理、合并代码和协…...

现在运动耳机什么牌子的好用、最好的运动耳机推荐
对于注重身体健康的小伙伴来说,每周必然都少不了有规律的运动,而运动的时候耳边没有音乐的陪伴总是稍显枯燥无味,很难让人提起干劲来。有些小伙伴觉得运动的时候戴着耳机,稍微跳动几下耳机就开始松动,随时都要分心提防…...
监控指标与监控类型
监控体系中最基础的是监控指标,监控系统就是围绕指标的采集、传输、存储、分析、可视化的一个系统。 监控指标是指数值类型的监控数据,比如某个机器的内存利用率,某个 MySQL 实例的当前连接数,某个 Redis 的最大内存上限等等。不…...

Vue实现柱状图横向自动滚动
Vue实现柱状图横向自动滚动 1. 前言2. 代码3、实现效果图 1. 前言 原理:通过定时器修改Echarts的配置(options)达到我们想要的效果。 此外,我们还需要了解Echarts中dataZoom这个组件,这个组件用于:用于区域…...

解决构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!!!
问题描述: 在使用spring进行构建项目时,出现下载依赖迟迟不成功,显示maven wrapper 下载失败的问题。 Maven wrapper Cannot download ZIP distribution from https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/ap…...
MYSQL DCL语句
MySQL DCL语句 简介 DQL是用于查询和检索数据库数据的重要工具。它具有丰富的功能和灵活性,可以根据不同的查询需求进行条件过滤、排序、聚合计算等操作。通过合理使用DQL,可以从数据库中提取有用的数据以进行数据分析和决策支持。 DCL语句的分类 DC…...

4H-SiC nMOSFETs的亚阈值漏电流扫描滞后特性
目录 标题:On the Subthreshold Drain Current Sweep Hysteresis of 4H-SiC nMOSFETs研究了什么文章创新点文章的研究方法文章得出的结论 标题:On the Subthreshold Drain Current Sweep Hysteresis of 4H-SiC nMOSFETs 亚阈值滞后(Subthresh…...
设计模式(单例模式)
概念 保证指定的类只有一个实例,不能创建出其他的实例 实现方式 1.饿汉模式 1.1 代码展示 package 设计模式;/*** Created with IntelliJ IDEA.* Description:* User: wuyulin* Date: 2023-07-28* Time: 11:28*///单例模式(饿汉模式) //保证…...
[SQL挖掘机] - 算术函数 - sqrt
介绍: 当谈到 SQL 中的 sqrt 函数时,它用于计算一个数值的平方根。 用法: sqrt 函数使用以下语法: sqrt(x)其中,x 是要计算平方根的数值。 注意: 当使用负数参数调用 SQL 中的 sqrt 函数时,具体的错误消息可能因不同的数据库…...
数据结构--顺序表、单链表
线性表是指顺序表和单链表 //顺序表数据结构 typedef struct { ElemType data[MaxSize];//顺序表元素 int length; //顺序表当前长度 }SqList; //单链表结点数据结构 typedef struct LNode { ElemType data;//数据域 struct LNode *next;//指针域 }LNode,*LinkList; 顺序表 …...
云安全攻防(一)之 云原生
前言 随着公有云和私有云的广泛部署,云计算基础设施成为企业部署新业务的首选。可以说,云计算已进入下半场,各大云计算服务商的厮杀日益激烈,新的概念也不断的层出不穷。近年来,云原生安全(Cloud Native C…...

#vue3报错 Cannot read properties of null (reading ‘isCE‘)#
场景:使用 npm 安装依赖包的时候,如如安装 npm i xlsx npm i file-saver 重新运行报错 Cannot read properties of null (reading isCE)# 解决办法: 使用的vite vue 在vite.config.ts添加如下配置: dedupe: [ vue ]...

【计算机视觉中的 GAN 】 - 生成学习简介(1)
一、说明 在阅读本文之前,强烈建议先阅读预备知识,否则缺乏必要的推理基础。本文是相同理论GAN原理的具体化范例,阅读后有两个好处:1 巩固了已经建立的GAN基本概念 2 对具体应用的过程和套路进行常识学习,这种练习题一…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...