学习flv.js
前言
flv.js一款使用纯 JavaScript 编写的 HTML5 Flash 视频 (FLV) 播放器,无需 Flash!!!flv.js 的工作原理是将 FLV 文件流转换为 ISO BMFF(碎片 MP4)片段,然后通过Media Source Extensions<video>API 将 mp4 片段输入 HTML5元素。
特点
- 具有 H.264 + AAC / MP3 编解码器播放功能的 FLV 容器
- 多部分分段视频播放
- HTTP FLV低延迟直播流播放
- 通过 WebSocket 播放 FLV 直播流
- 兼容 Chrome、FireFox、Safari 10、IE11 和 Edge
- 极低的开销,并由您的浏览器硬件加速!
安装
npm install --save flv.js
上手
<script src="flv.min.js"></script>
<video id="videoElement"></video>
<script>if (flvjs.isSupported()) {var videoElement = document.getElementById('videoElement');var flvPlayer = flvjs.createPlayer({type: 'flv',url: 'http://example.com/flv/video.flv'});flvPlayer.attachMediaElement(videoElement);flvPlayer.load();flvPlayer.play();}
</script>
创建播放器
function createPlayer(mediaDataSource: MediaDataSource, config?: Config): Player;
根据mediaDataSource中指示的类型字段创建播放器实例,配置可选.
MediaDataSource配置
| 字段 | 类型 | 描述 |
|---|---|---|
type | string | 表示媒体类型,'flv'或'mp4' |
isLive? | boolean | 指示数据源是否为直播流 |
cors? | boolean | 指示是否启用 CORS 以进行 http 获取 |
withCredentials? | boolean | 指示是否使用 cookie 进行 http 获取 |
hasAudio? | boolean | 指示该流是否有音轨 |
hasVideo? | boolean | 表示该流是否有视频轨道 |
duration? | number | 表示媒体总时长(以毫秒为单位) |
filesize? | number | 表示媒体文件的总文件大小(以字节为单位) |
url? | string | 表示媒体 URL,可以以'https(s)'或开头'ws(s)'(WebSocket) |
segments? | Array<MediaSegment> | 多部分播放的可选字段,请参阅MediaSegment |
*如果分段字段存在,transmuxer将把此MediaDataSource视为多部分源。
在多部分模式下,MediaDataSource结构中的持续时间文件大小url字段将被忽略。
MediaSegment配置
| 字段 | 类型 | 描述 |
|---|---|---|
duration | number | 必填字段,表示片段持续时间(以毫秒为单位) |
filesize? | number | 可选字段,表示段文件大小(以字节为单位) |
url | string | 必填字段,表示段文件URL |
Config配置
| 字段 | 类型 | 默认 | 描述 |
|---|---|---|---|
enableWorker? | boolean | false | 启用分离线程进行转路(目前不稳定) |
enableStashBuffer? | boolean | true | 启用 IO 存储缓冲区。如果您需要实时(最小延迟)直播流播放,请设置为 false,但如果网络抖动,可能会停滞。 |
stashInitialSize? | number | 384KB | 指示 IO 存储缓冲区的初始大小。默认值为384KB。指示合适的大小可以改善视频加载/寻道时间。 |
isLive? | boolean | false | 与MediaDataSourceisLive中的相同,如果已在 MediaDataSource 结构中设置,则忽略。 |
lazyLoad? | boolean | true | 如果有足够的数据可供播放,则中止 http 连接。 |
lazyLoadMaxDuration? | number | 3 * 60 | 指示要保留数据多少秒lazyLoad。 |
lazyLoadRecoverDuration? | number | 30 | 指示lazyLoad恢复时间边界(以秒为单位)。 |
deferLoadAfterSourceOpen? | boolean | true | 在 MediaSource 事件触发后进行加载sourceopen。在 Chrome 上,在后台打开的标签页可能不会触发sourceopen事件,直到切换到该标签页。 |
autoCleanupSourceBuffer | boolean | false | 自动清理 SourceBuffer |
autoCleanupMaxBackwardDuration | number | 3 * 60 | 当后向缓冲区持续时间超过此值(以秒为单位)时,自动清理 SourceBuffer |
autoCleanupMinBackwardDuration | number | 2 * 60 | 指示进行自动清理时为后向缓冲区保留的持续时间(以秒为单位)。 |
fixAudioTimestampGap | boolean | true | 当检测到较大的音频时间戳间隙时,填充静音音频帧以避免 a/v 不同步。 |
accurateSeek? | boolean | false | 精确搜索任意帧,不限于视频 IDR 帧,但速度可能稍慢。可在Chrome > 50、FireFox和上使用Safari。 |
seekType? | string | 'range' | 'range'使用范围请求来查找,或者'param'在url中添加params来指明请求范围。 |
seekParamStart? | string | 'bstart' | 表示搜索开始参数名称seekType = 'param' |
seekParamEnd? | string | 'bend' | 表示搜索结束参数名称seekType = 'param' |
rangeLoadZeroStart? | boolean | false | 如果使用范围搜索则发送Range: bytes=0-首次加载 |
customSeekHandler? | object | undefined | 表示自定义搜索处理程序 |
reuseRedirectedURL? | boolean | false | 重复使用 301/302 重定向 URL 进行后续请求,如搜索、重新连接等。 |
referrerPolicy? | string | no-referrer-when-downgrade | 指示使用 FetchStreamLoader 时的Referrer Policy |
headers? | object | undefined | 表示将添加到请求中的附加标头 |
function isSupported(): boolean;
// 如果基本播放可以在浏览器上运行,则返回true。
function getFeatureList(): FeatureList;
// 返回一个FeatureList对象,该对象具有以下详细信息:
| 字段 | 类型 | 描述 |
|---|---|---|
mseFlvPlayback | boolean | 与 相同flvjs.isSupported(),表示您的浏览器是否支持基本播放。 |
mseLiveFlvPlayback | boolean | 指示 HTTP FLV 直播流是否可以在您的浏览器上运行。 |
networkStreamIO | boolean | 指示网络加载器是否正在流式传输。 |
networkLoaderName | string | 表示网络加载器类型名称。 |
nativeMP4H264Playback | boolean | 指示您的浏览器是否原生支持 H.264 MP4 视频文件。 |
nativeWebmVP8Playback | boolean | 指示您的浏览器是否原生支持 WebM VP8 视频文件。 |
nativeWebmVP9Playback | boolean | 指示您的浏览器是否原生支持 WebM VP9 视频文件。 |
interface FlvPlayer extends Player {}
// 实现该Player接口的FLV播放器,可由操作人员直接创建new。
interface NativePlayer extends Player {}
// 不带 MediaSource src 的浏览器原生播放器 (HTMLVideoElement) 的播放器包装器,可实现接口Player。适用于单部分MP4文件播放。
// player
interface Player {constructor(mediaDataSource: MediaDataSource, config?: Config): Player;destroy(): void;on(event: string, listener: Function): void;off(event: string, listener: Function): void;attachMediaElement(mediaElement: HTMLMediaElement): void;detachMediaElement(): void;load(): void;unload(): void;play(): Promise<void>;pause(): void;type: string;buffered: TimeRanges;duration: number;volume: number;muted: boolean;currentTime: number;mediaInfo: Object;statisticsInfo: Object;
}
flv事件
| 事件 | 描述 |
|---|---|
| ERROR | 播放过程中因任何原因发生错误 |
| LOADING_COMPLETE | 输入的 MediaDataSource 已完全缓冲至结束 |
| RECOVERED_EARLY_EOF | 缓冲期间发生意外的网络 EOF,但已自动恢复 |
| MEDIA_INFO | 提供媒体的技术信息,如视频/音频编解码器、比特率等。 |
| METADATA_ARRIVED | 使用“onMetaData”标记提供 FLV 文件(流)可以包含的元数据。 |
| SCRIPTDATA_ARRIVED | 提供 FLV 文件(流)可包含的脚本数据(OnCuePoint / OnTextData)。 |
| STATISTICS_INFO | 提供播放统计信息,例如丢帧、当前速度等。 |
flvjs.错误类型
播放期间可能出现的错误。它们需要前缀flvjs.ErrorTypes。
| 错误 | 描述 |
|---|---|
| NETWORK_ERROR | 与网络相关的错误 |
| MEDIA_ERROR | 与媒体相关的错误(格式错误、解码问题等) |
| OTHER_ERROR | 任何其他未指定的错误 |
flvjs.错误详细信息
为网络和媒体错误提供更详细的解释。它们需要前缀flvjs.ErrorDetails。
| 错误 | 描述 |
|---|---|
| NETWORK_EXCEPTION | 与网络的任何其他问题相关;包含message |
| NETWORK_STATUS_CODE_INVALID | 与无效的 HTTP 状态代码相关,例如 403、404 等。 |
| NETWORK_TIMEOUT | 与超时请求问题相关 |
| NETWORK_UNRECOVERABLE_EARLY_EOF | 与无法恢复的意外网络 EOF 相关 |
| MEDIA_MSE_ERROR | 与 MediaSource 的错误(如解码问题)相关 |
| MEDIA_FORMAT_ERROR | 与媒体流中的任何无效参数相关 |
| MEDIA_FORMAT_UNSUPPORTED | flv.js 不支持输入的 MediaDataSource 格式 |
| MEDIA_CODEC_UNSUPPORTED | 媒体流包含不受支持的视频/音频编解码器 |
相关文章:
学习flv.js
前言 flv.js一款使用纯 JavaScript 编写的 HTML5 Flash 视频 (FLV) 播放器,无需 Flash!!!flv.js 的工作原理是将 FLV 文件流转换为 ISO BMFF(碎片 MP4)片段,然后通过Media Source Extensions&l…...
FreePBX 17 on ubuntu24 with Asterisk 20
版本配置: FreePBX 17(最新) Asterisk 20(最新Asterisk 22,但是FreePBX 17最新只支持Asterisk 21,但是21非LTS版本,所以选择Asterisk 20) PHP 8.2 Maria DB (v10.11) Node J…...
【算法】算法大纲
这篇文章介绍计算机算法的各个思维模式。 包括 计数原理、数组、树型结构、链表递归栈、查找排序、管窥算法、图论、贪心法和动态规划、以及概率论:概率分治和机器学习。没有办法逐个说明,算法本身错综复杂,不同的算法对应着不同的实用场景,也需要根据具体情况设计与调整。…...
【MySQL】SQL菜鸟教程(一)
1.常见命令 1.1 总览 命令作用SELECT从数据库中提取数据UPDATE更新数据库中的数据DELETE从数据库中删除数据INSERT INTO向数据库中插入新数据CREATE DATABASE创建新数据库ALTER DATABASE修改数据库CREATE TABLE创建新表ALTER TABLE变更数据表DROP TABLE删除表CREATE INDEX创建…...
安装本地测试安装apache-doris
一、安装前规划 我的服务器是三台麒麟服务器,2台跑不起来,这是我本地的,内存分配的也不多。 fe192.168.1.13 主数据库端口9030访问 8Gbe192.168.1.13内存4G 硬盘50be192.168.1.14内存4G 硬盘50be192.168.1.12内存4G 硬盘5013同时安装的fe和be 。 原理:192.168.1.13 服…...
【Apache Paimon】-- 13 -- 利用 paimon-flink-action 同步 mysql 表数据
利用 Paimon Schema Evolution 核心特性同步变更的 mysql 表结构和数据 1、背景信息 在Paimon 诞生以前,若 mysql/pg 等数据源的表结构发生变化时,我们有几种处理方式 (1)人工通知(比如常规的使用邮件),然后运维人员手动同步到数据仓库中 (2)使用 flink 消费 DDL bi…...
IOS HTTPS代理抓包工具使用教程
打开抓包软件 在设备列表中选择要抓包的 设备,然后选择功能区域中的 HTTPS代理抓包。根据弹出的提示按照配置文件和设置手机代理。如果是本机则会自动配置,只需要按照提醒操作即可。 iOS 抓包准备 通过 USB 将 iOS 设备连接到电脑,设备需解…...
在 Ubuntu 22.04 上从 Wayland 切换到 X11的详细步骤
在 Ubuntu 22.04 上从 Wayland 切换到 X11,步骤其实很简单,主要是在登录界面进行选择。以下是详细的步骤: 步骤 1:退出当前会话 首先,点击屏幕右上角的用户菜单,选择 注销 或 退出,以退出当前…...
【Linux】4.Linux常见指令以及权限理解(2)
文章目录 3. Linux指令3.1 ls指令和rm指令补充3.2 man指令(重要)3.3cp指令(重要)输出重定向3.3.1ubuntu20.04如何安装tree 3.4 mv指令(重要)mv指令更改文件名mv指令更改目录名 如何看待指令指令的重命名3.5…...
ffmpeg aac s16 encode_audio.c
用ffmpeg库时,用代码对pcm内容采用aac编码进行压缩,出现如下错误。 [aac 000002bc5edc6e40] Format aac detected only with low score of 1, misdetection possible! [aac 000002bc5edc8140] Error decoding AAC frame header. [aac 000002bc5edc81…...
vue3监听器
1.侦听数据源类型 watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组 const x ref(0) const y ref(0)// 单个 ref watch(x, (newX) > {console.log(x is ${newX}) …...
03-51单片机定时器和串口通信
一、51单片机定时器 1.定时器介绍 1.1为什么要使用定时器 在前面的学习中,用到了 Delay 函数延时,这里学习定时器以后,就可以通过定时器来完成,当然定时器的功能远不止这些: 51 单片机的定时器既可以定时ÿ…...
系统架构设计师考点—项目管理
一、备考指南 项目管理主要考查的是进度管理、软件配置管理、质量管理、风险管理等相关知识,近几年都没有考查过,但是有可能在案例分析中考查关键路径的技术问题,考生了解为主。 二、重点考点 1、项目的十大管理(速记࿱…...
代码随想录算法训练营第三十二天|509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
目录 509.斐波那契数 动态规划五部曲: 1.确定dp数组(dp table)以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 70.爬楼梯 动态规划五部曲: 1.确定dp数组(dp table)…...
【2024年华为OD机试】 (A卷,100分)- 总最快检测效率(Java JS PythonC/C++)
一、问题描述 题目描述 在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。 每名采样员的效率不同,采样效率为 N 人/小时。由于外界变化,采样员的效率会以 M 人/小时为粒度发生变化,M 为采样效率浮动粒度…...
【大数据】Apache Superset:可视化开源架构
Apache Superset是什么 Apache Superset 是一个开源的现代化数据可视化和数据探索平台,主要用于帮助用户以交互式的方式分析和展示数据。有不少丰富的可视化组件,可以将数据从多种数据源(如 SQL 数据库、数据仓库、NoSQL 数据库等࿰…...
LabVIEW调用不定长数组 DLL数组
在使用 LabVIEW 调用 DLL 库函数时,如果函数中的结构体包含不定长数组,直接通过 调用库函数节点(Call Library Function Node) 调用通常会遇到问题。这是因为 LabVIEW 需要与 DLL 中的数据结构完全匹配,而包含不定长数…...
MySQL 17 章——触发器
在实际开发中,我们经常会遇到这样的情况:有2个或者多个相关联的表,比如商品信息表和库存信息表,分别存放在两个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时在…...
面向对象分析与设计Python版 面向对象设计方法
文章目录 前言一、职责驱动设计二、职责驱动设计-案例 前言 面向对象设计目标:在面向对象分析建立的领域模型的基础上,定义对象操作(职责)。为对象分配职责的方法有: 职责驱动设计遵循GRASP设计原则(Gene…...
GB/T 19582.1-2008主要内容
标准背景与概述 GB/T 19582.1-2008是由中国国家标准化管理委员会发布的国家标准,旨在指导和规范基于Modbus协议的工业自动化网络的设计和实施。该标准由全国工业过程测量控制和自动化标准化技术委员会(TC124)归口,并由中国机械工…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
