从研讨会视频中提取幻灯片
scripts/ 目录下包含两个功能相同的脚本,分别适用于不同平台:
| 脚本 | 适用平台 |
|---|---|
scripts/extract_slides.sh | Linux、macOS、Git Bash 或 Windows 下的 WSL |
scripts/extract_slides.ps1 | Windows PowerShell,无需 bash |
scripts/slides.tex | Beamer 模板,脚本会将其复制到输出文件夹中 |
工作原理:yt-dlp 仅下载视频流(无音频,分辨率最高 1080p)。ffmpeg 以每秒一帧进行采样,保留第一帧以及所有场景变化分数超过阈值的帧,因此每个保留的帧对应一个新的幻灯片或渐进式构建步骤。showinfo 日志会记录每帧的视频时间。输出文件夹包含:
slide_001.png、slide_002.png、...:每次幻灯片变化对应的图像timestamps.txt:每帧对应的视频时间(秒)frame_list.tex和slides.tex:运行pdflatex slides.tex可生成每页一张幻灯片、底部带有h:mm:ss时间戳的 PDF
操作步骤
-
检查工具。 运行
ffmpeg -version和yt-dlp --version。如果缺少某个工具,请安装(见下文)或告知用户如何安装。对于本地文件,不需要 yt-dlp。 -
根据平台选择脚本。 在 Windows 上,除非用户明确使用了 Git Bash 或 WSL,否则应使用 PowerShell 脚本。
-
运行脚本,针对用户提供的 URL 或文件,将结果输出到以演讲命名的文件夹中(例如
-o speaker_topic_frames),不要放在技能文件夹内。bash scripts/extract_slides.sh -u "https://www.youtube.com/watch?v=ID" -o talk_frames bash scripts/extract_slides.sh -i "recording.mp4" -o talk_framespowershell -ExecutionPolicy Bypass -File scripts\extract_slides.ps1 -Url "https://www.youtube.com/watch?v=ID" -OutDir talk_frames powershell -ExecutionPolicy Bypass -File scripts\extract_slides.ps1 -InputFile "C:\path\to\recording.mp4" -OutDir talk_frames-ExecutionPolicy Bypass用于绕过 Windows 对脚本的默认阻止,仅对该次运行有效。 -
查看提取的帧后再报告。打开几个 PNG 文件(第一张、中间一张、最后一张),检查:
- 摄像头画面或演讲者视图与幻灯片并列: 演讲者的动作会触发错误的幻灯片变化。在一帧中找出幻灯片区域,然后使用裁剪参数重新运行,例如
-c W:H:X:Y/-Crop W:H:X:Y(ffmpeg 裁剪语法:宽度、高度、左上角坐标)。 - 帧数过少(遗漏了渐进式构建或微小变化):使用较低的阈值重新运行,例如
-t 0.05/-Threshold 0.05。 - 帧数过多(视频、动画、摄像头噪声):将阈值提高到
0.2-0.3,或进行裁剪。 - 重复帧: 手动删除多余的 PNG 文件及其在
frame_list.tex中的对应行。
- 摄像头画面或演讲者视图与幻灯片并列: 演讲者的动作会触发错误的幻灯片变化。在一帧中找出幻灯片区域,然后使用裁剪参数重新运行,例如
-
生成 PDF(如果用户需要):进入输出文件夹,运行
pdflatex slides.tex(或latexmk -pdf slides.tex)。 -
报告提取的帧数、输出文件夹、生成的 PDF,以及任何需要用户自行处理的问题,例如您故意保留的重复帧。
参数
| bash | PowerShell | 含义 | 默认值 |
|---|---|---|---|
-u URL | -Url URL | 要下载的视频 URL(yt-dlp 支持的任何站点) | |
-i FILE | -InputFile FILE | 本地视频文件替代下载 | |
-o DIR | -OutDir DIR | 输出文件夹 | video_frames |
-t X | -Threshold X | 场景变化阈值,0-1 | 0.10 |
-c W:H:X:Y | -Crop W:H:X:Y | 先裁剪到幻灯片区域 | 无 |
-b NAME | -Browser NAME | 使用此浏览器的登录 cookie(chrome、firefox、edge 等) | 无 |
安装工具
- Windows:
winget install --id yt-dlp.yt-dlp和winget install --id Gyan.FFmpeg,然后关闭并重新打开 PowerShell 以便系统找到它们。 - macOS:
brew install yt-dlp ffmpeg - Linux:
sudo apt install ffmpeg(或发行版对应的包管理器命令)和pip install -U yt-dlp - LaTeX(仅用于生成 PDF):需要 TeX Live 或 MiKTeX。MiKTeX 的
latexmk需要 Perl;普通的pdflatex不需要。
故障排除
- 录制文件需要登录才能访问(例如 Panopto、Zoom 云录制、大学门户):使用
-b chrome/-Browser chrome(或用户已登录的浏览器名称)。如果 yt-dlp 仍无法获取视频,请让用户下载视频后使用-i参数。 - **Git Bash 中出现
$'\r': command not found或pipefail: invalid option name错误:说明.sh文件使用的是 Windows 换行符。运行sed -i 's/\r$//' scripts/extract_slides.sh一次即可修复。 - yt-dlp 在 YouTube 上出错(“请登录确认”、格式错误等):首先更新 yt-dlp,运行
yt-dlp -U或pip install -U yt-dlp,这可以解决大部分问题。 - 无法访问视频主机的网络(受限环境或云会话):请告知用户,并提供命令让其在自己的机器上运行。
只允许获取用户有权访问的录制文件,并且除非演讲许可协议另有规定,提取的帧仅供用户个人笔记和学习使用。