关于 video-processing-editing
面向视频创作者与自动化工作流的 FFmpeg 视频处理技能,涵盖剪辑、音频、色彩和导出。强调关键帧切割、减少重复编码及按平台优化输出。
主要功能
- 01剪切、拼接与批量处理视频
- 02添加效果、转场和叠加层
- 03混音、音频同步与规范化
- 04字幕处理与色彩校正
- 05按目标平台优化导出
适用场景
- 01自动化脚本转视频流程
- 02精准剪切或拼接片段
- 03为社交平台批量导出视频
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ curiositech/ some_claude_skills --skill video-processing-editing安装后在 Claude Code 中输入/video-processing-editing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.claude-plugin/plugin.jsondemo/index.htmlreferences/export-optimization.mdffmpeg-guide.mdtimeline-editing.mdscripts/quality_assessment.pymotion_graphics.pybatch_processor.pyaudio_mixer.pythumbnail_generator.pytimelapse_creator.pyvideo_editor.py详细介绍
视频处理与剪辑
精通基于 FFmpeg 的视频剪辑、处理自动化,以及面向现代内容创作工作流的导出优化。
适用场景
✅ 适用于:
- 自动化视频剪辑流水线(脚本转视频)
- 剪切、修剪、拼接片段
- 添加转场、特效和叠加层
- 混音和音频标准化
- 字幕处理
- 针对平台优化导出
- 批量视频处理
- 调色与校正
❌ 不适用于:
- 实时视频剪辑 UI(使用 DaVinci Resolve/Premiere)
- 3D 合成(使用 After Effects/Blender)
- 动态图形动画(使用 After Effects)
- 基础屏幕录制(使用 OBS)
技术选型
视频剪辑工具
| 工具 | 速度 | 功能 | 使用场景 |
|---|---|---|---|
| FFmpeg | 非常快 | 命令行自动化 | 生产流水线 |
| MoviePy | 中等 | Python API | 程序化剪辑 |
| PyAV | 快 | 底层控制 | 自定义处理 |
| DaVinci Resolve | 慢 | 完整的非线性剪辑 | 手动剪辑 |
决策树:
Need automation? → FFmpeg
Need Python API? → MoviePy
Need frame-level control? → PyAV
Need manual editing? → DaVinci Resolve
常见反模式
反模式 1:未使用与关键帧对齐的剪切点
新手想法:“随便选个时间戳剪切视频就行。”
问题:会导致瑕疵、黑帧和播放问题。
错误做法:
# ❌ Cut at arbitrary timestamp (not keyframe-aligned)
ffmpeg -i input.mp4 -ss 00:01:23.456 -to 00:02:45.678 -c copy output.mp4
# Result: Black frames, artifacts, sync issues
错误原因:
- 视频编解码器每隔 2-10 秒使用关键帧(I 帧)
- 在非关键帧处剪切需要重新编码
- 使用
-c copy(流复制)但不与关键帧对齐,会破坏播放 - GOP(图像组)结构取决于关键帧
正确做法 1:重新编码以实现精确剪切
# ✅ Re-encode for frame-accurate cutting
ffmpeg -i input.mp4 -ss 00:01:23.456 -to 00:02:45.678 \
-c:v libx264 -crf 18 -preset medium \
-c:a aac -b:a 192k \
output.mp4
# Frame-accurate, but slower (re-encoding)
正确做法 2:与关键帧对齐的流复制
# ✅ Fast cutting with keyframe alignment
# Step 1: Find keyframes near cut points
ffprobe -select_streams v -show_frames -show_entries frame=pkt_pts_time,key_frame \
-of csv input.mp4 | grep ",1$" | awk -F',' '{print $2}'
# Step 2: Cut at nearest keyframes (fast, no re-encoding)
ffmpeg -i input.mp4 -ss 00:01:22.000 -to 00:02:46.000 -c copy output.mp4
# Blazing fast, no quality loss, but not frame-accurate
正确做法 3:采用双遍处理,兼顾两者优势
# ✅ Fast seek + precise cut
ffmpeg -ss 00:01:20.000 -i input.mp4 \
-ss 00:00:03.456 -to 00:01:25.678 \
-c:v libx264 -crf 18 -preset medium \
-c:a aac -b:a 192k \
output.mp4
# -ss BEFORE -i: Fast seek to keyframe (no decode)
# -ss AFTER -i: Precise trim (only decode needed portion)
性能对比:
| 方法 | 耗时(1 小时视频) | 精度 | 质量 |
|---|---|---|---|
| 流复制(任意位置) | 2s | ❌ 已损坏 | ❌ 有瑕疵 |
| 流复制(关键帧对齐) | 2s | ±2s | ✅ 完美 |
| 重新编码(简单) | 15min | ✅ 精确到帧 | ⚠️ 质量损失 |
| 双遍处理(最佳) | 3min | ✅ 精确到帧 | ✅ 完美 |
时间线背景:
- 2010:FFmpeg 剪切视频需要完整重新编码
- 2015:新增
-c copy,支持流复制 - 2020:双遍剪切成为最佳实践
- 2024:硬件加速(NVENC)使重新编码切实可行
反模式 2:不必要地重新编码
新手想法:“在一条 FFmpeg 命令中完成所有编辑。”
问题:多次重新编码会造成累积的质量损失。
错误做法:
# ❌ Re-encode for each operation (quality degradation)
# Operation 1: Trim
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:05:00 \
-c:v libx264 -crf 23 temp1.mp4
# Operation 2: Add audio
ffmpeg -i temp1.mp4 -i audio.mp3 -c:v libx264 -crf 23 \
-map 0:v -map 1:a temp2.mp4
# Operation 3: Add subtitles
ffmpeg -i temp2.mp4 -vf subtitles=subs.srt \
-c:v libx264 -crf 23 output.mp4
# Result: 3x re-encoding = significant quality loss
错误原因:
- 每次重新编码都会造成有损压缩(即使 CRF 值很高)
- 质量损失会累积(代际损失)
- 编码耗时增加 3 倍
- 浪费磁盘 I/O
正确做法 1:在单条命令中串联操作
# ✅ Single-pass encoding with all operations
ffmpeg -ss 00:01:00 -i input.mp4 -i audio.mp3 \
-to 00:04:00 \
-vf "subtitles=subs.srt" \
-map 0:v -map 1:a \
-c:v libx264 -crf 18 -preset medium \
-c:a aac -b:a 192k \
output.mp4
# Single re-encode, all operations applied at once
正确做法 2:尽可能使用流复制
# ✅ Lossless operations with stream copy
# Trim (stream copy)
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:05:00 -c copy temp.mp4
# Add audio (stream copy video, encode audio)
ffmpeg -i temp.mp4 -i audio.mp3 \
-map 0:v -map 1:a \
-c:v copy -c:a aac -b:a 192k \
temp2.mp4
# Burn subtitles (must re-encode video)
ffmpeg -i temp2.mp4 -vf subtitles=subs.srt \
-c:v libx264 -crf 18 -preset medium \
-c:a copy \
output.mp4
# Only 1 video re-encode (for subtitles)
质量对比:
| 方法 | 编码遍数 | 质量(VMAF) | 耗时 |
|---|---|---|---|
| 重新编码 3 次(CRF 23) | 3 | 82/100 | 45min |
| 单遍处理(CRF 23) | 1 | 91/100 | 15min |
| 流复制 + 1 次编码 | 1 | 95/100 | 18min |
| 全部采用流复制 | 0 | 100/100 | 30s |
反模式 3:忽略色彩空间转换
新手想法:“把视频直接拼接起来就行。”
问题:色偏、亮度不一致、播放异常。
错误做法:
# ❌ Concatenate videos with different color spaces
# clip1.mp4: BT.709 (HD), yuv420p
# clip2.mp4: BT.601 (SD), yuvj420p (full range)
# clip3.mp4: BT.2020 (HDR), yuv420p10le
# Create concat list
echo "file 'clip1.mp4'" > list.txt
echo "file 'clip2.mp4'" >> list.txt
echo "file 'clip3.mp4'" >> list.txt
# Concatenate without color normalization
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
# Result: Color shifts between clips, broken HDR metadata
错误原因:
- 色彩空间不同(BT.601 与 BT.709 与 BT.2020)
- 像素格式不同(yuv420p 与 yuvj420p)
- 色彩范围不同(有限范围与全范围)
- 元数据冲突
正确做法:
# ✅ Normalize color space before concatenation
# Step 1: Analyze color space of each clip
ffprobe -v error -select_streams v:0 \
-show_entries stream=color_space,color_transfer,color_primaries,pix_fmt \
-of default=noprint_wrappers=1 clip1.mp4
# Step 2: Normalize all clips to common color space
# Target: BT.709 (HD), yuv420p, limited range
# Normalize clip1 (already BT.709)
ffmpeg -i clip1.mp4 -c copy clip1_normalized.mp4
# Normalize clip2 (BT.601 SD → BT.709 HD)
ffmpeg -i clip2.mp4 \
-vf "scale=in_range=full:out_range=limited,colorspace=bt709:iall=bt601:fast=1" \
-color_primaries bt709 \
-color_trc bt709 \
-colorspace bt709 \
-c:v libx264 -crf 18 -preset medium \
-c:a copy \
clip2_normalized.mp4
# Normalize clip3 (BT.2020 HDR → BT.709 SDR)
ffmpeg -i clip3.mp4 \
-vf "zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=limited,format=yuv420p" \
-color_primaries bt709 \
-color_trc bt709 \
-colorspace bt709 \
-c:v libx264 -crf 18 -preset medium \
-c:a copy \
clip3_normalized.mp4
# Step 3: Concatenate normalized clips
echo "file 'clip1_normalized.mp4'" > list.txt
echo "file 'clip2_normalized.mp4'" >> list.txt
echo "file 'clip3_normalized.mp4'" >> list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
色彩空间指南:
| 标准 | 色彩空间 | 传递特性 | 原色 | 使用场景 |
|---|---|---|---|---|
| BT.601 | SD | bt470bg | bt470bg | 旧版 SD 内容 |
| BT.709 | HD | bt709 | bt709 | 现代 HD/FHD |
| BT.2020 | UHD/HDR | smpte2084 | bt2020 | 4K HDR |
| sRGB | Web | iec61966-2-1 | bt709 | Web 发布 |
反模式 4:音频同步不佳
新手想法:“视频和音频是分开的,直接叠加就行”
问题:口型不同步、音频漂移、播放异常。
错误做法:
# ❌ Replace audio without sync consideration
ffmpeg -i video.mp4 -i audio.mp3 \
-map 0:v -map 1:a \
-c:v copy -c:a copy \
output.mp4
# Problems:
# - Audio duration ≠ video duration
# - No audio stretching/compression
# - Drift over time
错误原因:
- 音频和视频的时长不同
- 没有进行时基同步
- 没有进行漂移校正
- 忽略了原始音频同步
正确做法 1:拉伸或压缩音频,使其与视频匹配
# ✅ Adjust audio speed to match video duration
# Get durations
VIDEO_DUR=$(ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 video.mp4)
AUDIO_DUR=$(ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 audio.mp3)
# Calculate speed ratio
RATIO=$(echo "$VIDEO_DUR / $AUDIO_DUR" | bc -l)
# Stretch audio to match video (with pitch correction)
ffmpeg -i video.mp4 -i audio.mp3 \
-filter_complex "[1:a]atempo=${RATIO}[a]" \
-map 0:v -map "[a]" \
-c:v copy -c:a aac -b:a 192k \
output.mp4
正确做法 2:精确偏移并修剪
# ✅ Sync audio with offset and trim
# Audio starts 0.5s late, trim to match video
ffmpeg -i video.mp4 -itsoffset 0.5 -i audio.mp3 \
-map 0:v -map 1:a \
-shortest \
-c:v copy -c:a aac -b:a 192k \
output.mp4
# -itsoffset: Delay audio by 0.5s
# -shortest: Trim to shortest stream
正确做法 3:同步混合多个音轨
# ✅ Mix dialogue, music, effects with precise timing
ffmpeg -i video.mp4 -i dialogue.wav -i music.mp3 -i sfx.wav \
-filter_complex "
[1:a]adelay=0|0[dlg];
[2:a]volume=0.3,adelay=500|500[mus];
[3:a]adelay=1200|1200[sfx];
[dlg][mus][sfx]amix=inputs=3:duration=first[a]
" \
-map 0:v -map "[a]" \
-c:v copy -c:a aac -b:a 256k \
output.mp4
# adelay: Precise millisecond timing
# amix: Mix multiple audio streams
# volume: Normalize levels
音频同步检查清单:
□ Verify video and audio durations match
□ Use -shortest to prevent excess audio
□ Apply adelay for precise timing offsets
□ Use atempo for speed adjustment (maintains pitch)
□ Set audio bitrate appropriately (128k-256k)
□ Test lip sync at beginning, middle, end
反模式 5:平台所需的编解码器或比特率设置错误
新手想法:“所有内容都用同一套导出设置”
问题:浪费带宽、画质不佳、上传被拒、兼容性问题。
错误做法:
# ❌ Export everything at 4K 50 Mbps
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 50M -s 3840x2160 \
-c:a aac -b:a 320k \
output.mp4
# For Instagram story: 2 GB file, rejected (max 100 MB)
# For YouTube: Could use 10 Mbps and look identical
# For Twitter: Exceeds bitrate limits
错误原因:
- 平台对文件大小和比特率的限制各不相同
- 过度编码会浪费带宽
- 分辨率不适合平台
- 编解码器不兼容
正确做法:针对平台优化导出设置
YouTube(推荐设置):
# ✅ YouTube 1080p upload
ffmpeg -i input.mp4 \
-c:v libx264 -preset slow -crf 18 \
-s 1920x1080 -r 30 \
-pix_fmt yuv420p \
-color_primaries bt709 -color_trc bt709 -colorspace bt709 \
-movflags +faststart \
-c:a aac -b:a 192k -ar 48000 \
youtube_1080p.mp4
# YouTube 4K upload
ffmpeg -i input.mp4 \
-c:v libx264 -preset slow -crf 18 \
-s 3840x2160 -r 60 \
-pix_fmt yuv420p \
-movflags +faststart \
-c:a aac -b:a 256k -ar 48000 \
youtube_4k.mp4
Instagram(Stories、Reels、Feed):
# ✅ Instagram Story (9:16, max 100 MB, 15s)
ffmpeg -i input.mp4 \
-c:v libx264 -preset medium -crf 23 \
-s 1080x1920 -r 30 -t 15 \
-pix_fmt yuv420p \
-movflags +faststart \
-c:a aac -b:a 128k \
instagram_story.mp4
# ✅ Instagram Reel (9:16, max 90s)
ffmpeg -i input.mp4 \
-c:v libx264 -preset medium -crf 23 \
-s 1080x1920 -r 30 -t 90 \
-pix_fmt yuv420p \
-movflags +faststart \
-c:a aac -b:a 128k \
instagram_reel.mp4
# ✅ Instagram Feed (1:1 or 4:5)
ffmpeg -i input.mp4 \
-c:v libx264 -preset medium -crf 23 \
-s 1080x1080 -r 30 \
-pix_fmt yuv420p \
-movflags +faststart \
-c:a aac -b:a 128k \
instagram_feed.mp4
Twitter/X:
# ✅ Twitter video (max 512 MB, 2:20)
ffmpeg -i input.mp4 \
-c:v libx264 -preset medium -crf 23 \
-s 1280x720 -r 30 -t 140 \
-maxrate 5000k -bufsize 10000k \
-pix_fmt yuv420p \
-movflags +faststart \
-c:a aac -b:a 128k \
twitter.mp4
TikTok:
# ✅ TikTok (9:16, max 287 MB, 10 min)
ffmpeg -i input.mp4 \
-c:v libx264 -preset medium -crf 23 \
-s 1080x1920 -r 30 -t 600 \
-pix_fmt yuv420p \
-movflags +faststart \
-c:a aac -b:a 128k \
tiktok.mp4
Web(HTML5 视频):
# ✅ Web optimized (fast load, broad compatibility)
ffmpeg -i input.mp4 \
-c:v libx264 -preset medium -crf 23 \
-s 1920x1080 -r 30 \
-pix_fmt yuv420p \
-profile:v baseline -level 3.0 \
-movflags +faststart \
-c:a aac -b:a 128k -ar 48000 \
web.mp4
平台规格表:
| 平台 | 最大文件大小 | 最长时长 | 分辨率 | FPS | 比特率 | 编解码器 |
|---|---|---|---|---|---|---|
| YouTube | 不限 | 不限 | 8K | 60 | 自动 | H.264/VP9 |
| Instagram Story | 100 MB | 15s | 1080x1920 | 30 | ~5 Mbps | H.264 |
| Instagram Reel | 1 GB | 90s | 1080x1920 | 30 | ~8 Mbps | H.264 |
| 512 MB | 2:20 | 1920x1080 | 60 | 5 Mbps | H.264 | |
| TikTok | 287 MB | 10min | 1080x1920 | 30 | ~4 Mbps | H.264 |
| 5 GB | 10min | 1920x1080 | 30 | 5 Mbps | H.264 | |
| Web | 不定 | 不定 | 1920x1080 | 30 | 2-5 Mbps | H.264 |
导出优化检查清单:
□ Use -movflags +faststart for web (progressive download)
□ Use -pix_fmt yuv420p for broad compatibility
□ Set -r 30 for most platforms (avoid variable framerate)
□ Use -preset slow for final exports (better quality)
□ Use -preset ultrafast for drafts
□ Apply -maxrate and -bufsize for streaming
□ Test playback on target platform before bulk export
制作检查清单
□ Align cuts to keyframes (or two-pass seek)
□ Chain operations in single FFmpeg command
□ Normalize color spaces before concatenating
□ Verify audio/video sync (test at multiple points)
□ Use platform-specific export presets
□ Apply -movflags +faststart for web delivery
□ Set proper color metadata (bt709 for HD)
□ Test output file on target platform
□ Keep lossless intermediate files (ProRes, FFV1)
□ Use hardware acceleration for batch jobs (NVENC, VideoToolbox)
适用与不适用场景
| 场景 | 是否适用? |
|---|---|
| 自动化视频流水线(脚本 → 视频) | ✅ 是 - FFmpeg 自动化 |
| 批量处理 100 个视频 | ✅ 是 - 并行运行 FFmpeg 作业 |
| 以编程方式修剪或剪切片段 | ✅ 是 - 精确剪切 |
| 为视频添加字幕 | ✅ 是 - 烧录字幕或添加软字幕 |
| 为素材调色 | ⚠️ 有限适用 - 仅限基础调色 |
| 多机位剪辑 | ❌ 否 - 使用 DaVinci Resolve |
| 动态图形 | ❌ 否 - 使用 After Effects |
| 实时预览剪辑 | ❌ 否 - 使用 Premiere/Resolve |
参考资料
/references/ffmpeg-guide.md- 完整的 FFmpeg 命令参考/references/timeline-editing.md- 时间线概念、多轨剪辑/references/export-optimization.md- 针对平台的导出设置
脚本
scripts/video_editor.py- 剪切、修剪、拼接、转场、特效scripts/batch_processor.py- 并行批量视频处理
此技能适用于:视频剪辑 | FFmpeg | 时间线剪辑 | 转场 | 导出优化 | 音频混合 | 调色 | 自动化视频制作