初探本地DeepSeek VL + Typescript + FFMPEG:提取视频关键帧分析内容

前言

随着人工智能和计算机视觉技术的发展,利用图像识别来分析视频内容已经成为现实。本文的主要目标是:

  • 使用 ffmpeg 从视频中提取关键帧图片;
  • 基于 DeepSeek VL 1.3B 本地大模型对视频帧进行目标检测与识别(例如特定物体或人物);
  • 实现流式传输分析结果,确保实时反馈;
  • 提供终止分析操作的机制,防止资源浪费;

环境要求

  • Typescirpt 5+
  • Nodejs 20+
  • Python 3.8+
  • 安装FFMPEG
  • 部署DeepSeek VL本地大模型

项目演示(视频未加速)

使用的显卡是英伟达RTX 4070Ti-O12G

技术实现

前端部分

实现思路

  1. 用户在界面上传视频
  2. 后端分析视频然后逐一提取视频的每一帧保存为本地图片
  3. 准备好参数,发送请求给DeepSeek VL API
  4. 获取DeepSeek VL API数据,返回到前端

视频关键帧提取

本项目中视频的关键帧提取是视频分析的基础。关键帧是指视频中能够代表某一时间段内容的图像。通过提取关键帧,可以将视频处理的复杂度降低到图像处理的层面,从而显著提高处理效率。

在我们的实现中,使用了FFmpeg库来提取视频的关键帧。

具体步骤如下:

  1. 视频时长获取:通过FFmpeg获取视频的总时长,确定需要提取的关键帧数量。
  2. 关键帧提取:按固定时间间隔(例如每秒提取一帧)从视频中提取关键帧,并将其保存到指定路径。

相关代码如下:


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自取

  1. 按照DeepSeek-VL说明部署完成
  2. 修改app_deepseek_rest_api.py文件图片访问路径:

    filePath = "C:\\Users\\Administrator\\Code\\video-finder\\public\\images\\"
  3. 运行脚本

    python .\deepseek_vl\serve\app_deepseek_rest_api.py

实际应用场景与扩展

通过视频我们可以看到DeepSeek-VL分析图片的速度还是非常之快的,由于DeepSeek-VL暂不支持特定格式返回,所以有很多应用场景是无法做到的。比如:

  • 监控视频中的异常行为检测;
  • 视频内容的自动摘要及标签提取;
  • 实时视频流的内容检索;
  • 等等

总结

本项目简单初探一下如何利用 ffmpeg 与 DeepSeek VL 技术,对视频文件进行关键帧提取和图片的分析。希望本文能为大家提供灵感,在实际项目中更好地应用视频分析技术。

初探本地DeepSeek VL + Typescript + FFMPEG:提取视频关键帧分析内容的更多相关文章

  1. 基于C#利用ffmpeg提取视频帧

    利用ffmepg提取视频帧实际上是利用C#调用ffmepg命令行进行处理对应的视频,然后输出出视频帧 GetPicFromVideo("); static public string Get ...

  2. 交叉编译多平台 FFmpeg 库并提取视频帧

    原文地址: 交叉编译多平台 FFmpeg 库并提取视频帧 交叉编译多平台 FFmpeg 库并提取视频帧 本文档适用于 x86 平台编译 armeabi.armeabi-v7a.arm64-v8a.x8 ...

  3. 交叉编译多平台 FFmpeg 库并提取视频帧(转)

    交叉编译多平台 FFmpeg 库并提取视频帧 转  https://www.cnblogs.com/leviatan/p/11142579.html 本文档适用于 x86 平台编译 armeabi.a ...

  4. FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时

    由于产品需要对视频做一系列的解析操作,利用FFmpeg命令来完成视频的音频提取.第一帧提取作为封面图片.音频重采样.字幕压缩等功能: 前一篇文章已经记录了FFmpeg在JAVA中的使用-音频提取&am ...

  5. Windows下 ffmpeg + labelImg 提取视频帧 得到图片集 并 标注图片 来 构造数据集

    构造数据集的流程 视频文件  >>  ffmpeg处理  >>  图片集  >>  labelImg进行标注  >>  标注好的数据集 准备ffmpeg ...

  6. FFmpeg解码视频帧为jpg图片保存到本地

    FFmpeg解码视频帧为jpg图片保存到本地 - CSDN博客 https://blog.csdn.net/qq_28284547/article/details/78151635

  7. NET 2.0(C#)调用ffmpeg处理视频的方法

    另外:ffmpeg的net封装库 http://www.intuitive.sk/fflib/ NET 2.0 调用FFMPEG,并异步读取输出信息的代码...public void ConvertV ...

  8. Java使用FFmpeg处理视频文件指南

    Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取.码率压缩.分辨率转换等功能: 之前在网上浏览了一大圈Java使用FFmpeg处理音视频 ...

  9. Java使用FFmpeg处理视频文件的方法教程

    这篇文章主要给大家介绍了关于Java使用FFmpeg处理视频文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 本文主要 ...

  10. windows下使用ffmpeg进行视频转换和截图。

    author:fanfq(xiaoban) Email:fangqing.fan#gmail.comlink:http://fanfq.iteye.com/admin/blogs/655569chan ...

随机推荐

  1. Consul health check pass by Spring security filter

    https://stackoverflow.com/questions/35079930/consul-health-check-pass-by-spring-security-filter By d ...

  2. Qt音视频开发27-ffmpeg视频旋转显示

    一.前言 用手机或者平板拍摄的视频文件,很可能是旋转的,比如分辨率是1280x720,确是垂直的,相当于分辨率变成了720x1280,如果不做旋转处理的话,那脑袋必须歪着看才行,这样看起来太难受,所以 ...

  3. Qt音视频开发20-vlc内核动态保存录像文件(不需要重新编译源码)

    一.前言 在vlc默认提供的保存文件方式中,通过打开的时候传入指定的参数来保存文件,直到关闭播放生成文件,这种方式简单暴力,但是不适用大部分的场景,大部分时候需要的是提供开始录制和停止录制的功能,也就 ...

  4. WxPython跨平台开发框架之动态菜单的管理和功能权限的控制

    在一个业务管理系统中,如果我们需要实现权限控制功能,我们需要定义好对应的权限功能点,然后在前端界面中对界面元素的可用性和功能点进行绑定,这样就可以在后台动态分配权限进行动态控制了,一般来说,权限功能点 ...

  5. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-11- 标签页(tab)操作 - 下篇 (详细教程)

    1.简介 本来按照计划这一系列的文章应该介绍Context和Page两个内容的,但是宏哥看了官方文档和查找资料发现其实和宏哥在Python+Playwright系列文章中的大同小异,差不了多少,再在这 ...

  6. Spring基础 01 | Ioc

    Maven项目的创建 项目所在路径 - 项目一 - 创建Module - 添加Webapp(Project Structure) - 项目二 Spring简介 分层全栈(各层解决方案)轻量级框架,以I ...

  7. mysql-总结列表

    ------------------------------------------------------------mysql有多种日志,常见的有: 错误日志(ErrorLog)更新日志(Upda ...

  8. runoob-scipy(python)

    https://www.runoob.com/scipy/scipy-tutorial.html SciPy 教程 SciPy 是一个开源的 Python 算法库和数学工具包. Scipy 是基于 N ...

  9. biancheng-Spring Cloud Alibaba Sentinel

    http://c.biancheng.net/springcloud/sentinel.html Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控 ...

  10. 【java提高】---细则(4)

    java提高(16)---java注解 注解含义注解是JDK1.5之后才有的新特性,它相当于一种标记,在程序中加入注解就等于为程序打上某种标记,之后又通过类的反射机制来解析注解. 一.JDK自带注解 ...