🧪 Skills

video-frames

基于 PyAV 的命令行工具,支持按帧号、时间点提取视频帧,批量采样,视频信息查看及视频和图片压缩转换。

v1.0.0
❤️ 70
⬇️ 26k
👁 2
Share

Description

Video Frame Extractor - Skill 文档

基于 PyAV 的命令行视频帧提取工具,支持单帧、批量、采样提取及视频信息查看。

📋 功能特性

  • ✅ 单帧提取(按帧号或时间点)
  • ✅ 批量提取多帧
  • ✅ 按时间间隔采样提取
  • ✅ 批量目录首帧提取
  • ✅ 视频信息查看
  • ✅ 视频压缩(H.264 重新编码)
  • ✅ 图片压缩转换为 WebP 格式
  • ✅ 多线程加速
  • ✅ 递归目录处理
  • ✅ 跨平台支持(Windows/macOS/Linux)

🚀 安装

自动安装(推荐)

# 使用安装脚本一键安装
curl -sSL https://raw.githubusercontent.com/indulgeback/video-frame-extractor/main/install.sh | bash

脚本会自动:

  • 下载仓库到 ~/.video-frame-extractor
  • 创建 Python 虚拟环境
  • 安装所有依赖(PyAV、tqdm、Pillow)
  • 创建可执行命令 frame-extractor

手动安装

# 克隆仓库
git clone https://github.com/indulgeback/video-frame-extractor.git ~/.video-frame-extractor

# 进入目录
cd ~/.video-frame-extractor

# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 安装依赖
pip install -r requirements.txt

# 创建可执行链接
ln -sf ~/.video-frame-extractor/frame-extractor.py ~/.local/bin/frame-extractor

配置 PATH

确保 ~/.local/bin 在你的 PATH 中:

# 添加到 ~/.zshrc(macOS/Linux)
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

验证安装

frame-extractor -v

如果显示版本信息,说明安装成功!

🔧 诊断和错误排除

常见问题

1. 命令找不到

症状:

frame-extractor: command not found

解决方案:

# 检查 PATH
echo $PATH | grep -o '[^:]*\.local/bin[^:]*'

# 如果没有输出,添加到 PATH
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

2. 权限错误

症状:

Permission denied: '/Users/xxx/.local/bin/frame-extractor'

解决方案:

chmod +x ~/.local/bin/frame-extractor

3. Python 模块导入错误

症状:

ModuleNotFoundError: No module named 'av'

解决方案:

# 重新安装依赖
cd ~/.video-frame-extractor
source venv/bin/activate
pip install -r requirements.txt

4. FFmpeg 相关错误

症状:

RuntimeError: Could not find libavformat

解决方案:

PyAV 内置了 FFmpeg,但如果有问题:

# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt-get install ffmpeg

# 验证 FFmpeg
ffmpeg -version

5. 虚拟环境问题

症状:

/bin/sh: venv/bin/python: No such file or directory

解决方案:

cd ~/.video-frame-extractor
rm -rf venv
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

运行诊断脚本

bash ~/.openclaw/skills/video-frames/scripts/diagnose.sh

诊断脚本会检查:

  • Python 版本
  • frame-extractor 命令是否存在
  • PATH 配置
  • 依赖安装情况
  • FFmpeg 可用性

📖 使用指南

1. 查看版本信息

frame-extractor -v

2. 提取单帧

按帧号提取

# 提取第 100 帧
frame-extractor single -i video.mp4 -f 100 -o frame100.jpg

# 指定 JPEG 质量
frame-extractor single -i video.mp4 -f 100 -o frame100.jpg --quality 90

按时间点提取

# 提取第 3.5 秒的帧
frame-extractor single -i video.mp4 -t 3.5 -o frame_at_3_5s.jpg

# 提取第 10 秒的帧
frame-extractor single -i video.mp4 -t 10 -o frame_10s.jpg

3. 批量提取多帧

# 提取第 10 到 50 帧,每隔 5 帧提取一次
frame-extractor batch -i video.mp4 -o frames -s 10 -e 50 -d 5

# 使用多线程加速
frame-extractor batch -i video.mp4 -o frames -s 0 -e 100 -d 1 -w 8

4. 按时间间隔采样

# 每 2 秒提取一帧
frame-extractor sample -i video.mp4 -o samples -t 2

# 每 0.5 秒提取一帧
frame-extractor sample -i video.mp4 -o samples -t 0.5

5. 显示视频信息

frame-extractor info -i video.mp4

输出示例:

Video Information:
  Path: video.mp4
  Duration: 120.5 seconds
  Frame Rate: 30.0 fps
  Total Frames: 3615
  Resolution: 1920x1080
  Codec: h264

6. 批量提取目录首帧

提取当前目录

# 提取目录下所有视频的首帧
frame-extractor dirfirst -i videos_dir -o output_dir

递归提取(保持目录结构)

# 递归提取所有子目录下的视频首帧
frame-extractor dirfirst -i videos_dir -o output_dir -r

提取并压缩为 WebP

# 提取首帧并压缩转换为 WebP
frame-extractor dirfirst -i videos_dir -o output_dir -c

# 指定 WebP 质量
frame-extractor dirfirst -i videos_dir -o output_dir -c --webp-quality 90

# 控制文件大小(50-100KB)
frame-extractor dirfirst -i videos_dir -o output_dir -r -c --min-size 50 --max-size 100

7. 图片压缩转换为 WebP

压缩当前目录

# 压缩图片为 WebP
frame-extractor compress -i images_dir -o webp_dir

递归压缩

# 递归压缩所有子目录(保持目录结构)
frame-extractor compress -i images_dir -o webp_dir -r

指定质量和大小

# 指定 WebP 质量
frame-extractor compress -i images_dir -o webp_dir -q 95

# 限制文件大小(不超过 100KB)
frame-extractor compress -i images_dir -o webp_dir --max-size 100

# 限制文件大小范围(50-200KB)
frame-extractor compress -i images_dir -o webp_dir --min-size 50 --max-size 200

8. 视频压缩

压缩单个视频

# 中等质量压缩(推荐)
frame-extractor vcompress -i input.mp4 -o output.mp4 -q 50

# 高质量压缩
frame-extractor vcompress -i input.mp4 -o output.mp4 -q 80

# 高压缩率
frame-extractor vcompress -i input.mp4 -o output.mp4 -q 20

使用不同的编码预设

# 高质量,慢速编码(最终发布)
frame-extractor vcompress -i input.mp4 -o output.mp4 -q 50 -p slower

# 快速编码(临时处理)
frame-extractor vcompress -i input.mp4 -o output.mp4 -q 50 -p veryfast

批量压缩目录

# 压缩目录下的所有视频
frame-extractor vcompress -i videos_dir -o output_dir -q 50

# 递归压缩,使用多线程
frame-extractor vcompress -i videos_dir -o output_dir -r -q 50 -p slow -w 4

📊 压缩参数说明

Quality 参数(-q, --quality)

Quality CRF 值 说明
100 0 几乎无损,文件最大
80 10 高质量
60 20 较好质量
50 25 中等质量(推荐)
40 30 较低质量
20 40 高压缩率
0 51 最高压缩率,质量最低

Preset 参数(-p, --preset)

Preset 编码速度 压缩效率 适用场景
ultrafast 最快 最低 实时转码、快速预览
veryfast 很快 较低 快速处理
fast 中等 日常使用
medium 中等 中等 默认推荐
slow 较高 存档备份
slower 更慢 很高 最终发布版本
veryslow 最慢 最高 追求最小文件体积

提示: 预设越慢,同等画质下文件越小,但编码时间越长。

📋 完整参数一览

全局参数

参数 说明
-v, --version 显示版本和依赖信息

single(提取单帧)

参数 说明 必需 备注
-i, --input 输入视频路径
-o, --output 输出图像路径 默认自动生成
-f, --frame 要提取的帧号 二选一 和 -t 互斥
-t, --time 要提取的时间点(秒) 二选一 和 -f 互斥
--quality JPEG 质量(0-100) 默认 95

batch(批量提取)

参数 说明 必需 备注
-i, --input 输入视频路径
-o, --output 输出目录
-s, --start 起始帧号
-e, --end 结束帧号
-d, --delta 帧间隔 默认 1
-w, --workers 工作线程数 默认 4

sample(采样提取)

参数 说明 必需 备注
-i, --input 输入视频路径
-o, --output 输出目录
-t, --interval 采样间隔(秒) 默认 1.0
-w, --workers 工作线程数 默认 4

info(视频信息)

参数 说明 必需
-i, --input 输入视频路径

dirfirst(批量目录首帧提取)

参数 说明 必需 备注
-i, --input_dir 输入视频目录
-o, --output_dir 输出图片目录
-r, --recursive 递归遍历子目录 保持对等目录结构
-c, --compress 压缩转换为 WebP 自动清理原始图片
--webp-quality WebP 压缩质量(0-100) 默认 85
--max-size 最大文件大小(KB) 默认 100
--min-size 最小文件大小(KB) 默认 50

compress(图片压缩转换)

参数 说明 必需 备注
-i, --input_dir 输入图片目录
-o, --output_dir 输出 WebP 图片目录
-r, --recursive 递归遍历子目录 保持对等目录结构
-q, --quality WebP 压缩质量(0-100) 默认 85
--max-size 最大文件大小(KB) 默认 100
--min-size 最小文件大小(KB) 默认 50

vcompress(视频压缩)

参数 说明 必需 备注
-i, --input 输入视频路径或目录 文件或目录
-o, --output 输出视频路径或目录 文件或目录
-r, --recursive 递归遍历子目录 保持对等目录结构
-q, --quality 压缩质量(0-100) 默认 50
-p, --preset 编码速度预设 默认 medium
-w, --workers 工作线程数 默认 2

🎯 典型使用场景

场景 1:为视频库生成缩略图

# 递归提取所有视频的首帧并压缩为 WebP
frame-extractor dirfirst -i ~/Videos -o ~/Thumbnails -r -c --min-size 30 --max-size 80

场景 2:提取关键帧用于分析

# 每 5 秒提取一帧
frame-extractor sample -i video.mp4 -o keyframes -t 5

场景 3:视频质量优化

# 压缩视频以减小文件大小
frame-extractor vcompress -i large_video.mp4 -o compressed_video.mp4 -q 50 -p slow

场景 4:批量转换图片为 WebP

# 递归转换所有图片为 WebP,质量 90
frame-extractor compress -i ~/Pictures -o ~/Pictures_WebP -r -q 90

🦠 卸载

# 删除安装目录
rm -rf ~/.video-frame-extractor

# 删除可执行命令
rm ~/.local/bin/frame-extractor

🤝 参与贡献

欢迎提交 PR 或 issue!

仓库地址:https://github.com/indulgeback/video-frame-extractor

📚 相关文档

  • 主仓库:https://github.com/indulgeback/video-frame-extractor
  • 问题反馈:https://github.com/indulgeback/video-frame-extractor/issues

作者: indulgeback 版本: 1.0.0 许可证: MIT

Reviews (0)

Sign in to write a review.

No reviews yet. Be the first to review!

Comments (0)

Sign in to join the discussion.

No comments yet. Be the first to share your thoughts!

Compatible Platforms

Pricing

Free

Related Configs