几种前端h264播放器记录

2023-11-05

近期做了点工作记录一下。主要是将H264流在html5上进行播放。众所周知,大多数的 video组件都是支持FLV或者MP4以及m3u8格式的,而如果是WebRTC是直接集成好了。本次要求的环境主要是通过Websocket方式进行流传输,不是RMTP也不是RTSP,所以最好的方式是能够直接在前端页面上进行播放。其中应该要包含H264的软解码或者硬解码。

下面介绍几种可以直接播放H264的播放器:

1. Broadway.js

该项目的说明是将Android的H264解码器通过Emscripten编译成WebGL可用的解码器,并且进行了优化。这个库也是许多后续库的基础,相对而言是一个非常好用的解码器库。

缺点:只支持Baseline格式的H264数据流,如果是其他格式的数据流则无法解析。

额外内容:h264 分为几种,一种为baseline,一种为main,一种为pro。如果一定要使用这个库的话必须要将视频流转为baseline流。

2. h264-live-player

该播放器可以直接结合Websocket播放h264流,并且还能够处理丢帧的问题。号称是一个实时播放器。在项目提供的四种Demo中的使用方法也是非常简单使用的。

缺点:问题同Broadway.js一样,因为这个项目基于Broadway.js实现的,因此存在的问题也一样,无法解析baseline以外的h264流。

3.wfs.js

这个播放器跟前两个对比就没有那么大的知名度的,在github上面也只有200星左右。根据说明来看是直接在标准 HTML5 元素和 MediaSource 扩展之上进行的工作,将 H264 NAL 单元转换为 ISO BMFF (MP4) 片段。这个库的实时性达到了我的要求,对于H264的其他流也能够进行解码,而且还有许多人对此进行各种修改来降低延迟,总之是个挺好用的库。

缺点:针对视频尺寸变化无法及时响应(比如横竖屏切换)。如果需要很好地工作需要自己改源码。

4. JMuxer

jMuxer是一个简单的mp4多路复用器,适用于浏览器和节点环境。借助媒体源扩展在浏览器上播放媒体文件。 它还可以在节点环境中导出 mp4。 输入的视频数据应该为原始 H264 视频数据和/或 AAC 音频数据。

这个库提供了一个demo,可以先将h264视频流保存成264/h264文件,先尝试一下能不能播放再选择是否可以使用。

demo: Online h264 player using jMuxer

缺点:实时性可能不够,当我将视频流传入库中解码的时候,依旧会有些许延迟。但是好的地方在于比起wfs.js能够适应横竖屏的切换。

5.H264-converter

这是一个TypeScripts写成的解码库,对于TypeScript阅读麻烦的可以直接看编译后的Js代码。这个库既可以识别横竖屏和分辨率切换的数据流,又具有比较高的实时性。但是由于是ts语言写的,使用方法Demo以及其他的使用资料都比较少,使用起来可能会出现问题。(具体在于参数配置上一定要和获取的视频流一致)

缺点:易读性较差,参数配置需要配置一致才能正常播放。使用方法以及文档太少。

6. ffmpeg

这个方式不是一种推荐的方式。总所周知,在视频领域通常绕不过FFmpeg这个库。这边具体的方式可以将FFmpeg编译成ffmpeg.js,通过调用C函数解码成FLV或者其他的格式,再使用FLV.JS或者Video甚至Canvas显示。

(1). ffmpeg编译成js并显示

这个方法是将编译好的ffmpeg编译成js再使用canvas直接绘制倒UI上。可以参考。编译麻烦的也可以直接在github上搜索ffmpeg.js文件可以直接跳过这一过程。

(2)使用已经编译好的ffmpeg库

这个方法使用的是ffmpeg-fluent库将h264流解码成flv流,搭配bilibili开源的flv.js库播放。这边需要对ffmpeg的命令行稍作了解,由于在js中并不存在binarystreamer这种组件,所以大多数的工程中主要使用Pipe的方式将文件流替换为视频流。除了ffmpeg-fluent库以外也可以使用libav库达到同样的效果,不过libav库的说明文档较少。

(3)在后台使用ffmpeg.exe

为了减少前端计算性能的消耗保证实时性,可以直接在后端使用ffmpeg.exe进行转码,这边借鉴了Facebook的一个用法。不过笔者在具体使用的过程中发现ffmpeg初次启动进行解码会有比较大的延迟。比起前面几种虽然理论上降低web的负担,实际上并没有特别好的效果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

几种前端h264播放器记录 的相关文章

  • 如何强制折断不可折断的字符串?

    我有一个根据数据库中包含的数据生成的 HTML 页面 数据库有时包含浏览器无法分解的长字符串 因为这些字符串不包含可分解的字符 空格 点 逗号等 有没有办法使用 html css 甚至 javascript 来解决这个问题 看到这个link
  • 如何在php中使用一张图像绘制形状

    我需要使用图像的一部分来创建帧图像 例如 用户将从后端上传图像片段 现在我需要根据前端用户的要求在前端创建一个框架 用户将选择框架的高度和宽度 然后他将选择该图像片段 如下所示 我没有办法做到这一点 我尝试通过 css 和 html can
  • 可以使用带有 HTML5 播放器的 Amazon S3/CloudFront 流式传输视频吗?

    我想使用 HTML5 视频播放器并流式传输视频 S3 CloudFront 可以实现这一点吗 我了解 Amazon 使用 RTMP 流媒体协议和 HTML5video标签不支持 RTMP 有没有办法用 HTML5 播放器播放视频 Wayne
  • 使用 :hover 作为元素的内联样式(使用 HTML/CSS/php)[重复]

    这个问题在这里已经有答案了 可能的重复 如何将 a hover 规则嵌入到文档中间的样式属性中 https stackoverflow com questions 131653 how do i embed an ahover rule i
  • 将输入中每个单词的第一个字符设为大写

    我想知道如何在输入区域自动生成单词的第一个字符 目前我的代码是 Name
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • Javascript 播放声音性能重吗?

    我正在用 Javascript 制作一个简单的游戏 当一个物体与墙壁碰撞时 它会发出 砰 的声音 声音的响度取决于物体的速度 速度越高 gt 声音越大 播放功能 playSound function id vol ID of the sou
  • 如何倾斜 div 并保持背景图像不倾斜

    我已经花了几个小时了 所以希望有人能提供帮助 我有一个网站 其中大部分 div 都是倾斜的 大多数 div 都包含背景图像 现在我已经让 div 倾斜了 内容完美地位于其中 唯一的问题是背景图像 它与父级一起倾斜 我用谷歌搜索了很多 但找不
  • 调整文本区域大小

    我需要使用文本区域来显示一些文本 问题是 如果我放置 4 5 行文本 就会出现滚动条 如何使用 CSS HTML 使文本区域与其内容一样大 没有滚动条 文本区域不需要动态更改其大小 我仅使用它来显示文本 我也可以使用禁用的文本区域 我希望文
  • 如何使用 a-href 标签链接回文件夹? [复制]

    这个问题在这里已经有答案了 好吧 我在文件夹中有一个页面 该页面称为 jobs html 该文件夹简称为 jobs 它是我的 网站 文件夹的子文件夹 在 main 文件夹的主目录中是我的 home html 文件 当我尝试做的时候 a hr
  • Modernizr - 加载 polyfills / 使用自定义检测的正确方法

    我想在网页上使用一些新的 HTML5 表单属性和输入类型 有些浏览器已经支持它们 有些浏览器不支持 也永远不会支持 这就是我想使用 Modernizr 的原因 这就是我的麻烦开始的原因 据我了解 Modernizr 本身并不是一个 poly
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • 如何将此 HTML 表格布局解决方案转换为浮动 div 解决方案?

    我经常需要列出各种尺寸的项目images在左边和text在右边 像这样 替代文本 http www deviantsart com upload 7s01l5 png http www deviantsart com upload 7s01
  • 按百分比设置 bootstrap 模态身高

    我正在尝试制作一个带有主体的模态 当内容变得太大时 该主体会滚动 但是 我希望模式能够响应屏幕尺寸 当我将最大高度设置为 40 时 它没有任何效果 但是 如果我将最大高度设置为 400px 它会按预期工作 但不会响应 我确信我只是错过了一些
  • iOS7 中“-webkit-overflow-scrolling: touch” 最初的屏幕外元素被破坏

    既然转基因种子已经发布了 我们现在可以谈谈了 看起来 iOS7 中的 webkit overflow scrolling touch 已损坏 最初不在屏幕上的元素的触摸事件不会触发 或者在某些情况下只是不可靠 这是一个例子
  • JavaScript 中数组的 HTML 数据列表值

    我有一个简单的程序 它必须从服务器上的文本文件中获取值 然后将数据列表填充为输入文本字段中的选择 为此 我想要采取的第一步是我想知道如何动态地将 JavaScript 数组用作数据列表选项 我的代码是
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • 为什么“tbody”不设置表格的背景颜色?

    我在用 tbody 作为 CSS 选择器来设置background color在一个表中 我这样做是因为我有多个 tbody 表内的部分 它们具有不同的背景颜色 我的问题是 当使用border radius在细胞上 细胞不尊重backgro
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas

随机推荐

  • 系统提示0x00000709错误怎么办?

    一般都是系统自动更新补丁造成的 系统更新出现大面积打印机造成电脑蓝屏的问题还没解决多久 又出现了更新系统造成打印机无法共享 现在的系统都不带测试就推送的吗 所以我一般强烈建议大家不要更新系统 更新系统就是个定时炸弹 随时可能让你的系统爆炸
  • 链式栈的创建以及各种操作

    目录 一 声明 二 链式栈的初始化和各种操作 2 1 链栈结构定义 2 2 初始化和进栈操作 2 3 进栈结果展示 编辑 2 4 出栈操作 2 5 出栈结果展示 2 6 遍历操作 2 7 遍历结果展示 编辑 2 8 获取栈顶元素 2 9 结
  • JS对象

    前言 回顾之前的七种数据类型 number string bool symbol null undefined object 五个falsy值 null undefined 0 NaN 空字符串 对象的概念 定义 无序的数据集合 键值对的集
  • openstack之neutron Local网络

    openstack之neutron Local网络 一 local网络介绍 二 修改neutron的相关配置文件 1 进入配置文件目录 2 备份配置文件 3 修改配置文件 三 重启服务 四 管理员创建local网络 1 创建网络 2 创建子
  • 机器学习西瓜书吃瓜笔记之(一)深入理解线性模型与logistics回归

    入门概念 机器学习两大基本问题 预期的输出是离散还是连续 回归问题 用多个变量拟合出一个连续值 分类问题 用多个变量拟合出一个离散值 机器学习三大理论 确定研究手段 传统监督学习 血糖预测 有无糖尿病预测 深度学习 自然语言处理 计算机视觉
  • hosts文件的作用以及hosts中多个ip映射一个域名地址的解析顺序

    hosts的作用 当我们访问网站时 要首先通过DNS服务器把网络域名 www xx com 解析成IP地址 我们的计算机才能访问 如果对于每个域名请求我们都要等待域名服务器解析后返回IP信息 这样访问网络的效率就会降低 而Hosts文件就能
  • 什么是copyonwrite容器

    开发十年 就只剩下这套Java开发体系了 gt gt gt CopyOnWrite容器即写时复制的容器 通俗的理解是当往一个容器添加元素的时候 不直接往当前容器添加 而是先将当前容器进行Copy 复制出一个新的容器 然后新的容器里添加元素
  • STK的2D二维采用的投影方式及osgEarth实现

    Spherical or Equirectangular projection 等距圆柱投影 球面投影 The equirectangular projection also called the equidistant cylindric
  • 【tkinter学习笔记 - 2】:Entry的使用、Button按钮的使用

    目录 一 Entry单行文本框 代码演示 Button按钮的使用 代码演示 一 Entry单行文本框 Entry用来接收一行字符串的控件 如果用户输入的文字长度长于 Entry 控件的宽度时 文字会自动向后滚动 如果想输入多行文本 需要使用
  • linux系统centos7使用 locate命令 查找文件

    百度找到都是whereis find这种 有时候搜不出来 发现locate非常好用
  • uni-app 设置APP应用跳转到系统设置页

    打开蓝牙设置 var main plus android runtimeMainActivity var Intent plus android importClass android content Intent var mIntent
  • Springboot整合Shiro实现登录认证

    一 概述 Shiro 是一个功能强大且易于使用的轻量级Java安全框架 包括身份验证 授权 加密及会话管理 使用Shiro易于理解的API 可以轻松地保护任何应用程序 二 Shiro主要组成 1 首先主要包括三大实体 Subject Rea
  • 优秀的测试工程师应该具备哪些素质

    人是测试工作中最有价值也是最重要的资源 只有保证测试工程师良好的素质 才能保证测试 产品的质量 然而 在有些公司让那些没有应聘上开发职位的人来做测试 这绝对是错误的 最终会损害企业 为高质高效地完成测试任务 软件测试工程师应具有很好的素质和
  • echarts设置y轴值间隔

    在标签yAxis 中 设置min max splitNumber 例如 min 0 max 1 splitNumber 10 呈现
  • 暴力破解漏洞

    0x01 漏洞描述 暴力破解漏洞 暴力破解的产生是由于服务器端没有做合理的限制 导致攻击者可以通过暴力的手段破解所需信息 如用户名 密码 验证码等 暴力破解的关键在于字典的大小 暴力破解需要一个庞大的字典 如4位数字的验证码 那么暴力破解的
  • MDK软件不能模拟仿真STM32F407的问题解决方法

    以下转载文章有点多 如有侵权请联系我删除哦 https blog csdn net weixin 49093913 article details 125362111 关于Keil MDK 5 仿真STM32F4报错no read perm
  • extjs html 指向网页,extjs-mvc结构实践(二):基本页面

    接着来 上一篇搭建了基本的项目骨架 到最后 其实啥也没看见 书接上回 开始写UI效果 目标 全屏显示 左侧导航菜单 右侧标签页切换操作内容区域 包含header和footer 导航菜单动态ajax产生 点击对应菜单可以动态加载js资源或者数
  • 基于小程序+SpringBoot制作一个音乐播放器

    此文主要实现在小程序内音乐播放功能 使用Java作为后端语言进行支持 界面友好 开发简单 一 小程序 1 1 项目创建 1 2 首页 轮播图 热门歌曲 iconfont图标引入 1 3 热门歌单 歌单首页 歌单详情 歌曲详情 1 4 个人中
  • 一些会导致Bundle安装失败的原因

    Bundle RequiredExecutionEnvironment中的值和可用的执行环境不符 缺少Bundle SymbolicName 重复的导入同一个package 导出或导入java 导出的package中必须的属性未定义 安装一
  • 几种前端h264播放器记录

    近期做了点工作记录一下 主要是将H264流在html5上进行播放 众所周知 大多数的 video组件都是支持FLV或者MP4以及m3u8格式的 而如果是WebRTC是直接集成好了 本次要求的环境主要是通过Websocket方式进行流传输 不