Web端专业级H264/H265 直播流播放器实现-JessibucaPro播放器

概况

这个主要是参加“深圳 liveVideoStack” 的ppt的文字版的分享。

深圳 liveVideoStack

讲师介绍

关于Jessibuca

  • 官网地址:jessibuca.com
  • Demo: Demo
  • Doc:Doc
  • Github地址:Github

关于JessibucaPro

  • 地址:JessibucaPro
  • Demo: Demo
  • AI:AI
  • 插件:插件

进入主题

大家好:今天我给大家带来的分享的题目是:Web端专业级H264/H265 直播流播放器实现 - jessibucaPro 播放器实现。

在这里插入图片描述

本次分享主要介绍‘背景’,‘架构,兼容性,性能’,还有”展望未来“三个部分。

在这里插入图片描述

第一部分(背景)

在这里插入图片描述

直播行业概况

我们看下现在的直播行业概况。

在这里插入图片描述

目前主要使用到直播的三个领域,分别是监控平台,直播平台,还有互动直播。其中监控平台,例如道路车辆监控,马路安全监控平台,主要是安防领域,比如海康,大华等。
然后就是直播平台,比较典型的是斗鱼,虎牙,抖音这种面向c端的平台。最后就是互动直播领域,主要有在线教育,音视频会议这种,像腾讯会议,zoom等。

web端直播协议

在这里插入图片描述

目前web端支持的直播格式有:

  • hls(m3u8+ts/mp4)
  • HDL(flv)
  • FMP4
  • Raw(H264,H255)

web端支持的直播的协议有:

  • HTTP
  • WebSokcet
  • WebTransport
  • Webrtc

H.264 vs H.265

在这里插入图片描述

对比H.264 格式和 H.265 格式,可以看出

  1. H.264优势在于兼容性高,pc和移动端都支持。H.265兼容性低,兼容依赖浏览器版本和底层硬件支持。
  2. H.265的压缩比、视频质量、性能要高于H.264。

压缩比:同等分辨率情况下,H.265 所需要的带宽要低于h264所需的带宽。

视频质量:H.264能够支持到最高2k,但是H.265可以支持到4k。

性能:H.264的性能要远低于H.265。

H.264对比H.265兼容性如图:

在这里插入图片描述

红的完全不支持,暗绿色是部分支持(需要一定条件才能支持),绿色是完全支持。

对比可以发现:左边,H.264,一片绿,说明支持度非常高,对于pc端的chrome,edge,safari,firefox,opera,ie,移动端安卓的chrome,ios的safari都支持。

右边,H.265,只有小部分绿,大部分都是暗绿,依赖一定条件的支持,对于pc端,大部分浏览器(chrome,edge,opera,ie)需要底层硬件支持,firefox完全不支持,移动端安卓chrome也需要底层硬件支持,只有pc 端的safa和移动端的ios 上的safari支持。

Webassembly 兼容性

在这里插入图片描述

基本也是全绿,除了IE 。其他pc 和移动端都支持。

WebAssembly(缩写为 wasm)是一种使用非 JavaScript 代码,并使其在浏览器中运行的方法。这些代码可以是 C、C++ 或 Rust 等。它们会被编译进你的浏览器,在你的 CPU 上以接近原生的速度运行。这些代码的形式是二进制文件,你可以直接在 JavaScript 中将它们当作模块来用。

业务需求

在这里插入图片描述

业务所需:

  • 水印-用来版权保护防盗录,内容识别等。
  • 低延迟-安防监控,直播会议所需。
  • 视频流加密-主要是为了保护直播流的安全。
  • 电子放大-主要是安防安防领域所需。
  • 广角渲染-广角摄像头,主要是安防安防领域所需。
  • 音频g711a/u格式-摄像头支持的音频格式,主要是安防安防领域所需。
  • 实时框-主要是ai识别画识图。

低延迟直播流播放器

在这里插入图片描述

在这些web端的需求和背景下,我们需要一款能够支持各种直播协议(http、websocket、webtransport等),支持H.264、H.265硬解码+软解码,支持丰富功能(水印、低延迟、视频流加密等)的直播流播放器。

在这里插入图片描述

第二部分(架构、兼容性、性能)

在这里插入图片描述

介绍完背景部分,第二部分,我们来看下播放器的架构,在浏览器兼容性兼容性的解决方案,以及一些性能优化部分。

架构

在这里插入图片描述

首先我们看下播放器的架构部分,整个播放器主要由7大模块组成。

左边是核心模块,从上到下,分别是Stream模块、Demux模块、Decoder模块、Render模块。右边扩展模块,从上到下,分别是UI模块、Crypto模块、Recorder模块。

Stream模块

主要是网络请求模块:支持http、websocket、webtransport、webrtc协议。借助web端提供的fetch、websocket、xmlhttprequest等方法请求到流数据。

在这里插入图片描述

目前播放器支持的请求协议有 15种格式:

  • ws(s)-raw 即ws://host-name:port/jessica/live/test (该协议只对接了monibuca服务器,其他服务器需要额外对接)
  • ws(s)-flv 即ws://host-name:port/jessica/live/test.flv(chrome下ip会报安全错误,建议域名形式访问,检查下端口范围chrome浏览器是否允许,chrome会默认禁用很多端口)
  • http(s)-flv 即http://host-name:port/hdl/live/test.flv
  • Hls 即http://host-name:port/hls/live/test.m3u8 (支持H264/H265)
  • WebTransport 即wt://host-name:port/play/live/test (该协议只对接了monibuca服务器,其他服务器需要额外对接)
  • Webrtc 即 webrtc://host-name:port/webrtc/play/live/test (支持H264/H265, 仅支持https://或者http://localhost环境)
  • Webrtc-zlmediakit 即 webrtc://host-name:port/index/api/webrtc?app=live&stream=stream-name&type=play (支持H264, 仅支持https://或者http://localhost环境)
  • Webrtc-srs 即 webrtc://host-name:port/rtc/v1/play/live/test (支持H264, 仅支持https://或者http://localhost环境)
  • Webrtc-others 即 webrtc://host-name:port/live/test (支持H264, 仅支持https://或者http://localhost环境)
  • http(s)-fmp4 即http://host-name:port/your-path/live/test.(f)mp4
  • ws(s)-fmp4 即ws://host-name:port/your-path/live/test.(f)mp4
  • http(s)-h264 即http://host-name:port/jessica/live/test.h264
  • ws(s)-h264 即ws://host-name:port/jessica/live/test.h264
  • http(s)-h265 即http://host-name:port/jessica/live/test.h265
  • ws(s)-h265 即ws://host-name:port/jessica/live/test.h265
  • ws(s)-mpeg4 即ws://host-name:port/your-path/live/test.mpeg4

从中可以小结下:

  • 协议同时支持https、wss
  • 同时支持H264和H265编码格式
  • 支持webcodecs硬解码(H264+H265)和MSE硬解码(H264+H265)
  • 支持HLS(H264+H265)软解码、硬解码
  • 支持m7s webrtc(H264+H265(软解码、硬解码)),
  • 支持zlmediakit webrtc(H264)
  • 支持srs webrtc(H264)
  • 支持others webrtc(H264)
  • 支持加密流(国标SM4、m7s加密流)
  • 支持裸流(H264+H265)
  • 支持Fmp4格式(H264+H265)
  • 支持mpeg4格式(H264)
Demux模块

在这里插入图片描述

这个模块主要的工作是:将流数据进行解封装出一帧一帧H264、H265数据。

目前播放器支持的封装格式有:

  • hls (http) (m3u8+ts/mp4) 视频(H264、H265) 音频(AAC、MP3)
  • Flv (http+ws) 视频(H264、H265) 音频(AAC、MP3、G711A、G711U)
  • M7S (ws) 视频(H264、H265) 音频(AAC、MP3、G711A、G711U)
  • FMP4 (http) 视频(H264、H265) 音频(AAC、MP3)
  • MPEG4 (ws) 视频(H264)
  • Raw (ws) 视频(H264、H265)
Decoder模块

在这里插入图片描述

decoder模块主要是负责解码,默认播放器支持三种解码模式(两种硬解码,一种软解码)

  • MediaSource 硬解码
  • Webcodec 硬解码
  • ffmpeg(Webassembly) 软解码
MediaSource 硬解码

主要是将一帧一帧H264、H265数据再次封装成Fmp4片段,然后喂给MediaSource来通过播放器底层硬解码音视频数据。渲染在video标签上面。

Webcodec 硬解码

主要是将一帧一帧H264、H265数据解码成videoFrame对象,可以通过canvas 或者 video 渲染。

ffmpeg(Webassembly) 软解码

主要是将一帧一帧H264、H265数据解码成YUV数据,可以通过canvas 或者 video 渲染。

Render模块

在这里插入图片描述

主要是渲染模块,目前播放支持video标签+canvas标签渲染。

对于各个解码模块后续的渲染模块,支持程度:

解码器video渲染canvas渲染
MediaSource
Webcodec
ffmpeg(Webassembly)
UI模块

在这里插入图片描述

目前播放器支持的UI模块有:

  • 全屏 测试地址
  • 声音控制 测试地址
  • 网速显示测试地址
  • 截图 测试地址
  • 进度条 测试地址
  • 播放倍率 测试地址
  • 显示比例 测试地址
  • 视频录制 录制FLV、WEBM,录制Mp4
  • 分辨率切换 测试地址
  • ptz指令操作 测试地址
  • 右键菜单 测试地址
  • 性能面板 测试地址
  • 电子放大 测试地址
  • 快捷键
  • 水印(局部,全屏,动态,幽灵)测试地址
Crypto模块

在这里插入图片描述

目前播放器支持的加密模式有

  • m7s 私有格式 测试地址
  • SM4 国标加密 测试地址
  • XOR 加密
  • 支持扩展加密其他私有加密格式
Recorder模块

在这里插入图片描述

目前播放器支持的录制格式有

  • flv 格式 测试地址
  • Webm格式 测试地址
  • Mp4 格式 测试地址

兼容性

在这里插入图片描述

介绍完播放器的整体架构,接下来我们看下播放器在web端兼容性上面的解决方案。

主要分享6个业务场景,分别是:

  • 电脑硬件不支持H265硬解码
  • IOS不支持MediaSource硬解码
  • 音频格式是G711a/G711u
  • Webrtc如何播放H265的流
  • 兼容国产系统/国产浏览器
  • MediaRecorder不支持录制mp4(MPEG-4)格式
电脑硬件不支持H265硬解码

在这里插入图片描述

目前的现状是:

  1. chrome 107版本以上外加需要硬件支持才能够支持硬解码H265。
  2. edge 79版本以上外加需要硬件支持才能够支持硬解码H265。
  3. FireFox 直接就不支持。

播放器的解决方案是:

  1. 使用ffmpeg+webassembly,通过软解码来支持H265解码。
  2. 使用sharedArrayBuffer,来提升软解码性能。
  3. 使用SIMD指令集加速解码,来提升硬解码性能。

效果如下:

在这里插入图片描述

另外测试地址: 测试地址

IOS不支持MediaSource硬解码

在这里插入图片描述

目前的现状是:

  1. iPadOS 13+ 才支持。
  2. ios 完全不支持。

播放器的解决方案是:

  1. 使用ffmpeg+webassembly。
  2. IOS16.3+使用webcodec解码。

效果如下:

在这里插入图片描述

音频格式是G711a/G711u

在这里插入图片描述

目前的现状是:

  1. Fmp4只支持aac/mp3格式的音频,不支持G711a/G711u格式的音频。

播放器的解决方案是:

1.使用FFmpeg+Webassembly进行软解码,然后借助AudioContext进行播放。

在这里插入图片描述

Webrtc如何播放H265的流

在这里插入图片描述

目前的现状是:

  1. WebRTC本身只支持VP8、VP9、H264、AV1格式。

播放器的解决方案是:

  1. 流媒体服务器(monibuca)通过DataChannel传输音视频数据,借助MediaSource/Webcodec/Webassembly解码播放。

在这里插入图片描述

兼容国产系统/国产浏览器

在这里插入图片描述

目前的现状是:

  1. 国产操作系统(麒麟等)/浏览器(统信等),对于H264/H265硬解码支持度不够,使用的Chromium内核版本都比价低。

播放器的解决方案是:

  1. 当不支持硬解码的时候,使用ffmpeg+WebAssembly进行软解码播放。
MediaRecorder不支持录制mp4(MPEG-4)格式

在这里插入图片描述

目前的现状是:

  1. MediaRecorder只支持录制成webm格式文件。

播放器的解决方案是:

  1. 使用ffmpeg+WebAssembly录制成mp4格式文件。

测试地址:测试地址

性能

介绍完了播放器在web兼容性上面的解决方案,我们再看下播放器在性能优化上面的一些方案。

在这里插入图片描述

主要介绍四种优化方案:

  1. 低延迟优化
  2. Worker线程降低主线程压力
  3. 多线程软解码提升软解码性能
  4. OffscreenCanvas优化渲染
低延迟优化

在这里插入图片描述

为了保证低延迟,播放器设计实现了缓冲区JitterBuffer,添加延迟丢帧机制,添加网络延迟检测机制。

达到的效果:

在这里插入图片描述

通过尽可能的优化,播放器做到了,

  1. 首屏时间小于1s
  2. 公网环境网络稳定的情况下延迟小于1s
  3. 内网环境下可以通过配置使得延迟低于0.8s
Worker线程降低主线程压力

在这里插入图片描述

通过worker线程,播放器可以通过配置支持将网络请求模块stream,解封装模块demux,和解码模块decoder全部放在worker线程里面进行,然后将解码之后的数据传输到主线程进行渲染和播放。

达到的效果

在这里插入图片描述

多线程软解码提升软解码性能

开启多线程解码,借助多核来进行软解码,来提升解码性能。

在这里插入图片描述

首先需要再编译ffmpeg的时候添加多线程参数。然后在将ffmpeg编译打包成webassembly的时候,也需要配置多线程参数。在编写c的业务代码的时候也需要配置使用的多核数量,最后播放器在浏览器上面运行的时候,需在网站的相应头上面添加两个相应参数。这样播放器就使用多线程来软解码音视频了。

达到的效果

在这里插入图片描述

左边图是没有开启多线程的,右边的开启了多线程的。对比我们可以发现,例如同样是webassembly软解码265的1080p 在机器是cpu i7_8700k 显卡是rtx2080的机器上面可以支持同时4路流播放,但是如果开启了多线程,那就可以支持到8路流同时播放。性能翻倍了。

OffscreenCanvas优化渲染

在这里插入图片描述

最后,我们看下offscreen canvas 离屏画布。

支持两种模式:

transfer

worker 线程创建OffscreenCanvas,使用webgl进行绘制,然后将生成的ImageBitmap ,通过postmessage到主线程,然后借助canvas 进行渲染

commit

主线程创建OffscreenCanvas,然后通过postmesage将canvas句柄传递到worker线程,然后worker 线程使用webgl进行绘制渲染。

区别

区别就是transfer需要一直postmessage 传递数据,而commit模式只需要主线程一次将canvas句柄传递到worker线程。 根据业务情况采用不同的模式。

达到的效果

在这里插入图片描述

展望未来

在这里插入图片描述

介绍完了播放器在web端的一些性能优化,我们再看下展望未来。

在这里插入图片描述

播放器可以支持人脸识别,物品识别,让播放器端提供ai能力。可以支持马赛克检查,视频遮挡检查,黑屏、 绿屏检查。 来提升播放效果。

人脸识别、物品识别

在这里插入图片描述

对于人脸识别,物品识别,我们可以采用的方案有:opencv 、 mediapipe

  1. opencv 是一个跨平台的计算机视觉库,可以支持增强现实,人脸识别,动作识别等领域。底层库。
  2. mediapipe:谷歌基于opencv开发出来的功能强大的机器学习框架。 两个都可以借助webassembly 在web端跑运行。
人脸识别

在这里插入图片描述

人脸识别测试地址 测试地址

物品识别

在这里插入图片描述

物品识别测试地址 测试地址

马赛克检查,视频遮挡检查,黑屏、 绿屏检查

在这里插入图片描述

黑屏、绿屏、花屏、马赛克检查 测试地址 测试地址

遮挡物检查测试地址测试地址

最后

在这里插入图片描述

关于Jessibuca

  • 官网地址:jessibuca.com
  • Demo: Demo
  • Doc:Doc
  • Github地址:Github

关于JessibucaPro

  • 地址:JessibucaPro
  • Demo: Demo
  • AI:AI
  • 插件:插件

在这里插入图片描述

谢谢大家。

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

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

相关文章

Retrofit中的注解

一、Retrofit中的注解有那些? 方法注解:GET ,POST,PUT,DELETE,PATH,HEAD,OPTIONS,HTTP标记注解:FormUrlEncoded,Multpart,Streaming参数注解:Query,QueryMap,Body,Field…

liunx java 生成图片 中文显示不出来

使用java 生成图片,在图片上打的文字水印显示为一个方框,这种情况的原因,一般是liunx系统或者docker容器内,没有你在打文字水印时选择的字体 解决办法,先找一个免费的字体,比如 Alibaba-PuHuiTi-Regular.otf 然后使用字体 File newFileT new File("Alibaba-PuHuiTi-Re…

pytorch环境下安装node2vec

1.刚开始直接pip install 出错 看到是在安gensim时候出错 2.单独安gensim:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 找到合适的版本,cp36就是python3.6,下载以后放在 3.

Android关于杀掉进程的方案

《风波莫听穿林打叶声》—— 苏轼 〔宋代〕 三月七日,沙湖道中遇雨,雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此词。 莫听穿林打叶声,何妨吟啸且徐行。 竹杖芒鞋轻胜马,谁怕?一蓑…

开放远程访问MySQL的权限

访问远程数据库时,产生Access denied for user ‘root‘‘xxx.xxx.xxx.xxx‘ (using password: YES)异常的解决办法 一. 异常现象 我编写了一个SpringBoot项目,项目中连接的数据库服务器地址是192.168.87.107,然后打包生成了对应的jar包&am…

Flutter应用程序的加固原理

在移动应用开发中,Flutter已经成为一种非常流行的技术选项,可以同时在Android和iOS平台上构建高性能、高质量的移动应用程序。但是,由于其跨平台特性,Flutter应用程序也面临着一些安全风险,例如反编译、代码泄露、数据…

【Openstack Train安装】九、Nova安装

Nova是OpenStack中最核心的组件,它负责根据需求提供虚拟机服务并管理虚拟机生命周期,包括虚拟机创建、虚拟机调度和热迁移等。 Nova的子组件包括nova-api、nova-compute、nova-scheduler、nova-conductor、nova-db、nova-console等等。 本文介绍Nova安装…

Windows11编译Hadoop3.3.6源码

由于https://github.com/kontext-tech/winutils还未发布3.3.6版本,因此尝试源码编译 目录 环境和安装包准备,见2zlib编译方法一:方法二: 配置文件更改1. maven阿里云镜像2. Node版本3. 越过Javadoc检查 编译HadoopError,其他报错…

每日一题:LeetCode-283. 移动零

每日一题系列(day 08) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

一种使用热成像和自动编码器和 3D-CNN 模型堆叠集成进行跌倒检测的新方法

A Novel Approach for Fall Detection Using Thermal Imaging and a Stacking Ensemble of Autoencoder and 3D-CNN Models A Novel Approach for Fall Detection Using Thermal Imaging and a Stacking Ensemble of Autoencoder and 3D-CNN Models:一种使用热成像和自动编码器…

linux用户管理_用户和组

2 用户管理 2.1 用户和组的基本概念和作用 2.1.1 账户实质 账户实质就是一个用户在系统上的标识,系统依据账户ID来区分每个用户的文件、进程、任务,给每个用户提供特定的工作关键(如用户的工作目录、SHELL版本以及环境配置等)&…

ubuntu终端代理配置

ubuntu浏览器的无需手动设置,主要解决在终端中的配置问题,按照下面配置后可能会ping不通一些ip,但wget/git都是可以的,具体原因以后再分析 查找端口 首先要找到自己代理对应的HTTP端口,以QV2ray软件作为示例,我为8889 手动配置 # 配置系统proxy export http_proxy=1…

怎么一键批量转换PDF/图片为Excel、Word,从而提高工作效率?

在处理大量PDF、图片文件时,我们往往需要将这些文件转换成Word或Excel格式以方便编辑和统计分析。此时,金鸣表格文字识别大师这款工具可以发挥巨大作用。下面,我们就来探讨如何使用它进行批量转换,以实现高效处理。 一、准备工作…

flask中路由route根据字典ID展示部分内容,字典名展示全部内容

from flask import Flask, jsonify , request,render_template,app Flask(__name__)app.config[JSON_AS_ASCII] Falsebooks [{"id": 1, "name": 三国演义},{"id": 2, "name": 水浒传},{"id": 3, "name": 西游记…

太极拳的招式有哪些?

太极拳的招式有很多,下面列举一些常见的太极拳招式: 起势:太极拳的第一个动作,从预备姿势开始,身体慢慢放松,重心移至左腿,然后慢慢屈膝,上体屈从向前,双臂自然下垂。 野…

docker (简介、dcoker详细安装步骤、容器常用命令)一站打包- day01

一、 为什么出现 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应…

【傻瓜级JS-DLL-WINCC-PLC交互】8.DLL读写WINCC连接的PLC数据

思路 JS-DLL-WINCC-PLC之间进行交互,思路,先用Visual Studio创建一个C#的DLL控件,然后这个控件里面嵌入浏览器组件,实现JS与DLL通信,然后DLL放入到WINCC里面的图形编辑器中,实现DLL与WINCC的通信。然后PLC与…

MacBook macOs安装RabbitMQ【超详细图解】

目录 一、使用brew安装RabbitMQ 二、安装RabbitMQWeb管理界面 三、启动RabbitMQ 一、使用brew安装RabbitMQ 刚好项目要用到RabbitMQ,安装顺便写下安装步骤记录一下以备用 使用brew命令安装,一般Mac会自带这个命令,如没有,…

护眼灯对眼睛有好处吗?考公护眼台灯推荐

根据国家卫健委发布的最新数据,目前我国儿童青少年近视率已经达到了相当高的水平。其中,小学生的视力问题占比接近40%,高中生和大学生的近视率则超过70%并且逐年上升。可以说10个学生里面就有7个学生入手一副眼镜。 为了避免这一现象的加深&a…