:::info 最近发现一个很有意思的项目,可以将演讲的视频自动转为 PPT,非常适合技术分享回顾、公开课整理等场景。

:::

项目地址:https://github.com/Wangxs404/video2ppt

背景与动机

会议录像、公开课、线下讲座等内容常常会包含大量静态展示的幻灯片页,但手动截图整理既低效又枯燥。如果能将视频自动分析,识别出每一页 PPT 并转为 PDF 或图片格式输出,不仅能提升效率,还方便分享与归档。

video2ppt 项目正是为了解决这个需求。

使用方法

访问:https://video2ppt.com/local-video

值得一提的是,整个处理流程在本地完成,并不会将视频上传至服务器:

使用方法

操作体验非常简单,选择文件、点击生成,即可看到提取进度和生成效果

示意图(动图)

转换效果截图

效果评价

下面的图片,演示了提取 PPT 的效果。

页面“误报”截图

整体令人满意,视频中每一页 PPT 都被准确捕捉并导出为图像或 PDF,便于分享与复用——偶有个别页面被重复识别为新页,只要跳过就行,不影响整体使用。

一个有趣的观察是:在这个场景下,我们对“误报”的容忍度远高于“漏报”。如果多识别出一页类似内容,问题不大;但漏掉一页真正变化的幻灯片,可能就会影响信息完整性

比如以下情况,仅仅因为演讲者走动导致画面微调,也会被判定为“新页面”:

页面误报示例

这跟灵敏度有关,也就是画面对比的相似度。

相似度判断原理:亮度分析

video2ppt 的关键能力之一在于判断“页面是否变化”。

在项目中,算法并没有使用常用的ImageHash,而是直接计算两个图像的亮度差异。

算法位置在源码文件videoProcessing.ts#L7

差异比较算法

这段算法对两帧图像进行逐像素亮度计算,并求得平均差异平方值。优点是精度高、实现简单。缺点是对光线和人物移移动较为敏感,所以容易“误报”

  • 亮度计算:使用加权公式 0.2126*R + <font style="color:#74B602;">0.7152*G</font> + 0.0722*B,符合人眼对绿色更敏感的视觉特性。
  • 逐像素对比:对每个像素的亮度进行平方差累加。
  • 平均差值:归一化处理后得出“平均平方差”指标,作为帧差异评分。

对 video2ppt 的评价

video2ppt 项目的实现充分体现了现代 Web 工程能力的边界探索,它完全基于前端技术栈完成了视频加载、帧处理、图像对比、PPT 生成与下载,无后端参与。

然而,我个人认为,它最精彩的地方在于:

尤其出彩的是,它把整个处理流程封装在本地浏览器中完成,用户的视频文件不会离开设备,数据既安全、速度又快。

你知道这意味着什么吗?

它直接绕开了传统后端架构那些老问题:

  • 大文件上传慢、易崩;
  • 后台处理资源消耗大;
  • 潜在信息泄露风险高;
  • 用户体验常因等待时间打折扣。

相比之下,video2ppt 的纯前端实现避免了这些问题,同时提供了更流畅、更即时的用户体验。这种“用最小代价解决最大问题”的产品设计,是令人佩服的。

所以我觉得,这项目厉害的不是它做了什么,而是它没做什么——它没部署后端、没拉中间件、没接数据库,但它把事办成了,而且办得漂亮!

后记:我也做了一个“在线版”,还挺先进的?

在第一次接触这个项目(video2ppt)的时候,我不禁拍案叫绝:“这不就是我想做的东西吗!”于是兴冲冲地撸了一个 Streamlit 在线版本,支持上传视频、抽帧、去重、转 PPT,一条龙服务,看起来似乎也还不错:

  • 核心流程:视频上传 → 抽帧 → 去重 → 合并为PPT → 下载
  • 支持远程视频URL解析,自动下载并处理
  • 提供参数化选项(如抽帧间隔、哈希阈值、并发控制),体验还挺“工程化”

更关键的是,我在实现中用了感知哈希(perceptual hash)+ 多进程加速的抽帧策略,不是那种“按秒傻抽”的朴素实现,而是结合视频帧的内容相似度做去重,能够有效排除演讲者走动时的轻微帧变动,最大限度保留信息变化点

某种程度上,这在语义层面比直接计算像素差距还要更贴近“人类观感”。

我做的在线版界面

算法简述如下:

  • 抽帧算法:支持 FFmpeg 或 OpenCV,两种方式任选,提升兼容性与精度;【FFmpeg 更快啦】
  • 去重算法:基于图像感知哈希(pHash),通过汉明距离控制阈值去重,自动过滤演讲中未换PPT的“无效帧”;
  • 生成PPT:使用 Python-pptx 将筛选后的关键帧逐张嵌入幻灯片,格式清晰,开箱即用。

一度我还挺自豪的,想着“这套实现发个小工具不香吗?”

效果不错

依赖文件如下

[project]
name = "video2ppt-py"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "opencv-python",
    "imagehash",
    "Pillow",
    "python-pptx",
    "streamlit",
]

我用的 uv 来管理 python 包

 uv run python  -m streamlit run app.py

在我自己的测试中,这套流程运行流畅,我甚至还有些自我感觉良好。直到——

我回头仔细想了想。

虽然功能实现没啥问题,但本质上,我是走了后端处理 + 临时文件存储 + 文件下载这条传统老路。视频得上传,PPT也得生成后再下载。和人家前端离线跑完所有逻辑、数据始终不出浏览器的思路比起来——

“这……是不是就有点落了下乘 ?”

毕竟在安全领域,“处理不出浏览器、数据不出本地” 是多么珍贵的设计哲学啊。而我这个版本,不但暴露了视频内容,还要服务器承担解码处理,甚至可能炸掉带宽预算。

所以说,虽然我这个 Streamlit Demo 称得上一回技术尝鲜,但距离「优雅地解决问题」还有不少路要走。video2ppt 用纯前端框架,把隐私、安全、性能、体验都做到了一个高维度上,这种做法,不得不说:

优雅,学!

最后,话又说回来:虽然我用到了后端,落了下乘;

但毕竟用了先进算法,也不失为一种风骨,哈哈。