mcpField
F
ffmpeg

ffmpeg

github.com/digitalsamba创意与媒体2.4k11.9k 次安装今天更新
代码仓库

关于 ffmpeg

ffmpeg 是一项提供 FFmpeg 音视频处理命令示例的技能,并包含面向 Remotion 项目的处理方法。它帮助视频创作者转换、缩放、压缩、剪辑和变速素材,并为交付准备文件。

主要功能

  1. 01转换音视频格式
  2. 02缩放、裁剪和压缩视频
  3. 03提取音频并调整音量
  4. 04剪辑、拼接和添加淡入淡出
  5. 05调整播放速度并同步音频
  6. 06针对平台优化导出

适用场景

  1. 01将 GIF 转为 Remotion 可用的 MP4
  2. 02让演示录屏时长匹配旁白
  3. 03制作适用于网站和社交平台的文件

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/digitalsamba/claude-code-video-toolkit --skill ffmpeg

安装后在 Claude Code 中输入/ffmpeg确认已加载。

附带文件reference.md

详细介绍

用于视频制作的 FFmpeg

FFmpeg 是视频/音频处理的必备工具。本技能涵盖 Remotion 视频项目的常见操作。

快速参考

将 GIF 转换为 MP4(兼容 Remotion)
ffmpeg -i input.gif -movflags faststart -pix_fmt yuv420p \
  -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4

这些标志的作用:

  • -movflags faststart - 将元数据移至文件开头,以便通过网页流式传输
  • -pix_fmt yuv420p - 确保兼容大多数播放器
  • scale=trunc(...) - 强制使用偶数尺寸(大多数编解码器都要求如此)
调整视频大小
# To 1920x1080 (maintain aspect ratio, add black bars)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4

# To 1920x1080 (crop to fill)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080" output.mp4

# Scale to width, auto height
ffmpeg -i input.mp4 -vf "scale=1280:-2" output.mp4
压缩视频
# Good quality, smaller file (CRF 23 is default, lower = better quality)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4

# Aggressive compression for web preview
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset fast -c:a aac -b:a 96k output.mp4

# Target file size (e.g., ~10MB for 60s video = ~1.3Mbps)
ffmpeg -i input.mp4 -c:v libx264 -b:v 1300k -c:a aac -b:a 128k output.mp4
提取音频
# Extract to MP3
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3

# Extract to AAC
ffmpeg -i input.mp4 -vn -acodec aac -b:a 192k output.m4a

# Extract to WAV (uncompressed)
ffmpeg -i input.mp4 -vn output.wav
转换音频格式
# M4A to MP3 (for ElevenLabs voice samples)
ffmpeg -i input.m4a -codec:a libmp3lame -qscale:a 2 output.mp3

# WAV to MP3
ffmpeg -i input.wav -codec:a libmp3lame -b:a 192k output.mp3

# Adjust volume
ffmpeg -i input.mp3 -filter:a "volume=1.5" output.mp3
修剪/剪切视频
# Cut from timestamp to duration (recommended - reliable)
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c:v libx264 -c:a aac output.mp4

# Cut from timestamp to timestamp
ffmpeg -i input.mp4 -ss 00:00:30 -to 00:00:45 -c:v libx264 -c:a aac output.mp4

# Stream copy (faster but may lose frames at cut points)
# Only use when source has frequent keyframes
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c copy output.mp4

注意: 建议通过重新编码来修剪视频。流复制(-c copy)可能会在静默情况下丢弃视频,若跳转位置与关键帧不对齐。

加速/减慢
# 2x speed (video and audio)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4

# 0.5x speed (slow motion)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output.mp4

# Video only (no audio)
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -an output.mp4
拼接视频
# Create file list
echo "file 'clip1.mp4'" > list.txt
echo "file 'clip2.mp4'" >> list.txt
echo "file 'clip3.mp4'" >> list.txt

# Concatenate (same codec/resolution)
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

# Concatenate with re-encoding (different sources)
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -c:a aac output.mp4
添加淡入/淡出
# Fade in first 1 second, fade out last 1 second (30fps video)
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=1,fade=t=out:st=9:d=1" -c:a copy output.mp4

# Audio fade
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=1,afade=t=out:st=9:d=1" -c:v copy output.mp4
获取视频信息
# Duration, resolution, codec info
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4

# Full info
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

Remotion 专用模式

在 Remotion 中调整视频速度

何时使用 FFmpeg,何时使用 Remotion 的 playbackRate:

场景使用 FFmpeg使用 Remotion
恒定速度(1.5x、2x)两者均可✅ 更简单
极端速度(>4x 或 <0.25x)✅ 更可靠可能会有问题
变速(随时间加速)✅ 预处理需要复杂的变通方案
需要完美的音频同步✅ 可确保通常没问题
演示需要匹配旁白时长✅ 预先计算运行时调整

Remotion 的限制: playbackRate 必须是常量。像 playbackRate={interpolate(frame, [0, 100], [1, 5])} 这样的动态插值无法正常工作,因为 Remotion 会独立计算各帧。

# Speed up demo to fit a scene (e.g., 60s demo into 20s = 3x speed)
ffmpeg -i demo-raw.mp4 \
  -filter_complex "[0:v]setpts=0.333*PTS[v];[0:a]atempo=3.0[a]" \
  -map "[v]" -map "[a]" \
  public/demos/demo-fast.mp4

# Slow motion for emphasis (0.5x speed)
ffmpeg -i action.mp4 \
  -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" \
  -map "[v]" -map "[a]" \
  public/demos/action-slow.mp4

# Speed up without audio (common for screen recordings)
ffmpeg -i demo.mp4 -filter:v "setpts=0.5*PTS" -an public/demos/demo-2x.mp4

# Timelapse effect (10x speed, drop audio)
ffmpeg -i long-demo.mp4 -filter:v "setpts=0.1*PTS" -an public/demos/timelapse.mp4

计算速度系数:

  • 将 X 秒的视频压缩到 Y 秒的场景中:speed = X / Y
  • setpts 乘数 = 1 / speed(例如,3x 速度 = setpts=0.333*PTS)
  • atempo 值 = speed(例如,3x 速度 = atempo=3.0)

极端速度(音频 >2x): 串联 atempo 滤镜(每个滤镜的范围限制为 0.5-2.0):

# 4x speed audio
-filter_complex "[0:a]atempo=2.0,atempo=2.0[a]"

# 8x speed audio
-filter_complex "[0:a]atempo=2.0,atempo=2.0,atempo=2.0[a]"
为 Remotion 准备演示录制
# Standard 1080p, 30fps, Remotion-ready
ffmpeg -i raw-recording.mp4 \
  -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30" \
  -c:v libx264 -crf 18 -preset slow \
  -c:a aac -b:a 192k \
  -movflags faststart \
  public/demos/demo.mp4
将屏幕录制转换为 Remotion 资源
# From iPhone/iPad recording (usually 60fps, variable resolution)
ffmpeg -i iphone-recording.mov \
  -vf "scale=1920:-2,fps=30" \
  -c:v libx264 -crf 20 \
  -an \
  public/demos/mobile-demo.mp4
批量转换 GIF
for f in assets/*.gif; do
  ffmpeg -i "$f" -movflags faststart -pix_fmt yuv420p \
    -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" \
    "public/demos/$(basename "$f" .gif).mp4"
done

常见问题

“高度不能被 2 整除”

添加缩放滤镜:-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"

视频无法在浏览器中播放

使用:-movflags faststart -pix_fmt yuv420p -c:v libx264

更改速度后音频不同步

使用带有 atempo 的 filter_complex:-filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]"

文件太大

提高 CRF(23→28)或降低分辨率

质量指南

用途CRF预设备注
归档/母版18slow质量最佳,文件较大
生产20-22medium平衡性好
网页/预览23-25fast文件较小
草稿/快速处理28+veryfast编码速度快

针对平台优化输出

Remotion 渲染视频后(通常输出到 out/video.mp4),使用 FFmpeg 针对各个分发平台进行优化。

工作流集成
Remotion render (master)     FFmpeg optimization      Platform upload
       ↓                            ↓                       ↓
   out/video.mp4  ────────→  out/video-youtube.mp4  ───→  YouTube
                  ────────→  out/video-twitter.mp4  ───→  Twitter/X
                  ────────→  out/video-linkedin.mp4 ───→  LinkedIn
                  ────────→  out/video-web.mp4      ───→  Website embed
YouTube(推荐设置)

YouTube 会重新编码所有内容,因此请上传高质量视频:

# YouTube optimized (1080p)
ffmpeg -i out/video.mp4 \
  -c:v libx264 -preset slow -crf 18 \
  -profile:v high -level 4.0 \
  -bf 2 -g 30 \
  -c:a aac -b:a 192k -ar 48000 \
  -movflags +faststart \
  out/video-youtube.mp4

# YouTube Shorts (vertical 1080x1920)
ffmpeg -i out/video.mp4 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
  -c:v libx264 -crf 18 -c:a aac -b:a 192k \
  out/video-shorts.mp4
Twitter/X

Twitter 有严格的限制:最长 140s、最大 512MB、最高 1920x1200:

# Twitter optimized (under 15MB target for fast upload)
ffmpeg -i out/video.mp4 \
  -c:v libx264 -preset medium -crf 24 \
  -profile:v main -level 3.1 \
  -vf "scale='min(1280,iw)':'min(720,ih)':force_original_aspect_ratio=decrease" \
  -c:a aac -b:a 128k -ar 44100 \
  -movflags +faststart \
  -fs 15M \
  out/video-twitter.mp4

# Check file size and duration
ffprobe -v error -show_entries format=duration,size -of csv=p=0 out/video-twitter.mp4
LinkedIn

LinkedIn 更适合使用带 AAC 音频的 MP4,最长 10 分钟:

# LinkedIn optimized
ffmpeg -i out/video.mp4 \
  -c:v libx264 -preset medium -crf 22 \
  -profile:v main \
  -vf "scale='min(1920,iw)':'min(1080,ih)':force_original_aspect_ratio=decrease" \
  -c:a aac -b:a 192k -ar 48000 \
  -movflags +faststart \
  out/video-linkedin.mp4
网站/嵌入式(针对快速加载进行优化)
# Web-optimized MP4 (small file, progressive loading)
ffmpeg -i out/video.mp4 \
  -c:v libx264 -preset medium -crf 26 \
  -profile:v baseline -level 3.0 \
  -vf "scale=1280:720" \
  -c:a aac -b:a 128k \
  -movflags +faststart \
  out/video-web.mp4

# WebM alternative (better compression, wider browser support)
ffmpeg -i out/video.mp4 \
  -c:v libvpx-vp9 -crf 30 -b:v 0 \
  -vf "scale=1280:720" \
  -c:a libopus -b:a 128k \
  -deadline good \
  out/video-web.webm
GIF(用于预览/缩略图)
# High-quality GIF (first 5 seconds)
ffmpeg -i out/video.mp4 -t 5 \
  -vf "fps=15,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
  out/preview.gif

# Smaller file GIF
ffmpeg -i out/video.mp4 -t 3 \
  -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
  out/preview-small.gif
平台要求速查
平台最大分辨率最大大小最长时长音频
YouTube8K256GB12 小时AAC 48kHz
Twitter/X1920x1200512MB140sAAC 44.1kHz
LinkedIn4096x23045GB10 分钟AAC 48kHz
Instagram Feed1080x13504GB60sAAC 48kHz
Instagram Reels1080x19204GB90sAAC 48kHz
TikTok1080x1920287MB10 分钟AAC
为所有平台批量导出
#!/bin/bash
# save as: export-all-platforms.sh
INPUT="out/video.mp4"

# YouTube (high quality)
ffmpeg -i "$INPUT" -c:v libx264 -preset slow -crf 18 \
  -c:a aac -b:a 192k -movflags +faststart \
  out/video-youtube.mp4

# Twitter (compressed)
ffmpeg -i "$INPUT" -c:v libx264 -crf 24 \
  -vf "scale='min(1280,iw)':'-2'" \
  -c:a aac -b:a 128k -movflags +faststart \
  out/video-twitter.mp4

# LinkedIn
ffmpeg -i "$INPUT" -c:v libx264 -crf 22 \
  -c:a aac -b:a 192k -movflags +faststart \
  out/video-linkedin.mp4

# Web embed (small)
ffmpeg -i "$INPUT" -c:v libx264 -crf 26 \
  -vf "scale=1280:720" \
  -c:a aac -b:a 128k -movflags +faststart \
  out/video-web.mp4

echo "Exported:"
ls -lh out/video-*.mp4

错误处理

处理视频时的常见错误及修复方法:

# Check if FFmpeg succeeded
ffmpeg -i input.mp4 -c:v libx264 output.mp4 && echo "Success" || echo "Failed: check input file"

# Validate output file is playable
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 output.mp4

# Get detailed error info
ffmpeg -v error -i input.mp4 -f null - 2>&1 | head -20
处理常见故障
错误原因修复方法
"No such file"输入路径错误检查路径,路径中有空格时使用引号
"Invalid data"输入文件损坏重新下载或重新录制源文件
"height not divisible by 2"尺寸为奇数添加带有 trunc 的 scale 滤镜
"encoder not found"缺少编解码器安装包含完整编解码器的 FFmpeg
输出为 0 字节未提示的失败检查完整的 ffmpeg 输出,查看错误信息

反馈与贡献

如果此技能缺少信息或有改进空间:

  • 缺少某个命令? 请描述你需要什么
  • 发现错误? 请告诉我哪里有问题
  • 想要贡献? 我可以帮你:
    1. 改进此技能
    2. 向 github.com/digitalsamba/claude-code-video-toolkit 提交 PR

只需说“改进此技能”,我会指导你更新 .claude/skills/ffmpeg/SKILL.md。

评论

支持 Markdown