初探本地DeepSeek VL + Typescript + FFMPEG:提取视频关键帧分析内容
初探本地DeepSeek VL + Typescript + FFMPEG:提取视频关键帧分析内容
前言
随着人工智能和计算机视觉技术的发展,利用图像识别来分析视频内容已经成为现实。本文的主要目标是:
- 使用 ffmpeg 从视频中提取关键帧图片;
- 基于 DeepSeek VL 1.3B 本地大模型对视频帧进行目标检测与识别(例如特定物体或人物);
- 实现流式传输分析结果,确保实时反馈;
- 提供终止分析操作的机制,防止资源浪费;
环境要求
- Typescirpt 5+
- Nodejs 20+
- Python 3.8+
- 安装FFMPEG
- 部署DeepSeek VL本地大模型
项目演示(视频未加速)

使用的显卡是英伟达RTX 4070Ti-O12G
技术实现
前端部分
实现思路
- 用户在界面上传视频
- 后端分析视频然后逐一提取视频的每一帧保存为本地图片
- 准备好参数,发送请求给DeepSeek VL API
- 获取DeepSeek VL API数据,返回到前端
视频关键帧提取
本项目中视频的关键帧提取是视频分析的基础。关键帧是指视频中能够代表某一时间段内容的图像。通过提取关键帧,可以将视频处理的复杂度降低到图像处理的层面,从而显著提高处理效率。
在我们的实现中,使用了FFmpeg库来提取视频的关键帧。
具体步骤如下:
- 视频时长获取:通过FFmpeg获取视频的总时长,确定需要提取的关键帧数量。
- 关键帧提取:按固定时间间隔(例如每秒提取一帧)从视频中提取关键帧,并将其保存到指定路径。
相关代码如下:
async function getVideoDuration(videoFilePath: string): Promise<number | undefined> {
return new Promise((resolve, reject) => {
ffmpeg.ffprobe(videoFilePath, (error, metadata) => {
if (error) reject(error);
const format = metadata.format;
resolve(format.duration);
});
});
}
async function getVideoKeyframeImg(params: GetVideoKeyframeImgParams): Promise<string> {
const { videoFilePath, seek, imgOutputPath } = params;
const imgFileOutputPath = `${imgOutputPath}/${seek}.png`;
return new Promise((resolve, reject) => {
ffmpeg(videoFilePath)
.seekInput(seek)
.output(imgFileOutputPath)
.outputOptions(['-frames:v 1'])
.on('end', () => resolve(imgFileOutputPath))
.on('error', err => reject(err))
.run();
});
}
接口部分
使用开源深度视觉语言(VL)模型:DeepSeek-VL
DeepSeek VL 是一个支持图像分析和目标检测的深度学习模型。它能够对输入的图像进行分析,并返回检测到的目标及其位置信息。在实现中,DeepSeek VL 用于分析提取的关键帧,判断其中是否包含特定的物体或人物。
由于DeepSeek-VL没有提供API接口访问,如有需要请到DeepSeek-VL-Fork自取
- 按照DeepSeek-VL说明部署完成
- 修改app_deepseek_rest_api.py文件图片访问路径:
filePath = "C:\\Users\\Administrator\\Code\\video-finder\\public\\images\\"
- 运行脚本
python .\deepseek_vl\serve\app_deepseek_rest_api.py
实际应用场景与扩展
通过视频我们可以看到DeepSeek-VL分析图片的速度还是非常之快的,由于DeepSeek-VL暂不支持特定格式返回,所以有很多应用场景是无法做到的。比如:
- 监控视频中的异常行为检测;
- 视频内容的自动摘要及标签提取;
- 实时视频流的内容检索;
- 等等
总结
本项目简单初探一下如何利用 ffmpeg 与 DeepSeek VL 技术,对视频文件进行关键帧提取和图片的分析。希望本文能为大家提供灵感,在实际项目中更好地应用视频分析技术。
初探本地DeepSeek VL + Typescript + FFMPEG:提取视频关键帧分析内容的更多相关文章
- 基于C#利用ffmpeg提取视频帧
利用ffmepg提取视频帧实际上是利用C#调用ffmepg命令行进行处理对应的视频,然后输出出视频帧 GetPicFromVideo("); static public string Get ...
- 交叉编译多平台 FFmpeg 库并提取视频帧
原文地址: 交叉编译多平台 FFmpeg 库并提取视频帧 交叉编译多平台 FFmpeg 库并提取视频帧 本文档适用于 x86 平台编译 armeabi.armeabi-v7a.arm64-v8a.x8 ...
- 交叉编译多平台 FFmpeg 库并提取视频帧(转)
交叉编译多平台 FFmpeg 库并提取视频帧 转 https://www.cnblogs.com/leviatan/p/11142579.html 本文档适用于 x86 平台编译 armeabi.a ...
- FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
由于产品需要对视频做一系列的解析操作,利用FFmpeg命令来完成视频的音频提取.第一帧提取作为封面图片.音频重采样.字幕压缩等功能: 前一篇文章已经记录了FFmpeg在JAVA中的使用-音频提取&am ...
- Windows下 ffmpeg + labelImg 提取视频帧 得到图片集 并 标注图片 来 构造数据集
构造数据集的流程 视频文件 >> ffmpeg处理 >> 图片集 >> labelImg进行标注 >> 标注好的数据集 准备ffmpeg ...
- FFmpeg解码视频帧为jpg图片保存到本地
FFmpeg解码视频帧为jpg图片保存到本地 - CSDN博客 https://blog.csdn.net/qq_28284547/article/details/78151635
- NET 2.0(C#)调用ffmpeg处理视频的方法
另外:ffmpeg的net封装库 http://www.intuitive.sk/fflib/ NET 2.0 调用FFMPEG,并异步读取输出信息的代码...public void ConvertV ...
- Java使用FFmpeg处理视频文件指南
Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取.码率压缩.分辨率转换等功能: 之前在网上浏览了一大圈Java使用FFmpeg处理音视频 ...
- Java使用FFmpeg处理视频文件的方法教程
这篇文章主要给大家介绍了关于Java使用FFmpeg处理视频文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 本文主要 ...
- windows下使用ffmpeg进行视频转换和截图。
author:fanfq(xiaoban) Email:fangqing.fan#gmail.comlink:http://fanfq.iteye.com/admin/blogs/655569chan ...
随机推荐
- c++死锁调试 ,gdb pstack
psatck pstack命令是一个在Linux系统中用于查看进程堆栈信息的工具. 写了一个服务端死锁程序,如下: #include <iostream> #include <t ...
- 共建共荣金融生态!金融级数字底座“源启”与GoldenDB数据库完成互认证
近日,中电金信金融级数字底座"源启"顺利与金篆信科GoldenDB分布式数据库完成互认证.GoldenDB数据库安全稳定运行在"源启"之上,整体性能表现卓越,进 ...
- 如何使用Jet家软件进行学习(intellij、idea、IDEA、Pycharm……)
如何使用Jet家软件进行学习 本文档提供方法只用于学习研究,不得用于其他用途 以下,萌狼蓝天将会提供两种方式 目录 如何使用Jet家软件进行学习 第一种方式:使用EAP版本 第二种方式:使用插件 (1 ...
- Failed to start bean 'webServerStartStop'; nested exception is org.springframework.beans.FatalBeanException: ServletWebServerFactory implementation
使用jeecgboot报错 jeecg单测跑不起来,报错如下 Failed to start bean 'webServerStartStop'; nested exception is org.sp ...
- Linux sudo 提权之软链接攻击
软链接提权的原理 低权限用户能够以 root 用户的权限执行某个脚本,该脚本中又使用到了诸如 chown 等命令修改文件的权限,且该文件又能够被低权限的用户所修改.因此低权限的用户可以删除该文件,然后 ...
- Java实现拍卖系统详解
一.项目背景与需求分析 随着互联网技术的飞速发展,电子商务领域不断拓展新的业务模式,在线拍卖系统应运而生并逐渐成为一种重要的商业交易方式.在当今数字化的时代,人们越来越倾向于通过网络平台进行各类交易活 ...
- 记录uniapp上传图片转base64
// 图片转base64 imageToBase64() { return new Promise((reslove, reject) => { uni.getFileSystemManager ...
- (五).NET6.0使用Serilog进行配置和实现日志记录
1.首先安装Serilog六件套神装包 也可以对个别相应的包进行删除等,例如:1是读取配置文件的,如果不需要通过配置文件进行操作,就可以不使用这个包.2是打印到控制台的,如果不需要打印到控制台,也可以 ...
- 后端开发之chrome开发者模式-copy
1. 场景描述 java开发前后端分离模式越来越流行,后端人员可以直接使用swagger进行接口调试(前后端分离之Swagger2),但是调试的时候,需要设置入参,假如该模块不是软件老王开发的,接别人 ...
- 在 Windows 10 上实现免密码 SSH 登录
前言 在日常开发中,SSH(Secure Shell)作为一种安全的远程登录协议,广泛用于 Linux 和 Windows 系统之间的连接.为了提高效率,我们可以通过配置免密码登录,省去每次连接时输入 ...