ffmpeg-usage
ffmpeg 使用指南
概述
本技能提供基于 ffmpeg 的全面音视频处理能力,包括经过实战验证的命令和工作流,适用于常见多媒体任务、平台特定优化,以及质量与文件大小管理的最佳实践。
版本: 1.0.0 要求: ffmpeg >= 4.0,ffprobe(可选但推荐)
当用户提及视频或音频处理任务、格式转换、社交媒体优化或多媒体编辑时,Claude 应使用本技能。
适用场景
当用户需要以下操作时使用本技能:
- 视频格式转换(MP4、WebM、MOV 等)
- 分辨率缩放或宽高比调整
- 从视频创建 GIF
- 音频提取或格式转换
- 视频编辑(裁剪、合并、变速、旋转)
- 字幕处理(硬字幕、软字幕、提取字幕)
- 视频压缩或优化
- 平台特定格式化(YouTube、Instagram、TikTok、Twitter)
- 缩略图或帧提取
- 批量处理音视频文件
前置条件
使用本技能前,请确保已安装 ffmpeg:
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt-get install ffmpeg
# Windows(使用 Chocolatey)
choco install ffmpeg
验证安装:
ffmpeg -version
支持的操作
1. 格式转换
在不同视频格式之间转换,并使用优化设置。
MP4 转 WebM:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus output.webm
MOV 转 MP4:
ffmpeg -i input.mov -c:v libx264 -c:a aac -strict experimental output.mp4
任意格式转 MP4(通用兼容):
ffmpeg -i input.* -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 128k output.mp4
2. 分辨率调整
调整视频尺寸同时保持宽高比。
缩放到 720p:
ffmpeg -i input.mp4 -vf scale=-1:720 -c:a copy output_720p.mp4
缩放到 1080p:
ffmpeg -i input.mp4 -vf scale=-1:1080 -c:a copy output_1080p.mp4
缩放到指定宽度(高度自适应):
ffmpeg -i input.mp4 -vf scale=1280:-1 -c:a copy output.mp4
带填充缩放(黑边填充/信箱模式):
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4
3. GIF 制作
从视频创建高质量 GIF,并优化文件大小。
基本 GIF(10 帧/秒):
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1:flags=lanczos" output.gif
高质量 GIF(使用调色板):
# 生成调色板
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1:flags=lanczos,palettegen" palette.png
# 使用调色板创建 GIF
ffmpeg -i input.mp4 -i palette.png -filter_complex "fps=10,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif
从指定时间范围创建 GIF:
ffmpeg -ss 00:00:10 -t 5 -i input.mp4 -vf "fps=10,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif
4. 音频操作
提取、转换和处理音频流。
提取音频为 MP3:
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3
提取音频为 WAV:
ffmpeg -i input.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 output.wav
转换音频格式:
ffmpeg -i input.wav -c:a aac -b:a 192k output.m4a
添加背景音乐:
ffmpeg -i video.mp4 -i music.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 -shortest output.mp4
混合音频(叠加):
ffmpeg -i video.mp4 -i music.mp3 -filter_complex "[0:a][1:a]amix=inputs=2:duration=first" -c:v copy output.mp4
5. 视频编辑
裁剪、拼接和修改视频。
裁剪视频:
# 从第 10 秒到第 30 秒
ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:30 -c copy output.mp4
# 基于时长(从第 5 秒开始,截取 10 秒)
ffmpeg -i input.mp4 -ss 00:00:05 -t 10 -c copy output.mp4
拼接视频:
根据格式和兼容性选择方法:
方法一:Concat 协议(推荐——无需临时文件)
# 适用于 MPEG 格式:.ts、.mpg、.mpeg、.mp3、.aac 等
# 直接拼接,无需创建列表文件
ffmpeg -i "concat:file1.mp3|file2.mp3|file3.mp3" -c copy output.mp3
ffmpeg -i "concat:video1.ts|video2.ts|video3.ts" -c copy output.ts
# 支持格式:TS、MPEG-1、MPEG-2、MP3、AAC
# 不支持:MP4、MOV、MKV(请使用方法二)
方法二:Concat 分离器(适用于 MP4、MOV、MKV)
# 使用进程替换避免临时文件
ffmpeg -f concat -safe 0 -i <(printf "file '%s'\n" video1.mp4 video2.mp4 video3.mp4) -c copy output.mp4
# 如果 shell 不支持进程替换:
printf "file '%s'\n" video1.mp4 video2.mp4 video3.mp4 > list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
rm list.txt
方法三:Concat 滤镜(可接受重新编码时使用)
# 当视频编码/分辨率不同时使用
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" output.mp4
格式选择指南:
.mp3、.aac、.ts、.mpg、.mpeg→ 使用 concat 协议(方法一).mp4、.mov、.mkv→ 使用 concat 分离器(方法二)- 不同编码/分辨率 → 使用 concat 滤镜(方法三)
加速/减速:
# 2 倍速
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -an output.mp4
# 0.5 倍速(慢动作)
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" output.mp4
旋转视频:
# 顺时针旋转 90 度
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
# 旋转 180 度
ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" output.mp4
6. 字幕处理
添加、提取或烧录字幕。
烧录字幕到视频(硬字幕):
ffmpeg -i input.mp4 -vf subtitles=subtitles.srt output.mp4
添加软字幕:
ffmpeg -i input.mp4 -i subtitles.srt -c copy -c:s mov_text output.mp4
提取字幕:
ffmpeg -i input.mp4 -map 0:s:0 subtitles.srt
7. 缩略图提取
从视频中提取帧作为图片。
在指定时间提取单帧:
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 thumbnail.jpg
提取多张缩略图:
# 每 10 秒提取一帧
ffmpeg -i input.mp4 -vf fps=1/10 thumb%04d.jpg
# 提取前 10 帧
ffmpeg -i input.mp4 -vframes 10 frame%04d.png
8. 压缩与优化
在保持质量的同时减小文件大小。
视频压缩(均衡模式):
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
高压缩(更小文件):
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset veryslow -c:a aac -b:a 96k output.mp4
Web 优化压缩:
ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 -movflags +faststart -c:a aac -b:a 128k output.mp4
平台特定预设
YouTube 优化
ffmpeg -i input.mp4 \
-c:v libx264 -preset slow -crf 18 \
-c:a aac -b:a 192k \
-pix_fmt yuv420p \
-movflags +faststart \
youtube.mp4
Instagram 快拍(9:16)
ffmpeg -i input.mp4 \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -preset medium -crf 23 \
-c:a aac -b:a 128k \
-t 15 \
instagram_story.mp4
Twitter/X(16:9,最长 2 分 20 秒)
ffmpeg -i input.mp4 \
-vf scale=1280:720 \
-c:v libx264 -preset medium -crf 23 \
-c:a aac -b:a 128k \
-t 140 \
twitter.mp4
TikTok(9:16)
ffmpeg -i input.mp4 \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -preset medium -crf 23 \
-c:a aac -b:a 128k \
-t 60 \
tiktok.mp4
常见用例
屏幕录制优化
# 减小屏幕录制文件大小
ffmpeg -i screen_recording.mov \
-c:v libx264 -preset medium -crf 23 \
-vf "scale=1920:-1" \
-c:a aac -b:a 128k \
optimized.mp4
批量转换
# 将所有 MOV 文件转换为 MP4
for i in *.mov; do
ffmpeg -i "$i" -c:v libx264 -crf 23 -c:a aac "${i%.mov}.mp4"
done
从图片创建视频
# 从图片序列创建
ffmpeg -framerate 30 -pattern_type glob -i '*.jpg' \
-c:v libx264 -pix_fmt yuv420p \
output.mp4
# 单张图片转视频(5 秒)
ffmpeg -loop 1 -i image.jpg -c:v libx264 -t 5 -pix_fmt yuv420p output.mp4
最佳实践
-
始终先检查输入文件:
ffmpeg -i input.mp4 # 或使用 ffprobe 获取详细信息 ffprobe -v quiet -print_format json -show_format -show_streams input.mp4 -
尽可能使用
-c copy避免重新编码:ffmpeg -i input.mp4 -ss 00:01:00 -t 30 -c copy output.mp4 -
处理前用
-t参数预览效果:# 先测试前 10 秒 ffmpeg -i input.mp4 -t 10 [其他参数] test.mp4 -
使用合适的 CRF 值:
- 18 = 视觉无损
- 23 = 高质量(默认值)
- 28 = 可接受质量,文件更小
- 范围:0(无损)到 51(最差质量)
-
为 Web 视频添加
-movflags +faststart:- 启用渐进式播放
- 将元数据移至文件开头
错误处理
使用本技能时,请始终:
- 验证输入文件存在且可读
- 处理前检查 ffmpeg 是否已安装
- 验证输出路径可写
- 使用适当的提示信息优雅处理错误
- 处理大文件时显示进度
Claude 使用指南
当用户请求音视频处理时:
- 识别任务类型
- 从本技能中选择合适的命令
- 验证前置条件(ffmpeg 已安装、输入文件存在)
- 执行前说明命令的作用
- 执行命令并进行错误处理
- 验证输出是否成功创建
- 提供优化建议(如适用)
对于复杂工作流,应分步骤执行并逐一说明。
视频拼接注意事项: 尽可能使用 printf 配合进程替换来避免临时文件(参见拼接部分的方法二)。仅在必要时使用临时 list.txt 文件。
示例
用户:"把这个 MOV 文件转成 MP4" 响应: 使用 H.264 编码的 MOV 转 MP4 命令
用户:"从这个视频做一个 GIF,从第 10 秒开始只要 5 秒" 响应: 使用带时间范围的 GIF 创建命令
用户:"我需要把这个 4K 视频缩小到 1080p 用于网页" 响应: 结合分辨率缩放和 Web 优化预设
用户:"提取音频为 MP3" 响应: 使用 MP3 编码的音频提取命令
参考资料
- FFmpeg 官方文档:https://ffmpeg.org/documentation.html
- FFmpeg Wiki:https://trac.ffmpeg.org/wiki
- 支持的编解码器:https://ffmpeg.org/ffmpeg-codecs.html
- 滤镜文档:https://ffmpeg.org/ffmpeg-filters.html
文案提取和转录功能,当涉及到转录和文案提取功能的时候,参考下面文档:
Voice Model API (本地语音转录)
应用启动后自动在 http://127.0.0.1:18923 开启本地 HTTP 接口,供 Claude Skill 等外部调用方使用。
接口列表
1. 查询模型状态
GET /v1/audio/models/status
响应示例:
{
"installed": true,
"modelDir": "/Users/xxx/.newmax/models/sensevoice-small",
"modelSize": 239549735
}
{
"installed": false,
"modelDir": "/Users/xxx/.newmax/models/sensevoice-small",
"missingFiles": ["model.int8.onnx", "tokens.txt"]
}
2. 音频转录
POST /v1/audio/transcriptions
Content-Type: application/json
请求参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| audioPath | string | 是 | 音频文件的本地绝对路径 |
| language | string | 否 | 语言代码(如 zh, en, ja),留空自动检测 |
请求示例:
{
"audioPath": "/Users/xxx/Downloads/interview.mp3",
"language": "zh"
}
成功响应(200):
{
"success": true,
"text": "第一段转录文字\n第二段转录文字\n第三段转录文字"
}
失败响应(400/500):
{
"success": false,
"error": "模型未安装,请先下载模型"
}
使用说明
- 端口固定为
18923,仅监听127.0.0.1(本机访问) - 支持格式:WAV / MP3 / FLAC / M4A / OGG / AAC(非 WAV 格式需系统安装 ffmpeg)
- 长音频自动按 30 秒分段转录,结果以换行符拼接
- 模型需在设置 → 语音模型中先下载(约 239 MB),否则转录接口会返回未安装错误
- 使用 SenseVoice Small 模型,支持中英日韩粤等 50+ 语种
curl 快速测试
# 检查模型是否已安装
curl http://127.0.0.1:18923/v1/audio/models/status
# 转录音频文件
curl -X POST http://127.0.0.1:18923/v1/audio/transcriptions \
-H 'Content-Type: application/json' \
-d '{"audioPath": "/path/to/audio.mp3"}'
在 Claude Skill 中调用
# 在 skill 脚本中调用转录 API
result=$(curl -s -X POST http://127.0.0.1:18923/v1/audio/transcriptions \
-H 'Content-Type: application/json' \
-d "{\"audioPath\": \"$AUDIO_FILE\"}")
echo "$result" | jq -r '.text'
More from zephyrwang6/myskill
web-scraper
Fetch and extract content from web pages, converting HTML to clean markdown. Use when users want to read web articles, extract information from URLs, scrape web content, or when the built-in WebFetch tool fails due to network restrictions. Trigger when user provides URLs to read, asks to fetch web content, or needs to extract text from websites.
246rss-aggregator
Aggregates and summarizes recent updates from a predefined list of RSS feeds. Use when the user asks for "recent updates", "what's new", or "RSS updates" within a specific timeframe.
197youtube-transcript-cn
|
108content-topic-generator
从文章、推文、社交媒体内容生成多角度选题,包括推文选题(140字完整内容)和公众号选题(含详细大纲)。支持延伸、反驳、扩充、热点结合四种策略。当用户需要基于现有内容创作新选题、分析文章生成衍生内容、或进行内容再创作时使用。适用场景:(1) 分析推文/文章并生成选题,(2) 创建公众号/社交媒体内容策划,(3) 将长文拆解为多个传播点,(4) 内容营销和话题策划。
99topic-collector
AI热点采集工具。从Twitter/X、Product Hunt、Reddit、Hacker News、博客等采集AI相关热点内容。当用户说"开始今日选题"、"采集热点"、"看看今天有什么新闻"、"今日AI热点"时触发。聚焦领域:Vibe Coding、Claude Skill、AI知识管理、AI模型更新、AI新产品、海外热点。
76topic-generator
AI选题生成工具。从采集的热点中筛选TOP10,生成完整选题方案。当用户说"生成选题"、"筛选热点"、"哪些值得写"时触发。输出包含:事件描述、核心角度、标题、写作方式。
71