使用wfs.js库播放音视频

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

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});

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... 阅读详情

相关推荐

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

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

w1x2y3的博客 269

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的博客 811

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

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

weixin_29051811的博客 474

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

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

gitblog_00066的博客 962

wfs.js-master.zip

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

描边盛开火玫瑰

python描边盛开火玫瑰 代码如下 import turtle as t t.setup(800,800) t.hideturtle() t.speed(11) t.penup() t.goto(50,-450) t.pensize(5) t.pencolor("black") t.seth(140) t.pendown() t.speed(10) t.circle(-300,60) t.fd(100) #jiaodu80 #1ye t.seth(10) t.fd(50) t.fillcolor("gr

weixin_50973371的博客 2062

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

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

weixin_29334463的博客 2419

从URDF到仿真动画:基于Simulink、Simscape与S-Function的机械臂一体化建模与控制

本文详细介绍了从URDF文件到高保真仿真动画的一体化机械臂建模与控制流程。通过整合Simulink、Simscape与S-Function,构建了包含物理特性的虚拟机械臂模型,并实现了自适应滑模等高级控制算法的嵌入与验证。该流程打通了从机械设计到控制算法验证的闭环,为机器人开发提供了高效的仿真平台。

cnn8visionary的博客 696

H5播放H264之websocket

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

lixiang987654321的专栏 7284

电力电子新手必看:COT控制模式的工作原理与典型应用场景解析

本文深入解析了COT控制模式的工作原理及其在电力电子领域的典型应用。COT控制(恒定导通时间控制)通过固定导通时间机制,解决了传统滞环控制的问题,特别适用于需要快速瞬态响应和高效率的应用场景,如CPU/GPU供电和便携设备电源管理。文章详细介绍了COT控制的核心流程、技术特点及设计实践中的关键考量,帮助电力电子新手快速掌握这一技术。

weixin_30745553的博客 520

CS224W图神经网络实战:如何用Motifs和Graphlets分析社交网络结构?

本文基于斯坦福CS224W课程,深入探讨了如何利用网络模体(Motifs)和图元(Graphlets)分析社交网络的微观结构。通过实战代码演示,文章介绍了如何识别具有统计显著性的关键连接模式,计算节点的图元度向量以刻画局部拓扑特征,并将这些结构洞见应用于社区发现、影响力分析及图神经网络的节点特征工程,从而提升模型在虚假账号检测等任务中的性能。

2w3e4r5t6y的博客 909

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

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

lixiang987654321的专栏 3402

Unity插件——WebView内嵌网页/浏览器插件

一、相关插件: 1、Embedded Browser 插件(文件夹名ZFBrowserUnity) 2、UniWebView插件 3、UnityAndroidWebviewToTexture插件 4、3D WebView for Android插件 二、遇到的问题: 3D WebView显示问题 项目中使用3D WebView存在的问题 三、插件使用 Embedded Browser 加载页面的使用

青岚岁叶的博客 1万+

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 770

mapbox进阶,dem数据转为等高面,加载转换后的等高面到地图

本文详细介绍如何基于mapbox-gl v3.*.* 版本,使用dem数据转为等高面,加载转换后的等高面到地图,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 406

【docker】第10篇 Failed with result ‘exit-code和Start request repeated too quickly和Failed to start Docker

【docker】解决 Failed with result 'exit-code'和Start request repeated too quickly和Failed to start Docker。

Fanjufei的博客 6818

H5解码H264实时视频流

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

3万+

基于ESP32的智能停车场管理系统开发

智能停车场管理系统通过引入物联网(IoT)技术,实现对停车场内车辆的实时监控、空闲车位的管理、车辆的入场与出场控制等功能,大大提高了停车场的利用率和管理效率。通过集成物联网技术、云平台以及先进的传感器和执行器,系统不仅能实时监控停车场的车位状态,还能提供更好的用户体验。本文将介绍如何基于ESP32开发一个智能停车场管理系统,涵盖系统架构、硬件选择、软件开发以及最新技术的应用,帮助开发者实现高效的智能停车管理。ESP32的代码主要负责处理车位传感器的数据,控制LED指示灯的状态,以及与云平台进行数据交互。

2201_76125393的博客 910

html5 live stream

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

weixin_38170862的博客 595

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

donnie4w技术专栏 750

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

影音多媒体

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

uncle_Huang的博客 435

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

gitblog_00035的博客 1024

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值