使用wfs.js库播放音视频

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

use html5 video tag with MSE for h264 live streaming

本编博客记录桌面虚拟化移动端预研。

完整demo: https://github.com/MarkRepo/wfs.js

常见的直播方案有RTMP RTSP HLS 等等, 由于这些流都需要先传输到服务器,然后进行推流,延时比较大,RTMP可以优化到1s,hls延时最高,大概10s左右。

虚拟桌面要求延时能在100ms以内。经过google查找资料发现有以下几种方案可以实现:

1. 用websocket 传输h264编码数据,在浏览器中使用broadway开源库进行解码,调用html5 canvas绘制图像。在github上有一个demo,经过测试,broadway解码效率不高。(测试环境 chrome book)

参考: https://github.com/131/h264-live-player

2. 使用webRTC 进行点对点直播,找了一个demo,搭建了一个聊天室测试,延时效果大概在500ms左右,应该可以优化。webRTC的接口封装的很好,只有三个接口。

demo: https://github.com/LingyuCoder/SkyRTC-demo   参考:https://segmentfault.com/a/1190000000436544

上面的demo有一个地方需要注意: 使用http服务无法获取到视频流,浏览器报错,提示需要https服务。改成https服务之后,测试成功。

这个方案可行,但是需要自己去改webRTC的源码,工作量比较大,所以没有采用。

3. 使用MSE(Media Source Extension, 具体参考W3C标准)扩展实现 HTML5 video tag的流式直播。(最终采用的方案)

方案描述: 使用websocket 从服务端传输h264编码数据到浏览器, 在浏览器端使用JS 解析h264数据 , 封装成fMP4 fragment, 喂给media source 中的sourceBuffer, 浏览器video tag自动获取sourceBuffer中的数据进行解码渲染。 

最后实现的demo体验效果良好,延时能达到100ms以内,使用笔记本软解、硬解, chrome book 软解表现都很完美,唯独chrome book 硬解会缓冲一帧数据,是一个瑕疵, 不过这个缺点可以在服务器端多发一帧数据解决。(见后文)

下面主要记录预研过程中出现的重要问题和解决方案:

 (1)解析h264数据,封装fMP4 fragment。

  这一步比较复杂,由于之前没有JS开发经验,没有选择自己写,在github找了一个开源实现。参考:https://github.com/ChihChengYang/wfs.js; 根据wfs.js搭建的直播方案,主要出现三个问题(只有第一个延时是wfs.js库的问题,其余是自己的问题):

(2)第一个是延时问题,延时很大,在3~5s左右

原因有两个: 1. wfs.js库中做了缓存,收到一定的数据之后才执行fMP4 fragment的封装。

       2. chrome浏览器的解码器默认不是以直播流的模式解码视频帧,所以会在解码的时候缓存4帧数据。

解决方法:    1. 把wfs.js库中的缓存去掉,每来一帧数据都执行fMP4 fragment的封装

      2. 设置mvhd.duration = 0,如果有mehd的话,设置mehd.fragmentDuration = 0, 这样chrome 会进入“low delay mode”, 不会缓存数据。

具体参考: https://stackoverflow.com/questions/36364943/frame-by-frame-decode-using-media-source-extension

      https://bugs.chromium.org/p/chromium/issues/detail?id=465324

(3)第二个就是解码问题,解码花屏

原因: 虚拟机spice服务端使用了websokify代理(python 写的)。首先,这个代理服务器是流式的(出现数据帧被分割和合并的现象),浏览器端js没有进行数据帧边界的解析; 第二,代理缓冲区过小,导致数据帧被分割传输。

解决方法:1. 修改websokify代理的接收缓冲区大小。

        2. 在wfs.js库中对收到的数据进行解析,一帧一帧的提交数据,封装fMP4 fragment。

(4)第三是屏幕倒转问题

原因: spice服务端发过来的h264数据就是倒的,在终端平台,是由终端处理的。

解决方法: 利用css的画面旋转功能,以x轴为旋转轴, 旋转180度。如:

<style type="text/css" media="screen">
video.rotate180{
  width:100%;
  height:100%;
  transform:rotateX(180deg);
  -moz-transform:rotateX(180deg);
  -webkit-transform:rotateX(180deg);
  -o-transform:rotateX(180deg);
  -ms-transform:rotateX(180deg);
  }
</style>

(5)关于chrome book硬解码缓存一帧问题解决办法

通过看chrome源码 decoder部分,发现decoder处理几个数据类型会直接flush缓冲区,所以可以在wfs.js每收到一帧数据,

就构造一帧这种类型的空数据,喂给video tag, 把缓冲的一帧flush出来,同时把播放时间缩短一半即可(否则会帧堵塞)。示例:

var copy2 = new Uint8Array(4);
copy2[0] = 0, copy2[1] = 0, copy2[2] = 1, copy2[3] = 10; //类型10,11 都可以,但是10可以兼容软解     
this.wfs.trigger(Event.H264_DATA_PARSING, {data: copy2});

不用FFmpeg!海康摄像头PS流直解析前端播放方案(附wfs.js配置指南) 本文介绍了一种无需FFmpeg转码的海康摄像头PS流直解析前端播放方案。通过解析海康SDK回调的PS流数据,提取H.264裸流,并利用wfs.js在前端实现低延迟播放。该方案显著降低了服务器负载,将延迟控制在1秒以内,并提供了详细的wfs.js配置与优化指南。 阅读详情

相关推荐

Wfs.js实现低延时H.264裸流播放

Wfs.js实现低延时H.264裸流播放 一、关键字 Vue框架、wfs.js、H.264、Websocket 二、步骤 wfs.js的GitHub地址 此次用到的是项目中的wfs.js和 index.html这两个文件。 首先在你的项目中的视频页里根据情况加上下面这段代码,注意路径。 <script type="text/javascript" src="/dist/wfs.js" &gt...

lanye233的博客 6818

wfs.js-master.zip

wfs.js 前端课播放视频数据的一个js,数据在前台进行处理,后端只需将视频数据发送到前台不需要在后台进行数据处理

保姆级教程:使用wfs.js实现海康SDK视频流的前端播放(含避坑指南)

本文详细介绍了如何使用wfs.js实现海康SDK视频流的前端播放,包括PS流解析、H264解码等核心技术。通过实战案例和避坑指南,帮助开发者快速搭建高效、低延迟的视频播放系统,适用于安防监控等场景。

w1x2y3的博客 263

use html5 video tag with MSE for h264 live streaming

本编博客记录桌面虚拟化移动端预研。 完整demo:https://github.com/MarkRepo/wfs.js 常见的直播方案有RTMP RTSP HLS 等等, 由于这些流都需要先传输到服务器,然后进行推流,延时比较大,RTMP可以优化到1s,hls延时最高,大概10s左右。 虚拟桌面要求延时能在100ms以内。经过google查找资料发现有以下几种方案可以实现: 1. 用we...

weixin_30608131的博客 807

【亲测免费】 探索低延迟视频直播新境界:wfs.js深度解读与推荐

探索低延迟视频直播新境界:wfs.js深度解读与推荐 在当今数字化时代,实时性成为衡量在线视频体验的关键指标之一。针对这一需求,我们发现了一款极具创新性的开源项目——wfs.js,一个专为HTML5播放器设计的神器,旨在以最低的延迟呈现原始H.264流媒体。 1. 项目介绍 wfs.js是一个精巧的JavaScript,它通过WebSocket连接,直接在标准的HTML5元素和MediaSour...

gitblog_00066的博客 960

h264html实时播放,H5播放H264之websocket

一、简介关于前端使用websocket播放音视频我倒是没想过,但是理论上确实是可行的,因为websocket是长连接,虽然知道web端的常见用法,但是作为c++开发人员我最疑惑的问题就是:使用js处理二进制?这个做法很不常见,恕我没太多了解,我一直以为js一般处理二进制不方便,所以脑海里一直自以为是js编解码效率高吗?因为是基于浏览器的脚本语言的二不是直接基于系统api的独立进行,转行较多,效率应...

weixin_29334463的博客 2407

H5播放H264之websocket

一、简介 关于前端使用websocket播放音视频我倒是没想过,但是理论上确实是可行的,因为websocket是长连接,虽然知道web端的常见用法,但是作为c++开发人员我最疑惑的问题就是: 使用js处理二进制?这个做法很不常见,恕我没太多了解,我一直以为js一般处理二进制不方便,所以脑海里一直自以为是 js编解码效率高吗?因为是基于浏览器的脚本语言的二不是直接基于系统api的独立进行,转行较多,效率应该不高,所以我也一直避讳用js去处理编解码 其实,我自以为的经过不断的探索发现也确实是对的,相对而言j

lixiang987654321的专栏 7277

海康SDK实战:如何从PS流中提取H264裸流并实现前端播放(附完整代码)

本文详细介绍了如何利用海康SDK从PS流中提取H264裸流,并构建无插件前端播放的完整链路。通过解析PS流结构、提取H264 ES流,结合WebSocket实时传输与WFS.js前端播放器,实现了低延迟、高可控性的视频流处理方案,为开发者提供了从数据源到前端渲染的实战代码与清晰指南。

weixin_29051811的博客 441

H5播放之Rtsp转Websocket点播录像抓拍

在web端通过websocket协议播放rtsp视频,支持H265,无插件、低延时、支持录像、支持抓拍。

lixiang987654321的专栏 3395

RTSP H264 流 MSE 播放

elsampsa/websocket-mse-demo 项目介绍: It this demo we’re streaming live video from an RTSP camera to your HTML5 browser. Video is streamed as H264 encapsulated in MP4. No transcoding takes place in the stream-to-browser pipeline. No browser-side flash or pure

GoCoding 766

H5解码H264实时视频流

浏览器如何解码实时视频流?最近研究了一下,大体思路为通过websocket把裸H264传输到浏览器,在通过js封装成mp4格式,再通过Html5的video标签进行解码,效果还是比较不错。websocket传输数据可以参考本人上一篇基于net4.5websocket这里Html5解码H264参考了guthub上实现,链接如下:https://github.com/ChihChengYang/wfs...

3万+

html5 live stream

一、传统的安防监控/流媒体音视频直播基本架构 A/V device 信号采集(yuv/rgb) ---> 转码(h264/265) ---> 网络推送(rtsp/rtmp/http/onvif/p2p) ---> nvr/dvr/proxy/relay server(局域网系统可以不用中转服务器) ---> 客户端播放器(各种app player) 二、...

weixin_38170862的博客 594

webtim 开源即时通讯平台 v0.0.5发布

webtim是即时通讯平台,提供丰富的通讯功能,除了基础通讯,同时实现多人实时音视频,视频直播等功能。im服务器为 Tim。前端使用tim的js客户端 timjs 调用tim服务器接口解析数据并渲染页面

donnie4w技术专栏 747

影音多媒体

影音多媒体 video元素(视频) <video controls="controls" width="500" height="300" src="" autoplay="autoplay" ></video> audio元素(音频) <audio controls="controls" src="" autoplay="autoplay"></aud...

uncle_Huang的博客 435

推荐开源项目:wfs.js - 轻量级WebGIS开发

推荐开源项目:wfs.js - 轻量级WebGIS开发 项目简介 是一个由ChihCheng Yang开发的小巧且高效的JavaScript,专门用于处理与WFS(Web Feature Service)接口的数据交互。WFS是一种开放标准,用于在Web上发布地理空间数据,而wfs.js则简化了开发者与其交互的过程。 技术分析 轻量化设计:wfs.js非常小,适合于性能敏感的应用场景。它的体...

gitblog_00035的博客 1020

基于WebSocket前端开发H.264流实现视频实时播放

基于WebSocket前端开发H.264流实现视频实时播放

yimelancholy的博客 2万+

wfs.js 使用教程

wfs.js 使用教程 项目地址:https://gitcode.com/gh_mirrors/wf/wfs.js 项目介绍 wfs.js 是一个用于实现低延迟 H.264 裸流播放JavaScript 。它通过 Websocket 接收视频流,并利用 HTML5 的 <video> 元素进行播放。该项目适用于需要实时视频流播放的场景,如监控系统、直播平台等。 项目快速启动 安装...

gitblog_00090的博客 1449
上一篇: mongodb-c-driver使用详解----windows环境
下一篇: RabbitMq的安装部署维护手册(windows)
MingoJiang
博客等级 码龄14年 160粉丝 41原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值