Communitygithub.com

视频编辑器

当用户想要以任何方式编辑、创建、修剪、压缩、合并、调整大小、改变速度、稳定、添加转场、转录、添加字幕、创建标题卡、下三分之一、结束卡、制作预告片、提取缩略图、创建 GIF、添加水印、操作音频或处理视频文件时使用。

视频编辑器 是什么?

此技能将 AI 驱动的视频工作流程与三个核心引擎相结合:ffmpeg(用于修剪、压缩、合并、调整大小和压制现有素材)、Remotion(用于通过 React 组件创建动画标题卡、下三分之一、结束卡和预告片)以及 Whisper(用于转录和字幕生成)。它支持 Apple Silicon 上的硬件加速,与来自 `~/design-assets/color-palettes/` 的设计资产主题集成,并为 YouTube、Instagram、TikTok 和 Twitter 等平台提供预设。该工作流程通过缓存 Remotion 工作区以避免重复安装 npm,从而优化了性能。它包含用于多步骤流水线的管道编排、冲突输出文件的自动重命名,以及用于稳定视频的双通道 vidstab 滤镜。用户可以通过简单的自然语言命令(如 `/trim`、`/compress`、`/title-card` 或 `/transcribe`)进行交互,技能会引导他们完成文件检查、命令构建和执行后的验证。

兼容平台~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/ElSalvatore-sys/video-editor-plugin/tree/main/skills/video-editor

在你喜欢的 AI 中提问

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

文档

视频编辑器 是做什么的?

概述

AI 辅助视频工作流程,由三个引擎驱动:

  • ffmpeg -- 编辑现有素材(修剪、压缩、合并、调整大小、速度、稳定、水印、音频、GIF、缩略图、转场、字幕)
  • Remotion -- 创建新的视频内容(标题卡、下三分之一、结束卡、预告片、动画叠加层)
  • Whisper -- 转录和字幕生成

附加功能:

  • 硬件加速:通过 h264_videotoolbox / hevc_videotoolbox 在 Apple Silicon 上实现
  • 主题集成:与来自 ~/design-assets/color-palettes/ 的设计资产集成
  • 平台预设:适用于 YouTube、Instagram、TikTok、Twitter 等
  • 工作区缓存:用于 Remotion,避免重复执行 npm install

何时使用

对 ANY 这些用户意图触发:

类别关键词
基本编辑修剪、剪切、剪辑、缩短、分割
压缩压缩、减小大小、缩小、变小、优化
合并合并、组合、连接、拼接、缝合
调整大小调整大小、缩放、裁剪、填充、宽高比、竖屏、横屏、方形
速度加速、减速、慢动作、延时摄影、快进、倒放
稳定稳定、抖动、平滑、修复抖动
转场淡入淡出、交叉淡入淡出、溶解、擦除、转场
字幕字幕、SRT、转录、语音转文字
标题卡标题卡、片头、开场、动画文字
下三分之一下三分之一、姓名标签、字幕条、姓名条
结束卡结束卡、片尾、结束画面、结尾
预告片预告片、预告、宣传片、精彩集锦、蒙太奇
缩略图缩略图、海报、帧提取、截图
GIFGIF、动画图像、循环、表情包
水印水印、Logo 叠加、品牌
音频音频、音量、标准化、响度、静音、淡入、淡出、混音、提取音频
信息信息、详情、时长、分辨率、编码器、码率、元数据
流水线流水线、批量、工作流、多步骤
平台YouTube、Instagram、TikTok、Twitter、Reels、Shorts

命令参考

编辑命令 (ffmpeg)

命令描述示例
/trim从视频中裁剪一段"修剪 video.mp4 从 0:30 到 1:45"
/compress通过质量控制减小文件大小"压缩到 10MB 以下"
/merge将多个片段合并为一个"合并 clip1.mp4 和 clip2.mp4,带淡入淡出"
/resize更改尺寸、宽高比、裁剪或填充"调整大小为 1080x1080 方形"
/speed加速、减速或倒放"2 倍速" 或 "0.5 倍慢动作"
/stabilize消除相机抖动 (vidstab 双通道)"稳定 shaky.mp4"
/watermark在视频上叠加图片或文字"添加 logo.png 到右下角"
/audio音量、标准化、混音、淡入淡出、提取、静音"将音频标准化到 -14 LUFS"
/thumbnail提取帧作为图片"在 0:15 处截取缩略图"
/gif从视频片段创建动画 GIF"从 0:05 到 0:10 创建 GIF,宽度 320px"
/extract提取音频或字幕轨道"提取音频为 mp3"
/info显示视频元数据和流信息"信息 video.mp4"

创建命令 (Remotion)

命令描述示例
/title-card支持主题的动画标题卡"标题卡:Coming Soon,wad 主题,缩放动画"
/lower-third动画名称/标题叠加"下三分之一:John Doe,CEO,现代风格"
/end-card带 CTA 和社交媒体的动画片尾"结束卡:订阅!,@handle,ea 主题"
/teaser带转场和标题的多片段蒙太奇"从 clips/ 文件夹创建预告片,30 秒"

转录命令 (Whisper)

命令描述示例
/transcribe从语音生成 SRT/VTT"转录 interview.mp4"
/add-captions转录并将字幕烧录到视频上"添加字幕到 talk.mp4"

编排

命令描述示例
/pipeline多步骤处理链"修剪,添加标题卡,为 Instagram 压缩"

工作流

步骤 1:检查可用工具

which ffmpeg ffprobe && echo "ffmpeg: ok"
node --version && echo "node: ok"
which whisper && echo "whisper: ok" || echo "whisper: not installed (captions need manual .srt)"
ffmpeg -encoders 2>/dev/null | grep videotoolbox && echo "hw accel: ok" || echo "hw accel: not available"
ffmpeg -filters 2>/dev/null | grep vidstab && echo "vidstab: ok" || echo "vidstab: not available (brew install ffmpeg with --with-libvidstab)"

如果缺少 ffmpeg:"用 brew install ffmpeg 安装" 如果缺少 Node.js:"从 https://nodejs.org 安装或运行 brew install node" 如果缺少 vidstab:"用 vidstab 重新安装 ffmpeg:brew install ffmpeg --with-libvidstab"

步骤 2:分类请求

用户意图引擎路径
编辑现有素材ffmpeg步骤 3a
创建新视频内容Remotion步骤 3b
音频操作ffmpeg 音频滤镜步骤 3a
信息/检查ffprobe步骤 3a
组合流水线编排两者步骤 3c
平台发布调整大小 + 压缩预设步骤 3a
转录Whisper + ffmpeg步骤 3a

步骤 3a:ffmpeg 路径

  1. 如果没有提供,询问输入文件
  2. 用 ffprobe 检查:
    ffprobe -v quiet -print_format json -show_format -show_streams "<file>"
    
  3. 硬件加速检测 (macOS Apple Silicon):
    # 检查 VideoToolbox 支持
    ffmpeg -encoders 2>/dev/null | grep h264_videotoolbox
    # 如果可用,优先使用:-c:v h264_videotoolbox -b:v 5M
    # 后备方案:-c:v libx264 -crf 23 -preset medium
    
  4. 输出冲突处理:
    # 在写入输出前,检查文件是否存在
    # 如果 "trimmed_video.mp4" 存在,则使用 "trimmed_video_2.mp4"、"trimmed_video_3.mp4",依此类推。
    OUTPUT="trimmed_video.mp4"
    COUNTER=2
    while [ -f "$OUTPUT" ]; do
      OUTPUT="trimmed_video_${COUNTER}.mp4"
      COUNTER=$((COUNTER + 1))
    done
    
  5. 构建 ffmpeg 命令
  6. 用通俗语言解释每个标志
  7. 说明输出文件名(绝不覆盖源文件)
  8. 询问:“我要运行这个吗?”
  9. 执行,然后验证:
    # 检查退出代码
    if [ $? -eq 0 ]; then
      echo "成功"
      ffprobe -v quiet -print_format json -show_format "$OUTPUT" | grep -E '"duration"|"size"'
    else
      echo "错误——请检查上面的 ffmpeg 输出"
    fi
    
  10. 报告输出路径 + 文件大小 + 时长

输出命名约定:

命令输出模式
修剪trimmed_<filename>
压缩compressed_<filename>
合并merged_output.<ext>
调整大小resized_<filename>
速度speed_<factor>x_<filename>
稳定stabilized_<filename>
水印watermarked_<filename>
字幕captioned_<filename>
音频提取<name>.mp3
音频修改audio_<filename>
字幕提取<name>.srt
缩略图thumb_<name>_<timecode>.jpg
GIF<name>.gif

步骤 3b:Remotion 路径

  1. 检查 Node.js 是否已安装
  2. 工作区缓存——重用现有工作区:
    WORKSPACE="/tmp/remotion-workspace"
    if [ -d "$WORKSPACE/node_modules" ]; then
      echo "重用缓存的 Remotion 工作区"
    else
      echo "创建 Remotion 工作区(首次运行)..."
      mkdir -p "$WORKSPACE"
      cp -r ~/project-templates/remotion-video/* "$WORKSPACE/"
      cd "$WORKSPACE" && npm install
    fi
    
  3. 主题加载:从 ~/design-assets/color-palettes/ 加载:
    # 如果用户指定了主题(wad、bloghead、ea),则从 JSON 加载颜色
    # 作为 inputProps 传递给 Remotion composition
    
  4. 根据需要编写或更新 composition 源文件
  5. 可用的 compositions:
    • TitleCard——带多种动画预设的动画标题
    • LowerThird——带强调条的姓名/标题叠加
    • EndCard——带 CTA、社交媒体、Logo 的片尾
    • Teaser——带 TransitionSeries 的多片段蒙太奇
  6. 渲染:
    cd "$WORKSPACE"
    npx remotion render src/index.ts <CompositionId> /path/to/output.mp4 \
      --props='{"text":"Title","bg":"#09090B","fg":"#FFFFFF","accent":"#7C3AED"}'
    
  7. 将输出复制到用户的工作目录
  8. 报告输出路径 + 时长

步骤 3c:组合流水线

对于多步骤请求(例如,“制作一个带标题卡、片段和结束卡的预告片”):

  1. 规划——在执行前向用户描述每个步骤
  2. 创建——首先生成任何 Remotion 内容(标题卡、结束卡)
  3. 处理——用 ffmpeg 修剪/调整源片段大小
  4. 组装——用转场将所有部分合并,使用 ffmpeg
  5. 完成——如果指定了目标平台,则进行压缩
  6. 在主要阶段之间确认(创建 vs 编辑 vs 组装)

ffmpeg 快速参考

修剪(无损)

ffmpeg -ss <start> -to <end> -i input.mp4 -c copy trimmed_input.mp4

压缩——网络(CRF 23)

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k compressed_input.mp4

压缩——硬件加速(macOS)

ffmpeg -i input.mp4 -c:v h264_videotoolbox -b:v 5M -c:a aac -b:a 128k compressed_input.mp4

带淡入淡出转场的合并

# 两个片段,1 秒交叉淡入淡出,偏移量 = clip1 的时长 - 1
ffmpeg -i clip1.mp4 -i clip2.mp4 \
  -filter_complex "[0][1]xfade=transition=fade:duration=1:offset=<offset>,format=yuv420p[v];[0:a][1:a]acrossfade=d=1[a]" \
  -map "[v]" -map "[a]" merged_output.mp4

调整大小 / 缩放

# 缩放到特定尺寸(用 -1 保持宽高比)
ffmpeg -i input.mp4 -vf "scale=1920:1080" resized_input.mp4
ffmpeg -i input.mp4 -vf "scale=1080:-1" resized_input.mp4

# 裁剪为中心方形
ffmpeg -i input.mp4 -vf "crop=min(iw\,ih):min(iw\,ih)" cropped_input.mp4

# 填充到目标宽高比(信箱/柱箱)
ffmpeg -i input.mp4 -vf "scale=1080:1080:force_original_aspect_ratio=decrease,pad=1080:1080:(ow-iw)/2:(oh-ih)/2:black" padded_input.mp4

速度更改

# 2 倍速(视频 + 音频)
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" speed_2x_input.mp4

# 0.5 倍慢动作
ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" speed_0.5x_input.mp4

# 4 倍速(链接 atempo 以实现 >2 倍音频:atempo 最大为 2.0)
ffmpeg -i input.mp4 -vf "setpts=0.25*PTS" -af "atempo=2.0,atempo=2.0" speed_4x_input.mp4

# 倒放
ffmpeg -i input.mp4 -vf "reverse" -af "areverse" reversed_input.mp4

水印叠加

# 右下角带边距
ffmpeg -i input.mp4 -i logo.png \
  -filter_complex "overlay=W-w-20:H-h-20" watermarked_input.mp4

# 左上角
ffmpeg -i input.mp4 -i logo.png \
  -filter_complex "overlay=20:20" watermarked_input.mp4

# 居中带透明度
ffmpeg -i input.mp4 -i logo.png \
  -filter_complex "[1]format=rgba,colorchannelmixer=aa=0.3[wm];[0][wm]overlay=(W-w)/2:(H-h)/2" watermarked_input.mp4

# 文字水印
ffmpeg -i input.mp4 \
  -vf "drawtext=text='My Brand':fontsize=24:[email protected]:x=W-tw-20:y=H-th-20" watermarked_input.mp4

视频稳定(vidstab 双通道)

# 通道 1:分析运动
ffmpeg -i shaky.mp4 -vf vidstabdetect=shakiness=10:accuracy=15 -f null -

# 通道 2:应用稳定
ffmpeg -i shaky.mp4 -vf vidstabtransform=smoothing=30:input=transforms.trf stabilized_shaky.mp4

音频操作

# 调整音量
ffmpeg -i input.mp4 -af "volume=1.5" audio_input.mp4

# 标准化响度(广播标准 -14 LUFS)
ffmpeg -i input.mp4 -af "loudnorm=I=-14:TP=-1:LRA=11" audio_input.mp4

# 混合两个音频轨道
ffmpeg -i video.mp4 -i music.mp3 \
  -filter_complex "[0:a]volume=1.0[a1];[1:a]volume=0.3[a2];[a1][a2]amix=inputs=2:duration=first[a]" \
  -map 0:v -map "[a]" audio_input.mp4

# 音频淡入/淡出(3 秒淡入,3 秒淡出)
ffmpeg -i input.mp4 -af "afade=t=in:ss=0:d=3,afade=t=out:st=<end-3>:d=3" audio_input.mp4

# 静音音频
ffmpeg -i input.mp4 -an muted_input.mp4

# 替换音频
ffmpeg -i input.mp4 -i newtrack.mp3 -c:v copy -map 0:v:0 -map 1:a:0 replaced_audio_input.mp4

GIF 创建(双通道调色板以保证质量)

# 通道 1:生成调色板
ffmpeg -ss <start> -t <duration> -i input.mp4 \
  -vf "fps=15,scale=320:-1:flags=lanczos,palettegen" palette.png

# 通道 2:使用调色板创建 GIF
ffmpeg -ss <start> -t <duration> -i input.mp4 -i palette.png \
  -filter_complex "[0:v]fps=15,scale=320:-1:flags=lanczos[v];[v][1:v]paletteuse" output.gif

# 清理
rm palette.png

缩略图提取

# 在时间戳处截取单帧
ffmpeg -ss <timestamp> -i input.mp4 -frames:v 1 -q:v 2 thumb_input_<timestamp>.jpg

# 缩略图网格(4x4)
ffmpeg -i input.mp4 -vf "fps=1/<interval>,scale=320:-1,tile=4x4" thumb_grid_input.jpg

烧录 .srt 字幕

ffmpeg -i input.mp4 -vf "subtitles=captions.srt:force_style='FontSize=24,PrimaryColour=&H00FFFFFF'" captioned_input.mp4

提取音频

ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3

视频信息

ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

Remotion 快速参考

缓存工作区设置

WORKSPACE="/tmp/remotion-workspace"
if [ ! -d "$WORKSPACE/node_modules" ]; then
  cp -r ~/project-templates/remotion-video/* "$WORKSPACE/"
  cd "$WORKSPACE" && npm install
fi

TitleCard Composition

import { AbsoluteFill, spring, useCurrentFrame, useVideoConfig, Img } from 'remotion';

type Animation = 'fade' | 'slide-up' | 'slide-down' | 'zoom' | 'typewriter' | 'glitch' | 'blur-in';

export const TitleCard: React.FC<{
  text: string;
  subtitle?: string;
  bg?: string;
  fg?: string;
  accent?: string;
  animation?: Animation;
  logo?: string;
}> = ({ text, subtitle, bg = '#09090B', fg = '#FFFFFF', accent = '#7C3AED', animation = 'fade', logo }) => {
  const frame = useCurrent

…

[为翻译而截断]

相关技能