:::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 用纯前端框架,把隐私、安全、性能、体验都做到了一个高维度上,这种做法,不得不说:
优雅,学!
最后,话又说回来:虽然我用到了后端,落了下乘;
但毕竟用了先进算法,也不失为一种风骨,哈哈。