mcpField
V
video-processing-editing

video-processing-editing

github.com/curiositech创意与媒体2571.4k 次安装2 天前更新
代码仓库

关于 video-processing-editing

面向视频创作者与自动化工作流的 FFmpeg 视频处理技能,涵盖剪辑、音频、色彩和导出。强调关键帧切割、减少重复编码及按平台优化输出。

主要功能

  1. 01剪切、拼接与批量处理视频
  2. 02添加效果、转场和叠加层
  3. 03混音、音频同步与规范化
  4. 04字幕处理与色彩校正
  5. 05按目标平台优化导出

适用场景

  1. 01自动化脚本转视频流程
  2. 02精准剪切或拼接片段
  3. 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.json
demo/
index.html
references/
export-optimization.md
ffmpeg-guide.md
timeline-editing.md
scripts/
quality_assessment.py
motion_graphics.py
batch_processor.py
audio_mixer.py
thumbnail_generator.py
timelapse_creator.py
video_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)382/10045min
单遍处理(CRF 23)191/10015min
流复制 + 1 次编码195/10018min
全部采用流复制0100/10030s

反模式 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.601SDbt470bgbt470bg旧版 SD 内容
BT.709HDbt709bt709现代 HD/FHD
BT.2020UHD/HDRsmpte2084bt20204K HDR
sRGBWebiec61966-2-1bt709Web 发布

反模式 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不限不限8K60自动H.264/VP9
Instagram Story100 MB15s1080x192030~5 MbpsH.264
Instagram Reel1 GB90s1080x192030~8 MbpsH.264
Twitter512 MB2:201920x1080605 MbpsH.264
TikTok287 MB10min1080x192030~4 MbpsH.264
LinkedIn5 GB10min1920x1080305 MbpsH.264
Web不定不定1920x1080302-5 MbpsH.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 | 时间线剪辑 | 转场 | 导出优化 | 音频混合 | 调色 | 自动化视频制作

评论

支持 Markdown