关于 video-concat
video-concat 是一项使用 FFmpeg 合并视频的技能,涵盖输入兼容性检查、确认片段顺序、配置处理方式及验证输出,适用于需要灵活控制编码和转场的用户。
主要功能
- 01检查文件时长、分辨率和编码
- 02检查分辨率与音频兼容性
- 03确认片段顺序和合并偏好
- 04选择合并方式、画质、音频和转场
- 05运行 FFmpeg 并验证输出
适用场景
- 01合并格式相同的视频片段
- 02合并分辨率或音频编码不同的片段
- 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. 分辨率兼容性
必须:在继续之前,必须检查所有输入文件的分辨率。
比较所有输入文件的分辨率(宽 × 高):
-
如果所有文件的分辨率相同:说明可以使用 concat demuxer。
-
如果文件的分辨率不同:必须使用 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):
-
如果所有文件的音频编解码器相同:记录该编解码器以供后续使用。
-
如果文件的音频编解码器不同:必须使用 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. video1.mp4 (时长: 5:30, 分辨率: 1920x1080) 2. video2.mp4 (时长: 3:45, 分辨率: 1920x1080) 3. video3.mp4 (时长: 8:20, 分辨率: 1920x1080) -
使用 AskUserQuestion 询问用户是否确认或要调整顺序:
- 问题:“请确认视频拼接顺序”或“Please confirm the video concatenation order”
- 选项应包括:
- “按当前顺序拼接:1→2→3(推荐)”——使用检测到的顺序
- “自定义顺序 / Custom order”——由用户指定
- 如果只有 2 个文件,还应提供“反转顺序:2→1 / Reverse order”
-
如果用户选择自定义顺序,请让其指定顺序(例如,“3, 1, 2”或“video3.mp4, video1.mp4, video2.mp4”)。
重要: 切勿根据文件名或用户提供的顺序自行推断。继续之前务必明确确认。
步骤 3:询问用户的合并配置
强制要求:在执行任何 ffmpeg 命令之前,必须使用 AskUserQuestion 工具询问用户的偏好。不得跳过此步骤或自行假设。
使用 AskUserQuestion 工具收集用户偏好:
-
合并方法:如何合并视频?
- 选项:
- “Concat 解复用器(推荐用于编解码器和分辨率相同的视频)”——速度最快,无需重新编码
- “Concat 滤镜(适用于编解码器或分辨率不同的视频)”——需要重新编码,可处理不同格式
- “根据文件分析决定”——自动检测最佳方法
- 选项:
-
输出质量(仅在需要重新编码时询问):
- 选项:
- “匹配源质量(推荐)”
- “轻度压缩(CRF 23)”
- “中度压缩(CRF 28)”
- “自定义设置”
- 选项:
-
音频处理:
- 选项:
- “保留所有音轨(推荐)”
- “仅保留第一条音轨”
- “完全移除音频”
- “重新编码音频(AAC 128k)”
- 选项:
-
转场效果(多选):
- 选项:
- “无转场(推荐)”
- “片段间交叉淡化(1 秒)”
- “片段间淡出至黑屏”
- 选项:
-
输出格式:
- 选项:“与输入相同(推荐)”、“MP4”、“MKV”、“MOV”
-
输出路径:保存到哪里?(建议默认值: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:执行并报告
- 运行前向用户展示完整的 ffmpeg 命令
- 执行命令并显示进度
- 报告成功或失败
- 显示输出文件路径和大小
步骤 6:验证输出
合并后验证输出:
ffprobe -v error -show_entries format=duration,size -of json "OUTPUT_FILE"
报告:
- 输出总时长(应等于输入视频时长之和,若有转场则减去转场时长)
- 文件大小
- 任何警告或问题
交互示例
用户:将 video1.mp4、video2.mp4 和 video3.mp4 合并在一起