Communitygithub.com

aelyraAI/ffmpeg

使用 FFmpeg 进行视频和音频处理。适用于格式转换、尺寸调整、压缩、音频提取以及为 Remotion 准备素材。触发条件包括将 GIF 转换为 MP4、调整视频大小、提取音频、压缩文件或任何媒体转换任务。

ffmpeg 是什么?

该 AI 智能体技能旨在提供一个全面的 FFmpeg 命令参考,专门针对 Remotion 视频制作项目进行优化。它涵盖了从基础的 GIF 转 MP4、视频压缩、音频提取,到更高级的 Remotion 特定工作流(如速度调整、演示录制准备和多平台输出优化)等所有关键操作。技能的核心价值在于它不仅是命令手册,还提供了针对不同平台(YouTube、Twitter、LinkedIn)的最佳压缩参数、常见的错误处理和解决方案,以及如何将 Remotion 渲染的母版视频高效导出为各平台所需格式的完整工作流程。它支持所有常见的媒体处理任务,并详细解释了每个标志的作用,帮助用户理解而非盲目复制命令。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aelyraAI/aelyra-skills/tree/HEAD/ffmpeg

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

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(...) - 强制偶数尺寸(大多数编解码器要求)

调整视频大小

# 调整为 1920x1080(保持宽高比,添加黑边)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4

# 调整为 1920x1080(裁剪填充)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080" output.mp4

# 按宽度缩放,自动计算高度
ffmpeg -i input.mp4 -vf "scale=1280:-2" output.mp4

压缩视频

# 高质量,较小文件(CRF 23 为默认值,值越小质量越好)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4

# 激进压缩,用于网页预览
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset fast -c:a aac -b:a 96k output.mp4

# 目标文件大小(例如,60 秒视频约 10MB ≈ 1.3Mbps)
ffmpeg -i input.mp4 -c:v libx264 -b:v 1300k -c:a aac -b:a 128k output.mp4

提取音频

# 提取为 MP3
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3

# 提取为 AAC
ffmpeg -i input.mp4 -vn -acodec aac -b:a 192k output.m4a

# 提取为 WAV(未压缩)
ffmpeg -i input.mp4 -vn output.wav

转换音频格式

# M4A 转 MP3(用于 ElevenLabs 语音样本)
ffmpeg -i input.m4a -codec:a libmp3lame -qscale:a 2 output.mp3

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

# 调整音量
ffmpeg -i input.mp3 -filter:a "volume=1.5" output.mp3

剪辑/裁剪视频

# 从时间戳开始,按持续时间剪切(推荐,可靠)
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c:v libx264 -c:a aac output.mp4

# 从一个时间戳剪切到另一个时间戳
ffmpeg -i input.mp4 -ss 00:00:30 -to 00:00:45 -c:v libx264 -c:a aac output.mp4

# 流复制(更快,但可能在剪切点丢失帧)
# 仅当源文件具有频繁的关键帧时使用
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c copy output.mp4

注意: 推荐使用重新编码进行剪辑。流复制(-c copy)如果查找点未与关键帧对齐,可能会静默丢失视频部分。

加速/减速

# 2 倍速(视频和音频)
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.5 倍速(慢动作)
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

# 仅视频(无音频)
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -an output.mp4

拼接视频

# 创建文件列表
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

# 拼接并重新编码(不同源)
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -c:a aac output.mp4

添加淡入/淡出

# 前 1 秒淡入,后 1 秒淡出(30fps 视频)
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=1,fade=t=out:st=9:d=1" -c:a copy output.mp4

# 音频淡入淡出
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=1,afade=t=out:st=9:d=1" -c:v copy output.mp4

获取视频信息

# 时长、分辨率、编解码器信息
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4

# 完整信息
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

Remotion 特定模式

Remotion 的视频速度调整

何时使用 FFmpeg 与 Remotion 的 playbackRate:

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

Remotion 限制: playbackRate 必须为常数。像 playbackRate={interpolate(frame, [0, 100], [1, 5])} 这样的动态插值将无法正常工作,因为 Remotion 独立评估每一帧。

# 加速演示以匹配场景时长(例如,60 秒演示放入 20 秒场景 = 3 倍速)
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

# 慢动作用于强调(0.5 倍速)
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

# 加速但不包含音频(屏幕录制常见)
ffmpeg -i demo.mp4 -filter:v "setpts=0.5*PTS" -an public/demos/demo-2x.mp4

# 延时摄影效果(10 倍速,丢弃音频)
ffmpeg -i long-demo.mp4 -filter:v "setpts=0.1*PTS" -an public/demos/timelapse.mp4

计算速度因子:

  • 要将 X 秒视频放入 Y 秒场景:speed = X / Y
  • setpts 乘数 = 1 / speed(例如,3 倍速 = setpts=0.333*PTS)
  • atempo 值 = speed(例如,3 倍速 = atempo=3.0)

极端速度(>2 倍音频): 链式使用 atempo 滤镜(每个限制在 0.5-2.0 范围内):

# 4 倍速音频
-filter_complex "[0:a]atempo=2.0,atempo=2.0[a]"

# 8 倍速音频
-filter_complex "[0:a]atempo=2.0,atempo=2.0,atempo=2.0[a]"

为 Remotion 准备演示录制

# 标准 1080p,30fps,Remotion 就绪
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 素材

# 来自 iPhone/iPad 录制(通常为 60fps,可变分辨率)
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

常见问题

"Height not divisible by 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预设 (Preset)备注
存档/母版18slow最佳质量,文件大
成品20-22medium良好平衡
网页/预览23-25fast较小文件
草稿/快速28+veryfast快速编码

平台特定的输出优化

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

工作流集成

Remotion 渲染(母版)     FFmpeg 优化      平台上传
       ↓                            ↓                       ↓
   out/video.mp4  ────────→  out/video-youtube.mp4  ───→  YouTube
                  ────────→  out/video-twitter.mp4  ───→  Twitter/X
                  ────────→  out/video-linkedin.mp4 ───→  LinkedIn
                  ────────→  out/video-web.mp4      ───→  网站嵌入

YouTube(推荐设置)

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

# YouTube 优化(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(竖屏 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 有严格限制:最长 140 秒,最大 512MB,1920x1200:

# Twitter 优化(目标 15MB 以下,以便快速上传)
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

# 检查文件大小和时长
ffprobe -v error -show_entries format=duration,size -of csv=p=0 out/video-twitter.mp4

LinkedIn

LinkedIn 偏好使用 AAC 音频的 MP4,最长 10 分钟:

# LinkedIn 优化
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

网站/嵌入(针对快速加载优化)

# 网络优化 MP4(小文件,渐进式加载)
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 替代方案(更好的压缩,更广泛的浏览器支持)
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(用于预览/缩略图)

# 高质量 GIF(前 5 秒)
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

# 更小文件的 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/X1920x1200512MB140 秒AAC 44.1kHz
LinkedIn4096x23045GB10 分钟AAC 48kHz
Instagram Feed1080x13504GB60 秒AAC 48kHz
Instagram Reels1080x19204GB90 秒AAC 48kHz
TikTok1080x1920287MB10 分钟AAC

批量导出到所有平台

#!/bin/bash
# 保存为:export-all-platforms.sh
INPUT="out/video.mp4"

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

# Twitter(压缩后)
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

# 网站嵌入(小文件)
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 "已导出:"
ls -lh out/video-*.mp4

错误处理

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

# 检查 FFmpeg 是否成功
ffmpeg -i input.mp4 -c:v libx264 output.mp4 && echo "成功" || echo "失败:请检查输入文件"

# 验证输出文件是否可播放
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 output.mp4

# 获取详细错误信息
ffmpeg -v error -i input.mp4 -f null - 2>&1 | head -20

处理常见失败情况

错误原因修复
"No such file"输入路径错误检查路径,路径中有空格时使用引号
"Invalid data"输入文件损坏重新下载或重新录制源文件
"height not divisible by 2"奇数尺寸添加带有 trunc 的缩放滤镜
"encoder not found"缺少编解码器安装包含完整编解码器的 FFmpeg
输出为 0 字节静默失败检查完整的 ffmpeg 输出以查找错误

反馈与贡献

如果本技能缺少某些信息或可以改进:

  • 缺少命令? 描述您需要的内容
  • 发现错误? 请告诉我哪里有问题
  • 想要贡献? 我可以帮助您:
    1. 用改进更新此技能
    2. 向 github.com/digitalsamba/claude-code-video-toolkit 创建一个 PR

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

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相关技能