前端从视频文件提取画面帧

extractFramesFromVideo方法提取画面帧

// 设定一个异步函数,输入参数为:
// videoUrl(需要提取画面帧的视频的URL)
// fps(每秒帧率,默认为25帧)
async function extractFramesFromVideo(videoUrl, fps = 25) {// 我们使用 Promise 将该函数设置为异步操作return new Promise(async (resolve) => {// 使用 fetch 函数从视频URL获取数据,并将其转换为 Blob 对象let videoBlob = await fetch(videoUrl).then((r) => r.blob());// 创建一个对应 Blob 对象的 URLlet videoObjectUrl = URL.createObjectURL(videoBlob);// 创建一个 HTML video 的新实例let video = document.createElement("video");// 定义一个新变量,在后面的 "seeked" 事件中赋值let seekResolve;// 当 "seeked" 事件触发,我们确认视频已经被加载到了特定的时间点video.addEventListener("seeked", async function () {if (seekResolve) seekResolve();  // 执行我们的 Promise 结束指令});// 将我们的视频 URL 设置为创建的 video 对象video.src = videoObjectUrl;// 我们等待视频加载,一旦加载成功,则能获取到视频的长度信息while ((video.duration === Infinity || isNaN(video.duration)) && 
video.readyState < 2) {await new Promise((r) => setTimeout(r, 1000));  // 等待 1000msvideo.currentTime = 10000000 * Math.random();  // 用一个随机的时间进行跳跃}// 获取视频长度let duration = video.duration;// 创建 canvas 对象和 2d 上下文进行画面帧的绘制let canvas = document.createElement("canvas");let context = canvas.getContext("2d");let [w, h] = [video.videoWidth, video.videoHeight];  // 获取视频的宽度和高度canvas.width = w;canvas.height = h;// 初始化一个数组用于存放提取出来的帧的数据let frames = [];let interval = 1 / fps;  // 根据帧率(fps)计算间隔时间let currentTime = 0;  // 初始化当前的播放时间// 从视频开始提取画面帧,直到视频的末尾while (currentTime < duration) {video.currentTime = currentTime;  // 设置视频的当前播放时间await new Promise((r) => (seekResolve = r));  // 等待 "seeked" 事件完毕context.drawImage(video, 0, 0, w, h);  // 将当前画面帧绘制到 canvas 上let base64ImageData = canvas.toDataURL();  // 获取绘制的图片数据frames.push(base64ImageData);  // 将提取的画面帧加入到 frames 数组中currentTime += interval;  // 将当前时间增加一个间隔时间}// 返回所有提取的画面帧resolve(frames);});
}

调用方式将视频URL作为参数传递给该函数:

let frames = await extractFramesFromVideo(‘http://example.com/example.mp4’, 25);

在这里,‘http://example.com/example.mp4’ 是视频的 URL,25 是你希望每秒提取的帧数。函数将返回一个数组,其中包含了一系列从视频中提取的画面帧(以 base64 编码的图片形式)。

WebCodecs API 提取视频帧

…WebCodecs API 提取视频帧的过程相对较复杂,包括以下步骤:

  1. 解析容器文件到单独的编码视频和/或音频块:这个步骤需要将文件(例如 .mp4 文件)解析到单独的编码视频和/或音频块。

  2. 解码编码的视频/音频块:WebCodecs 仅仅方便了这个过程中的解码步骤。你需要自己实现解析/处理容器文件的过程。

在这个过程中, MP4Box它能帮你获取编码的视频和音频块,然后你可以将这些块输入到 VideoDecoder 或 AudioDecoder。

使用 MP4Box,你的代码可能会围绕 onSamples 回调实现,大概如下所示:

mp4BoxFile.onSamples = (trackId, user, chunks) => {for (let i = 0; i < chunks.length; i++) {let chunk = chunks[i];let encodedChunk = new EncodedVideoChunk({// you'll need to deep-inspect chunk to figure these outtype: "key", // or "delta"timestamp: ...,duration: ...,data: chunk.data});// pass encodedChunk to a VideoDecoder instance's decode method}
};

以上是利用 WebCodecs API 提取视频帧的大体步骤,对于具体的应用细节可能需要根据你的具体需求进行调整。

mp4BoxFile是使用了MP4Box.js库的一个示例。MP4Box.js 是一个 JavaScript 库,用于处理 MP4 文件,特别是在浏览器端。

这个库提供了一个MP4Box类,你可以用new MP4Box.createFile()来创建一个mp4BoxFile。然后,你可以添加自定义的回调,例如 onReady 和 onSamples,然后向对象提供ArrayBuffer类型的数据。这个库支持逐步解析文件,所以你可以一边下载文件一边进行解析。

例如:

var mp4boxfile = MP4Box.createFile();mp4boxfile.onReady = info => {// do something when file is ready
};mp4boxfile.onSamples = (trackId, user, samples) => {// do something with samples
};// append data
mp4boxfile.appendBuffer(someArrayBufferData);

这个库可以帮助你从 MP4 文件中提取出音频和视频块,然后你可以将这些编码的块传递给 VideoDecoder 或者 AudioDecoder。

以上就是文章全部内容了,如果喜欢这篇文章的话,还希望三连支持一下,感谢!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中MySQL的相关配置及命令(Ubuntu22.04)

安装 MySQL apt install mysql-server apt install mysql-client相关配置文件 默认配置文件地址: /etc/mysql/mysql.conf.d 基础配置如下 # 基础配置 [mysqld] # # * Basic Settings # user mysql pid-file /var/run/mysqld/mysqld.pid socket /var/run/mysqld/mysqld.…

uni-app地图组件控制

uni.createMapContext(mapId,this) 创建并返回 map 上下文 mapContext 对象。在自定义组件下&#xff0c;第二个参数传入组件实例this&#xff0c;以操作组件内 <map> 组件。 注意&#xff1a;uni.createMapContext(mapId, this) app-nvue 平台 2.2.5 支持 uni.create…

DataWorks Copilot:大模型时代数据开发的新范式

导读 DataWorks 是阿里云一站式智能化数据开发与治理平台&#xff0c;支持搭配MaxCompute/Hologres/AnalyticDB/StarRocks/EMR/CDH 等大数据引擎&#xff0c;为企业构建数据仓库、数据湖以及湖仓一体&#xff08;Lakehouse&#xff09;现代数据架构提供数据平台产品解决方案。…

推荐一款功能强大的显示器!

最近在写项目开发文档&#xff0c;经常需要几个界面来回切换&#xff0c;真的深刻感受到了一台外接显示器对一名程序员来说有多重要了&#xff0c;画功能流程图的时候嫌弃自己的笔记本屏幕不够大&#xff0c;看代码的时候又在想要是有个旋转屏就好了&#xff0c;来回切换界面的…

C实时导航

导航算法怎么改成实时的&#xff1f; 将导航算法改为实时运行需要考虑几个关键因素&#xff0c;包括数据源的实时性、算法的计算效率、以及与外部硬件&#xff08;如传感器、执行器等&#xff09;的实时交互。由于MATLAB不是用于实时系统的首选工具&#xff08;尽管它有一些实时…

【JavaScript复习二】选择结构if和Switch(1)

### []( )2、单分支条件分支语句if (条件表达式) { // 条件为真时&#xff0c;做的事情 } else { // 条件为假时&#xff0c;做的事情 } ### []( )2,、多分支的 if 语句if (条件表达式1) { // 条件1为真时&#xff0c;做的事情} else if (条件表达式2) { // 条件1不满足&…

使用Selenium进行Web自动化:详细操作指南

使用Selenium进行Web自动化:详细操作指南 引言 Selenium是一个广泛使用的开源工具,用于自动化Web浏览器的操作。无论你是进行自动化测试,还是需要抓取网页数据,Selenium都是一个非常有用的工具。本文将详细介绍Selenium的一些常见用法,包括输入框设置值、文件上传、单选…

java基础·小白入门(四)

目录 异常处理基本概念处理过程 Java泛型与容器类泛型容器类 异常处理 基本概念 异常&#xff08;exception&#xff09;&#xff1a;是指在硬件和操作系统正常时&#xff0c;程序遇到的运行错误。如数组下标越界、除数为0、用户输入非法、打开一个不存在的文件、网络连接中断…

Java中的数据结构与算法优化攻略

Java中的数据结构与算法优化攻略 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java应用开发中&#xff0c;数据结构与算法的选择和优化对于提高程序的性能…

【杂记-浅谈Time To Live/TTL】

文章目录 一、TTL概述二、TTL在IP数据包中的应用三、TTL在DNS系统中的应用四、TTL的其他应用 一、TTL概述 Time To Live&#xff0c;TTL&#xff0c;主要有两个含义&#xff1a;一个是作为IP数据包中的一个字段&#xff0c;另一个是与DNS记录相关的存活时间。 1、在IP数据包中…

java分别使用 iText 7 库和iText 5 库 将excel转成PDF导出,以及如何对excel转PDF合并单元格

第一种 package com.junfun.pms.report.util;import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.property.TextAlignment; import com.itextpdf.layout.prop…

kafka学习笔记07

Kafka高可用集群搭建节点需求规划 开放端口。 Kafka高可用集群之zookeeper集群搭建环境准备 删除之前的kafka和zookeeper。 重新进行环境部署&#xff1a; 我们解压我们的zookeeper: 编辑第一个zookeeper的配置文件: 我们重复类似的操作&#xff0c;创建三个zookeeper节点: 记…

SM4 国密——加密,解密

SM4 国密的使用 前言——引用管理包SM4解密——ECB模式SM4加密——ECB模式SM4解密——CBC模式SM4加密——CBC模式SM4工具类SM4主体类SM4实体类 前言——引用管理包 引用NuGet管理包BouncyCastle.Crypto SM4解密——ECB模式 public string CiphertextParsing(string json) {tr…

【数学建模】解析几何与方程模型

文章目录 解析几何与方程模型1.几何建模思想2.Numpy在线性代数中的使用3.国赛求解3.1题目3.2 问题1求解建立模型代码求解 3.3 问题2求解 4.问题答疑Q1:什么是行列式&#xff0c;其使用场景是什么行列式的定义行列式的性质行列式的使用场景 Q2:2023B题问题一用相似三角形求解覆盖…

使用rkhunter Rootkit猎手检查Rootkit:全面指南

在网络安全领域&#xff0c;Rootkit是一种隐蔽性极强的恶意软件&#xff0c;它能够隐藏攻击者的痕迹和未授权访问路径。Linux系统因其开放性和复杂性&#xff0c;容易受到Rootkit的攻击。rkhunter&#xff0c;即Rootkit Hunter&#xff0c;是一款专门设计来检测Linux系统中Root…

centos查找文件 及 操作写入的进程

du -sh * 查看目录空间占用、发现大文件&#xff0c;确定进程&#xff0c;结束 yum install lsof 安装lsof 查看文件写入的 进程 2. lsof /root/.influxdbv2/engine/data/bab49411e5f7cbce/autogen/1/000000036-000000002.tsm COMMAND PID USER FD TYPE …

sql server 非sa账号配置发布订阅

如果有些源端环境&#xff0c;sa账号被禁用&#xff0c;或者有其他问题&#xff0c;那可以按以下步骤操作。 使用高权限账户登录&#xff0c;另外需要拥有源端windows用户管理员的账号和密码 表发布订阅成功的前提&#xff1a;发布的表必须有主键。 创建一个专门用于发布订阅的…

国际导师上海面授大规模敏捷LeSS认证2024年8月22-24日开班 | 报名享特大福利

课堂互动练习 学员反馈 • “LeSS课我正经听过的有3次&#xff1b;两次Bas Vodde主讲&#xff0c;一次吕毅老师主讲。第一次应该是2015年&#xff0c;这门课中体现的对组织运作和产品开发底层逻辑的洞见令我折服。后来又陆续听了两次&#xff0c;每次都有更多体会。 我试着从一…

【递归、搜索与回溯】综合练习四

综合练习四 1.单词搜索2.黄金矿工3.不同路径 III 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.单词搜索 题目链接&#xff1a;79. 单词搜…

杨辉三角的快速求法

一、杨辉三角形 杨辉三角形&#xff0c;又称贾宪三角形&#xff0c;帕斯卡三角形&#xff0c;是二项式系数在三角形中的一种几何排列&#xff0c;是二项式系数在三角形中的一种几何排列&#xff0c;古称“开方作法本源图”。 杨辉三角的历史 北宋人贾宪约1050年首先使用“贾…