video-processing-editing by erichowens/some_claude_skills
npx skills add https://github.com/erichowens/some_claude_skills --skill video-processing-editing基于 FFmpeg 的视频编辑、处理自动化和导出优化专家,适用于现代内容创作工作流。
✅ 适用于 :
❌ 不适用于 :
| 工具 | 速度 | 特性 | 使用场景 |
|---|---|---|---|
| FFmpeg | 非常快 | CLI 自动化 | 生产流水线 |
| MoviePy | 中等 | Python API | 编程式编辑 |
| PyAV |
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 快 |
| 底层控制 |
| 自定义处理 |
| DaVinci Resolve | 慢 | 完整 NLE | 手动编辑 |
决策树 :
Need automation? → FFmpeg
Need Python API? → MoviePy
Need frame-level control? → PyAV
Need manual editing? → DaVinci Resolve
新手思维:"在任何时间戳剪切视频即可"
问题:导致伪影、黑帧和播放问题。
错误做法 :
# ❌ 在任意时间戳剪切(未与关键帧对齐)
ffmpeg -i input.mp4 -ss 00:01:23.456 -to 00:02:45.678 -c copy output.mp4
# 结果:黑帧、伪影、同步问题
为何错误 :
-c copy(流复制)而未与关键帧对齐会破坏播放正确做法 1:重新编码以实现精确剪切
# ✅ 重新编码以实现帧精确剪切
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
# 帧精确,但速度较慢(重新编码)
正确做法 2:关键帧对齐的流复制
# ✅ 使用关键帧对齐进行快速剪切
# 步骤 1:查找剪切点附近的关键帧
ffprobe -select_streams v -show_frames -show_entries frame=pkt_pts_time,key_frame \
-of csv input.mp4 | grep ",1$" | awk -F',' '{print $2}'
# 步骤 2:在最近的关键帧处剪切(快速,无需重新编码)
ffmpeg -i input.mp4 -ss 00:01:22.000 -to 00:02:46.000 -c copy output.mp4
# 极快,无质量损失,但非帧精确
正确做法 3:双阶段法,兼顾两者优势
# ✅ 快速定位 + 精确剪切
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 在 -i 之前:快速定位到关键帧(无需解码)
# -ss 在 -i 之后:精确修剪(仅解码所需部分)
性能对比 :
| 方法 | 时间(1小时视频) | 精确度 | 质量 |
|---|---|---|---|
| 流复制(任意点) | 2s | ❌ 损坏 | ❌ 伪影 |
| 流复制(关键帧) | 2s | ±2s | ✅ 完美 |
| 重新编码(简单) | 15min | ✅ 帧精确 | ⚠️ 质量损失 |
| 双阶段(最优) | 3min | ✅ 帧精确 | ✅ 完美 |
时间线背景 :
-c copy 用于流复制新手思维:"在一个 FFmpeg 命令中应用所有编辑"
问题:多次重新编码导致累积质量损失。
错误做法 :
# ❌ 为每个操作重新编码(质量下降)
# 操作 1:修剪
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:05:00 \
-c:v libx264 -crf 23 temp1.mp4
# 操作 2:添加音频
ffmpeg -i temp1.mp4 -i audio.mp3 -c:v libx264 -crf 23 \
-map 0:v -map 1:a temp2.mp4
# 操作 3:添加字幕
ffmpeg -i temp2.mp4 -vf subtitles=subs.srt \
-c:v libx264 -crf 23 output.mp4
# 结果:3 次重新编码 = 显著质量损失
为何错误 :
正确做法 1:在单个命令中链式操作
# ✅ 单次编码,应用所有操作
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
# 单次重新编码,所有操作同时应用
正确做法 2:尽可能使用流复制
# ✅ 使用流复制进行无损操作
# 修剪(流复制)
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:05:00 -c copy temp.mp4
# 添加音频(视频流复制,编码音频)
ffmpeg -i temp.mp4 -i audio.mp3 \
-map 0:v -map 1:a \
-c:v copy -c:a aac -b:a 192k \
temp2.mp4
# 烧录字幕(必须重新编码视频)
ffmpeg -i temp2.mp4 -vf subtitles=subs.srt \
-c:v libx264 -crf 18 -preset medium \
-c:a copy \
output.mp4
# 仅 1 次视频重新编码(用于字幕)
质量对比 :
| 方法 | 编码次数 | 质量(VMAF) | 时间 |
|---|---|---|---|
| 3 次重新编码(CRF 23) | 3 | 82/100 | 45min |
| 单次编码(CRF 23) | 1 | 91/100 | 15min |
| 流复制 + 1 次编码 | 1 | 95/100 | 18min |
| 全部流复制 | 0 | 100/100 | 30s |
新手思维:"直接把视频拼接在一起"
问题:色彩偏移、亮度不匹配、播放损坏。
错误做法 :
# ❌ 拼接具有不同色彩空间的视频
# clip1.mp4: BT.709 (HD), yuv420p
# clip2.mp4: BT.601 (SD), yuvj420p (全范围)
# clip3.mp4: BT.2020 (HDR), yuv420p10le
# 创建拼接列表
echo "file 'clip1.mp4'" > list.txt
echo "file 'clip2.mp4'" >> list.txt
echo "file 'clip3.mp4'" >> list.txt
# 拼接而不进行色彩标准化
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
# 结果:片段间色彩偏移,HDR 元数据损坏
为何错误 :
正确做法 :
# ✅ 在拼接前标准化色彩空间
# 步骤 1:分析每个片段的色彩空间
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
# 步骤 2:将所有片段标准化到通用色彩空间
# 目标:BT.709 (HD), yuv420p, 有限范围
# 标准化 clip1(已经是 BT.709)
ffmpeg -i clip1.mp4 -c copy clip1_normalized.mp4
# 标准化 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
# 标准化 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
# 步骤 3:拼接标准化后的片段
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 | 网页 | iec61966-2-1 | bt709 | 网页交付 |
新手思维:"视频和音频是分开的,直接叠加即可"
问题:口型同步问题、音频漂移、播放损坏。
错误做法 :
# ❌ 替换音频而不考虑同步
ffmpeg -i video.mp4 -i audio.mp3 \
-map 0:v -map 1:a \
-c:v copy -c:a copy \
output.mp4
# 问题:
# - 音频时长 ≠ 视频时长
# - 无音频拉伸/压缩
# - 随时间漂移
为何错误 :
正确做法 1:拉伸/压缩音频以匹配视频
# ✅ 调整音频速度以匹配视频时长
# 获取时长
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)
# 计算速度比率
RATIO=$(echo "$VIDEO_DUR / $AUDIO_DUR" | bc -l)
# 拉伸音频以匹配视频(带音高校正)
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:精确偏移和修剪
# ✅ 使用偏移和修剪同步音频
# 音频延迟 0.5 秒开始,修剪以匹配视频
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: 将音频延迟 0.5 秒
# -shortest: 修剪到最短的流
正确做法 3:同步混合多个音轨
# ✅ 混合对白、音乐、音效,具有精确时序
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: 精确的毫秒级时序
# amix: 混合多个音频流
# volume: 标准化电平
音频同步检查清单 :
□ 验证视频和音频时长是否匹配
□ 使用 -shortest 防止多余音频
□ 应用 adelay 进行精确时序偏移
□ 使用 atempo 进行速度调整(保持音高)
□ 适当设置音频比特率(128k-256k)
□ 在开头、中间、结尾测试口型同步
新手思维:"所有内容使用相同的导出设置"
问题:浪费带宽、质量差、上传被拒、兼容性问题。
错误做法 :
# ❌ 所有内容都以 4K 50 Mbps 导出
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 50M -s 3840x2160 \
-c:a aac -b:a 320k \
output.mp4
# 对于 Instagram 故事:2 GB 文件,被拒绝(最大 100 MB)
# 对于 YouTube:使用 10 Mbps 看起来相同
# 对于 Twitter:超出比特率限制
为何错误 :
正确做法:平台优化的导出
YouTube(推荐设置) :
# ✅ YouTube 1080p 上传
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 上传
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(故事、Reels、动态) :
# ✅ Instagram 故事(9:16,最大 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,最大 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 动态(1:1 或 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 视频(最大 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,最大 287 MB,10 分钟)
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
网页(HTML5 视频) :
# ✅ 网页优化(快速加载,广泛兼容)
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 故事 | 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 | |
| 网页 | 可变 | 可变 | 1920x1080 | 30 | 2-5 Mbps | H.264 |
导出优化检查清单 :
□ 对网页使用 -movflags +faststart(渐进式下载)
□ 使用 -pix_fmt yuv420p 以获得广泛兼容性
□ 为大多数平台设置 -r 30(避免可变帧率)
□ 为最终导出使用 -preset slow(更好的质量)
□ 为草稿使用 -preset ultrafast
□ 为流媒体应用 -maxrate 和 -bufsize
□ 在批量导出前在目标平台上测试播放
□ 将剪切点与关键帧对齐(或使用双阶段定位)
□ 在单个 FFmpeg 命令中链式操作
□ 在拼接前标准化色彩空间
□ 验证音频/视频同步(在多个点测试)
□ 使用平台特定的导出预设
□ 为网页交付应用 -movflags +faststart
□ 设置正确的色彩元数据(HD 使用 bt709)
□ 在目标平台上测试输出文件
□ 保留无损中间文件(ProRes, FFV1)
□ 为批量作业使用硬件加速(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 | 时间线编辑 | 转场 | 导出优化 | 音频混音 | 色彩分级 | 自动化视频制作
每周安装次数
480
仓库
GitHub 星标数
76
首次出现
Jan 24, 2026
安全审计
安装于
opencode453
cursor439
gemini-cli438
codex438
github-copilot420
kimi-cli396
Expert in FFmpeg-based video editing, processing automation, and export optimization for modern content creation workflows.
✅ Use for :
❌ NOT for :
| Tool | Speed | Features | Use Case |
|---|---|---|---|
| FFmpeg | Very Fast | CLI automation | Production pipelines |
| MoviePy | Medium | Python API | Programmatic editing |
| PyAV | Fast | Low-level control | Custom processing |
| DaVinci Resolve | Slow | Full NLE | Manual editing |
Decision tree :
Need automation? → FFmpeg
Need Python API? → MoviePy
Need frame-level control? → PyAV
Need manual editing? → DaVinci Resolve
Novice thinking : "Just cut the video at any timestamp"
Problem : Causes artifacts, black frames, and playback issues.
Wrong approach :
# ❌ 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
Why wrong :
-c copy (stream copy) without keyframe alignment breaks playbackCorrect approach 1 : Re-encode for precise cuts
# ✅ 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)
Correct approach 2 : Keyframe-aligned stream copy
# ✅ 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
Correct approach 3 : Two-pass for best of both worlds
# ✅ 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)
Performance comparison :
| Method | Time (1-hour video) | Accuracy | Quality |
|---|---|---|---|
| Stream copy (arbitrary) | 2s | ❌ Broken | ❌ Artifacts |
| Stream copy (keyframe) | 2s | ±2s | ✅ Perfect |
| Re-encode (simple) | 15min | ✅ Frame | ⚠️ Quality loss |
| Two-pass (optimal) | 3min | ✅ Frame | ✅ Perfect |
Timeline context :
-c copy added for stream copyingNovice thinking : "Apply all edits in one FFmpeg command"
Problem : Multiple re-encodings cause cumulative quality loss.
Wrong approach :
# ❌ 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
Why wrong :
Correct approach 1 : Chain operations in single command
# ✅ 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
Correct approach 2 : Use stream copy when possible
# ✅ 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)
Quality comparison :
| Method | Encoding Passes | Quality (VMAF) | Time |
|---|---|---|---|
| 3x re-encode (CRF 23) | 3 | 82/100 | 45min |
| Single pass (CRF 23) | 1 | 91/100 | 15min |
| Stream copy + 1 encode | 1 | 95/100 | 18min |
| All stream copy | 0 | 100/100 | 30s |
Novice thinking : "Just concatenate videos together"
Problem : Color shifts, mismatched brightness, broken playback.
Wrong approach :
# ❌ 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
Why wrong :
Correct approach :
# ✅ 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
Color space guide :
| Standard | Color Space | Transfer | Primaries | Use Case |
|---|---|---|---|---|
| BT.601 | SD | bt470bg | bt470bg | Old SD content |
| BT.709 | HD | bt709 | bt709 | Modern HD/FHD |
| BT.2020 | UHD/HDR | smpte2084 | bt2020 | 4K HDR |
| sRGB | Web | iec61966-2-1 | bt709 | Web delivery |
Novice thinking : "Video and audio are separate, just overlay them"
Problem : Lip sync issues, audio drift, broken playback.
Wrong approach :
# ❌ 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
Why wrong :
Correct approach 1 : Stretch/compress audio to match video
# ✅ 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
Correct approach 2 : Precise offset and trim
# ✅ 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
Correct approach 3 : Mix multiple audio tracks with sync
# ✅ 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
Audio sync checklist :
□ 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
Novice thinking : "One export settings for everything"
Problem : Wasted bandwidth, poor quality, rejected uploads, compatibility issues.
Wrong approach :
# ❌ 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
Why wrong :
Correct approach : Platform-optimized exports
YouTube (recommended settings) :
# ✅ 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 video) :
# ✅ 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
Platform specs table :
| Platform | Max Size | Max Duration | Resolution | FPS | Bitrate | Codec |
|---|---|---|---|---|---|---|
| YouTube | Unlimited | Unlimited | 8K | 60 | Auto | 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 |
Export optimization checklist :
□ 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)
| Scenario | Appropriate? |
|---|---|
| Automated video pipeline (script → video) | ✅ Yes - FFmpeg automation |
| Batch process 100 videos | ✅ Yes - parallel FFmpeg jobs |
| Trim/cut clips programmatically | ✅ Yes - precise cutting |
| Add subtitles to videos | ✅ Yes - burn or soft subs |
| Color grade footage | ⚠️ Limited - basic only |
| Multi-cam editing | ❌ No - use DaVinci Resolve |
| Motion graphics | ❌ No - use After Effects |
| Real-time preview editing | ❌ No - use Premiere/Resolve |
/references/ffmpeg-guide.md - Complete FFmpeg command reference/references/timeline-editing.md - Timeline concepts, multi-track editing/references/export-optimization.md - Platform-specific export settingsscripts/video_editor.py - Cut, trim, concatenate, transitions, effectsscripts/batch_processor.py - Parallel batch video processingThis skill guides : Video editing | FFmpeg | Timeline editing | Transitions | Export optimization | Audio mixing | Color grading | Automated video production
Weekly Installs
480
Repository
GitHub Stars
76
First Seen
Jan 24, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode453
cursor439
gemini-cli438
codex438
github-copilot420
kimi-cli396
Google Workspace CLI 团队负责人技能:自动化站会、任务协调与团队沟通工具
6,300 周安装
PUA Skill:大厂文化驱动的AI Agent激励与绩效管理框架,提升Agent交付质量
2,000 周安装
Python类型注解模式指南:现代类型提示与Typing最佳实践
24 周安装
Web应用安全模式指南:OWASP Top 10防护、输入验证、身份认证与授权最佳实践
25 周安装
task-runner任务运行器:使用just简化项目命令执行,替代make的跨平台工具
30 周安装
EdgeOne Pages 一键部署:无需账户,秒级将HTML文件发布到公共URL
35 周安装
Vibe Security 安全扫描器 - 多语言代码漏洞检测与AI智能修复工具
38 周安装
| H.264 |
| TikTok | 287 MB | 10min | 1080x1920 | 30 | ~4 Mbps | H.264 |
| 5 GB | 10min | 1920x1080 | 30 | 5 Mbps | H.264 |
| Web | Varies | Varies | 1920x1080 | 30 | 2-5 Mbps | H.264 |