video-processing-editing
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseVideo Processing & Editing
视频处理与编辑
Expert in FFmpeg-based video editing, processing automation, and export optimization for modern content creation workflows.
专注于基于FFmpeg的视频编辑、处理自动化,以及适配现代内容创作工作流的导出优化方案。
When to Use
适用场景
✅ Use for:
- Automated video editing pipelines (script-to-video)
- Cutting, trimming, concatenating clips
- Adding transitions, effects, overlays
- Audio mixing and normalization
- Subtitle/caption handling
- Export optimization for platforms
- Batch video processing
- Color grading and correction
❌ NOT for:
- Real-time video editing UI (use DaVinci Resolve/Premiere)
- 3D compositing (use After Effects/Blender)
- Motion graphics animation (use After Effects)
- Basic screen recording (use OBS)
✅ 适用场景:
- 自动化视频编辑流水线(脚本转视频)
- 视频剪辑、裁剪与片段拼接
- 添加转场、特效与叠加层
- 音频混音与标准化处理
- 字幕/字幕文件处理
- 适配平台的导出优化
- 批量视频处理
- 色彩分级与校正
❌ 不适用场景:
- 实时视频编辑UI(推荐使用DaVinci Resolve/Premiere)
- 3D合成(推荐使用After Effects/Blender)
- 动态图形动画(推荐使用After Effects)
- 基础屏幕录制(推荐使用OBS)
Technology Selection
技术选型
Video Editing Tools
视频编辑工具
| 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| 工具 | 速度 | 功能 | 适用场景 |
|---|---|---|---|
| FFmpeg | 极快 | CLI自动化 | 生产流水线 |
| MoviePy | 中等 | Python API | 程序化编辑 |
| PyAV | 快速 | 底层控制 | 自定义处理 |
| DaVinci Resolve | 缓慢 | 完整非线性编辑系统 | 手动编辑 |
决策树:
需要自动化? → FFmpeg
需要Python API? → MoviePy
需要帧级控制? → PyAV
需要手动编辑? → DaVinci ResolveCommon Anti-Patterns
常见反模式
Anti-Pattern 1: Not Using Keyframe-Aligned Cuts
反模式1:未使用关键帧对齐裁剪
Novice thinking: "Just cut the video at any timestamp"
Problem: Causes artifacts, black frames, and playback issues.
Wrong approach:
bash
undefined新手误区:“直接在任意时间点裁剪视频”
问题:导致画面失真、黑帧及播放异常。
错误示例:
bash
undefined❌ 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
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**:
- Video codecs use keyframes (I-frames) every 2-10 seconds
- Non-keyframe cuts require re-encoding
- Using `-c copy` (stream copy) without keyframe alignment breaks playback
- GOP (Group of Pictures) structure depends on keyframes
**Correct approach 1**: Re-encode for precise cuts
```bash
**问题原因**:
- 视频编码每2-10秒生成一个关键帧(I帧)
- 非关键帧裁剪需要重新编码
- 使用`-c copy`(流复制)但未对齐关键帧会破坏播放
- GOP(图像组)结构依赖关键帧
**正确方案1:重新编码实现精准裁剪**
```bash✅ 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
-c:v libx264 -crf 18 -preset medium
-c:a aac -b:a 192k
output.mp4
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
-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
```bash
**正确方案2:关键帧对齐的流复制**
```bash✅ Fast cutting with keyframe alignment
✅ 基于关键帧对齐的快速裁剪
Step 1: Find keyframes near cut points
步骤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}'
-of csv input.mp4 | grep ",1$" | awk -F',' '{print $2}'
ffprobe -select_streams v -show_frames -show_entries frame=pkt_pts_time,key_frame
-of csv input.mp4 | grep ",1$" | awk -F',' '{print $2}'
-of csv input.mp4 | grep ",1$" | awk -F',' '{print $2}'
Step 2: Cut at nearest keyframes (fast, no re-encoding)
步骤2:在最近的关键帧位置裁剪(快速,无需重新编码)
ffmpeg -i input.mp4 -ss 00:01:22.000 -to 00:02:46.000 -c copy output.mp4
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
```bash
**正确方案3:双阶段裁剪兼顾速度与精度**
```bash✅ 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 00:00:03.456 -to 00:01:25.678
-c:v libx264 -crf 18 -preset medium
-c:a aac -b:a 192k
output.mp4
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 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 放在 -i 之前:快速跳转到关键帧(无需解码)
-ss AFTER -i: Precise trim (only decode needed portion)
-ss 放在 -i 之后:精准裁剪(仅解码所需片段)
**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**:
- 2010: FFmpeg required full re-encoding for cuts
- 2015: `-c copy` added for stream copying
- 2020: Two-pass cutting became best practice
- 2024: Hardware acceleration (NVENC) makes re-encoding viable
---
**性能对比**:
| 方法 | 处理1小时视频耗时 | 精度 | 画质 |
|--------|---------------------|----------|---------|
| 任意时间点流复制 | 2秒 | ❌ 播放异常 | ❌ 画面失真 |
| 关键帧对齐流复制 | 2秒 | ±2秒 | ✅ 完美 |
| 简单重新编码 | 15分钟 | ✅ 帧级精准 | ⚠️ 画质损失 |
| 双阶段最优方案 | 3分钟 | ✅ 帧级精准 | ✅ 完美 |
**时间线背景**:
- 2010年:FFmpeg裁剪需完全重新编码
- 2015年:新增`-c copy`支持流复制
- 2020年:双阶段裁剪成为最佳实践
- 2024年:硬件加速(NVENC)让重新编码更可行
---Anti-Pattern 2: Re-encoding Unnecessarily
反模式2:不必要的重复编码
Novice thinking: "Apply all edits in one FFmpeg command"
Problem: Multiple re-encodings cause cumulative quality loss.
Wrong approach:
bash
undefined新手误区:“用多个FFmpeg命令依次完成所有编辑”
问题:多次重新编码导致画质累积损失。
错误示例:
bash
undefined❌ Re-encode for each operation (quality degradation)
❌ 每次操作都重新编码(画质持续下降)
Operation 1: Trim
操作1:裁剪
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:05:00
-c:v libx264 -crf 23 temp1.mp4
-c:v libx264 -crf 23 temp1.mp4
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:05:00
-c:v libx264 -crf 23 temp1.mp4
-c:v libx264 -crf 23 temp1.mp4
Operation 2: Add audio
操作2:添加音频
ffmpeg -i temp1.mp4 -i audio.mp3 -c:v libx264 -crf 23
-map 0:v -map 1:a temp2.mp4
-map 0:v -map 1:a temp2.mp4
ffmpeg -i temp1.mp4 -i audio.mp3 -c:v libx264 -crf 23
-map 0:v -map 1:a temp2.mp4
-map 0:v -map 1:a temp2.mp4
Operation 3: Add subtitles
操作3:添加字幕
ffmpeg -i temp2.mp4 -vf subtitles=subs.srt
-c:v libx264 -crf 23 output.mp4
-c:v libx264 -crf 23 output.mp4
ffmpeg -i temp2.mp4 -vf subtitles=subs.srt
-c:v libx264 -crf 23 output.mp4
-c:v libx264 -crf 23 output.mp4
Result: 3x re-encoding = significant quality loss
结果:3次重新编码 = 画质显著下降
**Why wrong**:
- Each re-encode is lossy (even with high CRF)
- Cumulative quality loss (generation loss)
- 3x encoding time
- Wasted disk I/O
**Correct approach 1**: Chain operations in single command
```bash
**问题原因**:
- 每次重新编码都是有损的(即使使用高CRF值)
- 累积画质损失(代际损失)
- 编码耗时是单次的3倍
- 浪费磁盘I/O资源
**正确方案1:单命令链式执行所有操作**
```bash✅ 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
-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
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
-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
```bash
**正确方案2:尽可能使用流复制**
```bash✅ Lossless operations with stream copy
✅ 无损操作优先使用流复制
Trim (stream copy)
裁剪(流复制)
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:05:00 -c copy temp.mp4
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
-map 0:v -map 1:a
-c:v copy -c:a aac -b:a 192k
temp2.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
-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
-c:v libx264 -crf 18 -preset medium
-c:a copy
output.mp4
ffmpeg -i temp2.mp4 -vf subtitles=subs.srt
-c:v libx264 -crf 18 -preset medium
-c:a copy
output.mp4
-c:v libx264 -crf 18 -preset medium
-c:a copy
output.mp4
Only 1 video re-encode (for subtitles)
仅视频重新编码1次(用于嵌入字幕)
**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 |
---
**画质对比**:
| 方法 | 编码次数 | VMAF画质评分 | 耗时 |
|--------|-----------------|----------------|------|
| 3次重新编码(CRF 23) | 3 | 82/100 | 45分钟 |
| 单次编码(CRF 23) | 1 | 91/100 | 15分钟 |
| 流复制+1次编码 | 1 | 95/100 | 18分钟 |
| 全流复制 | 0 | 100/100 | 30秒 |
---Anti-Pattern 3: Ignoring Color Space Conversions
反模式3:忽略色彩空间转换
Novice thinking: "Just concatenate videos together"
Problem: Color shifts, mismatched brightness, broken playback.
Wrong approach:
bash
undefined新手误区:“直接拼接所有视频片段”
问题:画面色彩偏移、亮度不匹配、播放异常。
错误示例:
bash
undefined❌ Concatenate videos with different color spaces
❌ 直接拼接不同色彩空间的视频
clip1.mp4: BT.709 (HD), yuv420p
clip1.mp4: BT.709(高清),yuv420p
clip2.mp4: BT.601 (SD), yuvj420p (full range)
clip2.mp4: BT.601标清),yuvj420p(全范围)
clip3.mp4: BT.2020 (HDR), yuv420p10le
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
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
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
Result: Color shifts between clips, broken HDR metadata
结果:片段间色彩偏移,HDR元数据损坏
**Why wrong**:
- Different color spaces (BT.601 vs BT.709 vs BT.2020)
- Different pixel formats (yuv420p vs yuvj420p)
- Different color ranges (limited vs full)
- Metadata conflicts
**Correct approach**:
```bash
**问题原因**:
- 色彩空间不同(BT.601、BT.709、BT.2020)
- 像素格式不同(yuv420p、yuvj420p)
- 色彩范围不同(有限范围、全范围)
- 元数据冲突
**正确方案**:
```bash✅ Normalize color space before concatenation
✅ 拼接前统一色彩空间
Step 1: Analyze color space of each clip
步骤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
-show_entries stream=color_space,color_transfer,color_primaries,pix_fmt
-of default=noprint_wrappers=1 clip1.mp4
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
-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
步骤2:将所有片段统一到目标色彩空间
Target: BT.709 (HD), yuv420p, limited range
目标:BT.709(高清),yuv420p,有限范围
Normalize clip1 (already BT.709)
片段1已为BT.709,直接复制
ffmpeg -i clip1.mp4 -c copy clip1_normalized.mp4
ffmpeg -i clip1.mp4 -c copy clip1_normalized.mp4
Normalize clip2 (BT.601 SD → BT.709 HD)
片段2(BT.601标清 → BT.709高清)
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
-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
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
-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)
片段3(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
-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
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
-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
步骤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
**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 |
---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 | 标清 | bt470bg | bt470bg | 旧标清内容 |
| BT.709 | 高清 | bt709 | bt709 | 现代高清/全高清内容 |
| BT.2020 | 超高清/HDR | smpte2084 | bt2020 | 4K HDR内容 |
| sRGB | 网页 | iec61966-2-1 | bt709 | 网页分发 |
---Anti-Pattern 4: Poor Audio Sync
反模式4:音频同步不良
Novice thinking: "Video and audio are separate, just overlay them"
Problem: Lip sync issues, audio drift, broken playback.
Wrong approach:
bash
undefined新手误区:“视频和音频是分开的,直接叠加即可”
问题:唇形同步错误、音频漂移、播放异常。
错误示例:
bash
undefined❌ 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
-map 0:v -map 1:a
-c:v copy -c:a copy
output.mp4
ffmpeg -i video.mp4 -i audio.mp3
-map 0:v -map 1:a
-c:v copy -c:a copy
output.mp4
-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**:
- Audio and video have different durations
- No timebase synchronization
- No drift correction
- Ignores original audio sync
**Correct approach 1**: Stretch/compress audio to match video
```bash
**问题原因**:
- 音频与视频时长不一致
- 未同步时间基准
- 未校正漂移
- 忽略原始音频同步关系
**正确方案1:拉伸/压缩音频匹配视频时长**
```bash✅ 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)
-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)
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)
-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)
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
-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
```bashffmpeg -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
-filter_complex "[1:a]atempo=${RATIO}[a]"
-map 0:v -map "[a]"
-c:v copy -c:a aac -b:a 192k
output.mp4
**正确方案2:精准偏移与裁剪**
```bash✅ Sync audio with offset and trim
✅ 通过偏移与裁剪实现音频同步
Audio starts 0.5s late, trim to match video
音频延迟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
-map 0:v -map 1:a
-shortest
-c:v copy -c:a aac -b:a 192k
output.mp4
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
-map 0:v -map 1:a
-shortest
-c:v copy -c:a aac -b:a 192k
output.mp4
-itsoffset: Delay audio by 0.5s
-itsoffset:将音频延迟0.5秒
-shortest: Trim to shortest stream
-shortest:裁剪至最短流的时长
**Correct approach 3**: Mix multiple audio tracks with sync
```bash
**正确方案3:多音轨同步混音**
```bash✅ 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
-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
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
-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
adelay:毫秒级精准定时
amix: Mix multiple audio streams
amix:混合多音轨
volume: Normalize levels
volume:标准化音量
**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
---
**音频同步检查清单**:□ 验证视频与音频时长匹配
□ 使用-shortest避免音频过长
□ 用adelay实现精准时间偏移
□ 用atempo调整速度(保持音调)
□ 合理设置音频比特率(128k-256k)
□ 在开头、中间、结尾测试唇形同步
---Anti-Pattern 5: Wrong Codec/Bitrate for Platform
反模式5:导出设置不符合平台要求
Novice thinking: "One export settings for everything"
Problem: Wasted bandwidth, poor quality, rejected uploads, compatibility issues.
Wrong approach:
bash
undefined新手误区:“一套导出设置适配所有平台”
问题:带宽浪费、画质不佳、上传被拒、兼容性问题。
错误示例:
bash
undefined❌ Export everything at 4K 50 Mbps
❌ 所有内容都导出为4K 50 Mbps
ffmpeg -i input.mp4
-c:v libx264 -b:v 50M -s 3840x2160
-c:a aac -b:a 320k
output.mp4
-c:v libx264 -b:v 50M -s 3840x2160
-c:a aac -b:a 320k
output.mp4
ffmpeg -i input.mp4
-c:v libx264 -b:v 50M -s 3840x2160
-c:a aac -b:a 320k
output.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)
对于Instagram故事:文件达2GB,超出上限(最大100MB)被拒
For YouTube: Could use 10 Mbps and look identical
对于YouTube:用10 Mbps即可达到相同画质
For Twitter: Exceeds bitrate limits
对于Twitter:超出比特率限制
**Why wrong**:
- Platform-specific size/bitrate limits
- Over-encoding wastes bandwidth
- Wrong resolution for platform
- Incompatible codecs
**Correct approach**: Platform-optimized exports
**YouTube (recommended settings)**:
```bash
**问题原因**:
- 平台有特定的大小/比特率限制
- 过度编码浪费带宽
- 分辨率不符合平台要求
- 编码格式不兼容
**正确方案:针对平台优化导出设置**
**YouTube(推荐设置)**:
```bash✅ YouTube 1080p upload
✅ 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
-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
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
-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
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
-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)**:
```bashffmpeg -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
-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、动态)**:
```bash✅ Instagram Story (9:16, max 100 MB, 15s)
✅ Instagram故事(9:16,最大100MB,15秒)
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
-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
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
-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)
✅ Instagram Reel(9:16,最大90秒)
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
-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
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
-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)
✅ 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
-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**:
```bashffmpeg -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
-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**:
```bash✅ Twitter video (max 512 MB, 2:20)
✅ Twitter视频(最大512MB,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
-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**:
```bashffmpeg -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
-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**:
```bash✅ TikTok (9:16, max 287 MB, 10 min)
✅ TikTok(9:16,最大287MB,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
-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)**:
```bashffmpeg -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
-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视频)**:
```bash✅ 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
-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 |
| Twitter | 512 MB | 2:20 | 1920x1080 | 60 | 5 Mbps | H.264 |
| TikTok | 287 MB | 10min | 1080x1920 | 30 | ~4 Mbps | H.264 |
| LinkedIn | 5 GB | 10min | 1920x1080 | 30 | 5 Mbps | H.264 |
| Web | Varies | Varies | 1920x1080 | 30 | 2-5 Mbps | H.264 |
**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
---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
-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
**平台规格表**:
| 平台 | 最大文件大小 | 最长时长 | 分辨率 | 帧率 | 比特率 | 编码格式 |
|----------|----------|--------------|------------|-----|---------|-------|
| YouTube | 无限制 | 无限制 | 8K | 60 | 自动 | H.264/VP9 |
| Instagram故事 | 100MB | 15秒 | 1080x1920 | 30 | ~5 Mbps | H.264 |
| Instagram Reel | 1GB | 90秒 | 1080x1920 | 30 | ~8 Mbps | H.264 |
| Twitter | 512MB | 2分20秒 | 1920x1080 | 60 | 5 Mbps | H.264 |
| TikTok | 287MB | 10分钟 | 1080x1920 | 30 | ~4 Mbps | H.264 |
| LinkedIn | 5GB | 10分钟 | 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
□ 导出前在目标平台测试播放
---Production Checklist
生产环境检查清单
□ 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命令链式执行操作
□ 拼接前统一色彩空间
□ 验证音视频同步(多节点测试)
□ 使用平台专属导出预设
□ 网页分发添加-movflags +faststart
□ 设置正确的色彩元数据(高清用bt709)
□ 在目标平台测试输出文件
□ 保留无损中间文件(ProRes、FFV1)
□ 批量任务使用硬件加速(NVENC、VideoToolbox)When to Use vs Avoid
适用与不适用场景对比
| 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 |
| 场景 | 是否适用 |
|---|---|
| 自动化视频流水线(脚本→视频) | ✅ 是 - FFmpeg自动化 |
| 批量处理100个视频 | ✅ 是 - 并行FFmpeg任务 |
| 程序化裁剪/剪辑视频 | ✅ 是 - 精准裁剪 |
| 为视频添加字幕 | ✅ 是 - 嵌入或软字幕 |
| 视频色彩分级 | ⚠️ 有限支持 - 仅基础功能 |
| 多机位编辑 | ❌ 否 - 使用DaVinci Resolve |
| 动态图形制作 | ❌ 否 - 使用After Effects |
| 实时预览编辑 | ❌ 否 - 使用Premiere/Resolve |
References
参考资料
- - Complete FFmpeg command reference
/references/ffmpeg-guide.md - - Timeline concepts, multi-track editing
/references/timeline-editing.md - - Platform-specific export settings
/references/export-optimization.md
- - 完整FFmpeg命令参考
/references/ffmpeg-guide.md - - 时间轴概念、多轨编辑
/references/timeline-editing.md - - 平台专属导出设置
/references/export-optimization.md
Scripts
脚本
- - Cut, trim, concatenate, transitions, effects
scripts/video_editor.py - - Parallel batch video processing
scripts/batch_processor.py
This skill guides: Video editing | FFmpeg | Timeline editing | Transitions | Export optimization | Audio mixing | Color grading | Automated video production
- - 裁剪、拼接、转场、特效处理
scripts/video_editor.py - - 并行批量视频处理
scripts/batch_processor.py
本技能涵盖:视频编辑 | FFmpeg | 时间轴编辑 | 转场效果 | 导出优化 | 音频混音 | 色彩分级 | 自动化视频生产