mcpField
V
video-concat

video-concat

github.com/infquest创意与媒体055 次安装40 周前更新
代码仓库

关于 video-concat

video-concat 是一项使用 FFmpeg 合并视频的技能,涵盖输入兼容性检查、确认片段顺序、配置处理方式及验证输出,适用于需要灵活控制编码和转场的用户。

主要功能

  1. 01检查文件时长、分辨率和编码
  2. 02检查分辨率与音频兼容性
  3. 03确认片段顺序和合并偏好
  4. 04选择合并方式、画质、音频和转场
  5. 05运行 FFmpeg 并验证输出

适用场景

  1. 01合并格式相同的视频片段
  2. 02合并分辨率或音频编码不同的片段
  3. 03为片段之间添加转场

安装

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

$npx skills add https://github.com/infquest/vibe-ops-plugin --skill video-concat

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

详细介绍

FFmpeg 视频拼接器

使用 ffmpeg 将多个视频文件合并为一个视频。

用法

当用户想要合并/拼接视频时:$ARGUMENTS

说明

你是一个使用 ffmpeg 合并视频的助手。请按以下步骤操作:

第 1 步:获取并分析输入文件

如果用户未提供输入文件路径,请让用户提供要合并的视频文件列表。

对于每个文件,验证文件是否存在并获取其信息:

ffprobe -v error -show_entries format=duration,size -show_entries stream=codec_name,width,height,r_frame_rate -of json "$INPUT_FILE"

向用户显示每个文件的以下信息:

  • 文件名
  • 时长
  • 分辨率
  • 编解码器

同时检查所有文件的格式是否兼容(编解码器、分辨率、帧率是否相同)。

第 2 步:检查兼容性
2a. 分辨率兼容性

必须:在继续之前,必须检查所有输入文件的分辨率。

比较所有输入文件的分辨率(宽 × 高):

  1. 如果所有文件的分辨率相同:说明可以使用 concat demuxer。

  2. 如果文件的分辨率不同:必须使用 AskUserQuestion 工具询问用户输出视频要使用哪种分辨率。提供如下选项:

    • “使用 file1.mp4 的分辨率(1920x1080)”
    • “使用 file2.mp4 的分辨率(1280x720)”
    • “使用最高分辨率(1920x1080)”
    • “使用最低分辨率(1280x720)”
    • “自定义分辨率”

    重要: 分辨率不同时,必须使用 concat filter 方法(而非 concat demuxer),并将所有视频缩放到所选分辨率:

    # Scale filter to normalize resolution
    -filter_complex "\
      [0:v]scale=WIDTH:HEIGHT:force_original_aspect_ratio=decrease,pad=WIDTH:HEIGHT:(ow-iw)/2:(oh-ih)/2[v0];\
      [1:v]scale=WIDTH:HEIGHT:force_original_aspect_ratio=decrease,pad=WIDTH:HEIGHT:(ow-iw)/2:(oh-ih)/2[v1];\
      [v0][0:a][v1][1:a]concat=n=2:v=1:a=1[outv][outa]"
    

此方法会在保持宽高比的同时缩放视频,并在必要时添加黑边填充。

2b. 音频编解码器兼容性

必须:在继续之前,必须检查所有输入文件的音频编解码器。

比较所有输入文件的音频编解码器(例如 aac、eac3、ac3、mp3、opus):

  1. 如果所有文件的音频编解码器相同:记录该编解码器以供后续使用。

  2. 如果文件的音频编解码器不同:必须使用 AskUserQuestion 工具询问用户输出视频要使用哪种音频编解码器。根据检测到的编解码器动态提供选项:

    • “使用 file1.mp4 的 [codec1]”
    • “使用 file2.mp4 的 [codec2]”
    • “重新编码为 AAC(兼容性广)”
    • “重新编码为 EAC3(Dolby Digital Plus)”

    问题格式示例:

    "输出视频使用什么音频编码?" or "Which audio codec should be used for output?"
    Options:
    - "eac3 (from chapter3_full.mp4)" - Keep Dolby Digital Plus
    - "aac (from Edinburgh.mp4)" - Keep AAC
    - "Re-encode to AAC 128k" - Best compatibility
    - "Re-encode to EAC3 384k" - High quality surround
    

    重要: 音频编解码器不同时,必须将音频重新编码为所选编解码器。常见编解码器选项:

    • AAC:-c:a aac -b:a 128k(立体声)或 -c:a aac -b:a 256k(5.1)
    • EAC3:-c:a eac3 -b:a 384k(5.1 环绕声)
    • AC3:-c:a ac3 -b:a 384k(5.1 环绕声)
    • Copy:-c:a copy(仅当所有编解码器一致时)
2c. 确认文件拼接顺序(关键)

必须:在继续之前,必须让用户确认或指定拼接顺序。

分析完所有输入文件后,使用 AskUserQuestion 工具确认顺序:

  1. 以编号列表的形式显示所有文件及其详情:

    检测到以下视频文件:
    1. video1.mp4 (时长: 5:30, 分辨率: 1920x1080)
    2. video2.mp4 (时长: 3:45, 分辨率: 1920x1080)
    3. video3.mp4 (时长: 8:20, 分辨率: 1920x1080)
    
  2. 使用 AskUserQuestion 询问用户是否确认或要调整顺序:

    • 问题:“请确认视频拼接顺序”或“Please confirm the video concatenation order”
    • 选项应包括:
      • “按当前顺序拼接:1→2→3(推荐)”——使用检测到的顺序
      • “自定义顺序 / Custom order”——由用户指定
      • 如果只有 2 个文件,还应提供“反转顺序:2→1 / Reverse order”
  3. 如果用户选择自定义顺序,请让其指定顺序(例如,“3, 1, 2”或“video3.mp4, video1.mp4, video2.mp4”)。

重要: 切勿根据文件名或用户提供的顺序自行推断。继续之前务必明确确认。

步骤 3:询问用户的合并配置

强制要求:在执行任何 ffmpeg 命令之前,必须使用 AskUserQuestion 工具询问用户的偏好。不得跳过此步骤或自行假设。

使用 AskUserQuestion 工具收集用户偏好:

  1. 合并方法:如何合并视频?

    • 选项:
      • “Concat 解复用器(推荐用于编解码器和分辨率相同的视频)”——速度最快,无需重新编码
      • “Concat 滤镜(适用于编解码器或分辨率不同的视频)”——需要重新编码,可处理不同格式
      • “根据文件分析决定”——自动检测最佳方法
  2. 输出质量(仅在需要重新编码时询问):

    • 选项:
      • “匹配源质量(推荐)”
      • “轻度压缩(CRF 23)”
      • “中度压缩(CRF 28)”
      • “自定义设置”
  3. 音频处理:

    • 选项:
      • “保留所有音轨(推荐)”
      • “仅保留第一条音轨”
      • “完全移除音频”
      • “重新编码音频(AAC 128k)”
  4. 转场效果(多选):

    • 选项:
      • “无转场(推荐)”
      • “片段间交叉淡化(1 秒)”
      • “片段间淡出至黑屏”
  5. 输出格式:

    • 选项:“与输入相同(推荐)”、“MP4”、“MKV”、“MOV”
  6. 输出路径:保存到哪里?(建议默认值:merged_output.ext)

步骤 4:构建 FFmpeg 命令

根据用户选择构建 ffmpeg 命令:

方法 1:Concat 解复用器(格式相同的文件——速度最快)

创建一个列出所有输入文件的文本文件:

# Create concat list file
cat > /tmp/concat_list.txt << 'EOF'
file '/path/to/video1.mp4'
file '/path/to/video2.mp4'
file '/path/to/video3.mp4'
EOF

# Execute concat
ffmpeg -f concat -safe 0 -i /tmp/concat_list.txt -c copy "OUTPUT.mp4"
方法 2:Concat 滤镜(格式不同的文件)
# For 2 files
ffmpeg -i "input1.mp4" -i "input2.mp4" \
  -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" \
  -map "[outv]" -map "[outa]" \
  -c:v libx264 -crf 23 -c:a aac -b:a 128k \
  "OUTPUT.mp4"

# For 3 files
ffmpeg -i "input1.mp4" -i "input2.mp4" -i "input3.mp4" \
  -filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
  -map "[outv]" -map "[outa]" \
  -c:v libx264 -crf 23 -c:a aac -b:a 128k \
  "OUTPUT.mp4"
方法 3:添加交叉淡化转场
# For 2 files with 1 second crossfade
ffmpeg -i "input1.mp4" -i "input2.mp4" \
  -filter_complex "\
    [0:v][1:v]xfade=transition=fade:duration=1:offset=DURATION1-1[outv];\
    [0:a][1:a]acrossfade=d=1[outa]" \
  -map "[outv]" -map "[outa]" \
  -c:v libx264 -crf 23 -c:a aac -b:a 128k \
  "OUTPUT.mp4"

可用的 xfade 转场:fade、fadeblack、fadewhite、distance、wipeleft、wiperight、wipeup、wipedown、slideleft、slideright、slideup、slidedown、smoothleft、smoothright、circlecrop、rectcrop、circleclose、circleopen、horzclose、horzopen、vertclose、vertopen、diagbl、diagbr、diagtl、diagtr、hlslice、hrslice、vuslice、vdslice、dissolve、pixelize、radial、hblur、wipetl、wipetr、wipebl、wipebr、squeezeh、squeezev、zoomin

音频选项
# Keep all audio (default with concat demuxer)
-c:a copy

# Remove audio
-an

# Re-encode audio
-c:a aac -b:a 128k
步骤 5:执行并报告
  1. 运行前向用户展示完整的 ffmpeg 命令
  2. 执行命令并显示进度
  3. 报告成功或失败
  4. 显示输出文件路径和大小
步骤 6:验证输出

合并后验证输出:

ffprobe -v error -show_entries format=duration,size -of json "OUTPUT_FILE"

报告:

  • 输出总时长(应等于输入视频时长之和,若有转场则减去转场时长)
  • 文件大小
  • 任何警告或问题
交互示例

用户:将 video1.mp4、video2.mp4 和 video3.mp4 合并在一起

评论

支持 Markdown