L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

video-merger

video-merger

Merge multiple video clips or shorts into one video, with transitions and effects.

Independent GitHub snapshot · Automated classification · Original documentation governs

Bbuda-ai / bunny-agentApache-2.0

Documentation de la Skill

GitHub

name: video-merger description: Merge multiple video clips or shorts into one video, with transitions and effects.

视频合并工具

将多个短视频片段合并成一个完整视频,支持转场效果和统一处理。

功能

  1. 顺序合并: 按顺序拼接多个视频
  2. 转场效果: 添加淡入淡出等过渡
  3. 统一格式: 确保输出格式一致
  4. 背景音乐: 添加统一背景音乐

使用方法

合并这些视频: clip1.mp4, clip2.mp4, clip3.mp4
把 ./output/shorts/ 目录下的所有短视频合并成一个

Instructions

Step 1: 准备文件列表

# 创建视频列表文件
mkdir -p ./temp

# 方式1: 指定文件
cat > ./temp/merge_list.txt << 'EOF'
file './output/shorts/clip1.mp4'
file './output/shorts/clip2.mp4'
file './output/shorts/clip3.mp4'
EOF

# 方式2: 自动扫描目录
for f in ./output/shorts/*.mp4; do
  echo "file '$f'"
done > ./temp/merge_list.txt

cat ./temp/merge_list.txt

Step 2: 统一视频格式

# 确保所有视频格式一致(分辨率、帧率、编码)
mkdir -p ./temp/normalized

while read -r line; do
  file=$(echo "$line" | sed "s/file '//;s/'//")
  if [ -f "$file" ]; then
    basename=$(basename "$file")
    
    ffmpeg -i "$file" \
      -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:-1:-1:color=black" \
      -r 30 \
      -c:v libx264 -preset fast -crf 23 \
      -c:a aac -b:a 128k -ar 44100 \
      "./temp/normalized/$basename"
  fi
done < ./temp/merge_list.txt

# 更新列表
for f in ./temp/normalized/*.mp4; do
  echo "file '$f'"
done > ./temp/normalized_list.txt

Step 3: 简单合并(无转场)

# 使用 concat demuxer 直接合并
ffmpeg -f concat -safe 0 -i ./temp/normalized_list.txt \
  -c copy \
  ./output/merged/merged_simple.mp4

echo "✅ 简单合并完成"

Step 4: 带转场效果合并

# 淡入淡出转场
# 获取视频数量和时长信息
VIDEO_COUNT=$(wc -l < ./temp/normalized_list.txt)
TRANSITION_DURATION=0.5

# 使用 xfade 滤镜添加转场
# 注意: 需要 FFmpeg 4.3+

# 对于2个视频的简单示例:
VIDEO1="./temp/normalized/clip1.mp4"
VIDEO2="./temp/normalized/clip2.mp4"
VIDEO1_DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$VIDEO1")

OFFSET=$(echo "$VIDEO1_DURATION - $TRANSITION_DURATION" | bc)

ffmpeg -i "$VIDEO1" -i "$VIDEO2" \
  -filter_complex "
    [0:v][1:v]xfade=transition=fade:duration=${TRANSITION_DURATION}:offset=${OFFSET}[v];
    [0:a][1:a]acrossfade=d=${TRANSITION_DURATION}[a]
  " \
  -map "[v]" -map "[a]" \
  -c:v libx264 -preset fast -crf 23 \
  -c:a aac -b:a 128k \
  ./output/merged/merged_fade.mp4

echo "✅ 淡入淡出转场合并完成"

Step 5: 添加背景音乐

MERGED_VIDEO="./output/merged/merged_simple.mp4"
BGM_FILE="./assets/bgm.mp3"
OUTPUT="./output/merged/merged_with_bgm.mp4"

if [ -f "$BGM_FILE" ]; then
  # 获取视频时长
  VIDEO_DURATION=$(ffprobe -v error -show_entries format=duration \
    -of default=noprint_wrappers=1:nokey=1 "$MERGED_VIDEO")
  
  # 混合音频 (原声 + BGM)
  ffmpeg -i "$MERGED_VIDEO" -i "$BGM_FILE" \
    -filter_complex "
      [1:a]volume=0.15,aloop=loop=-1:size=2e+09[bgm];
      [bgm]atrim=0:$VIDEO_DURATION[bgm_trimmed];
      [0:a][bgm_trimmed]amix=inputs=2:duration=first:dropout_transition=2[a]
    " \
    -map 0:v -map "[a]" \
    -c:v copy \
    -c:a aac -b:a 128k \
    "$OUTPUT"
  
  echo "✅ 背景音乐已添加"
else
  echo "⚠️ 未找到背景音乐文件: $BGM_FILE"
  cp "$MERGED_VIDEO" "$OUTPUT"
fi

Step 6: 添加片头片尾

INTRO="./assets/intro.mp4"
OUTRO="./assets/outro.mp4"
MAIN="./output/merged/merged_simple.mp4"
FINAL="./output/merged/final.mp4"

# 创建包含片头、主体、片尾的列表
cat > ./temp/final_list.txt << EOF
file '$INTRO'
file '$MAIN'
file '$OUTRO'
EOF

# 先标准化格式
for f in "$INTRO" "$MAIN" "$OUTRO"; do
  if [ -f "$f" ]; then
    basename=$(basename "$f")
    ffmpeg -i "$f" \
      -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:-1:-1" \
      -r 30 -c:v libx264 -preset fast -crf 23 \
      -c:a aac -b:a 128k -ar 44100 \
      "./temp/final_$basename"
  fi
done

# 合并
ffmpeg -f concat -safe 0 -i ./temp/final_list.txt \
  -c copy \
  "$FINAL"

可用转场效果

使用 xfade 滤镜的转场类型:

效果说明
fade淡入淡出
wipeleft左擦除
wiperight右擦除
wipeup上擦除
wipedown下擦除
slideleft左滑动
slideright右滑动
slideup上滑动
slidedown下滑动
circlecrop圆形裁切
rectcrop方形裁切
distance距离变换
fadeblack黑场过渡
fadewhite白场过渡
radial径向过渡
smoothleft平滑左移
smoothright平滑右移

输出

  • 简单合并: ./output/merged/merged_simple.mp4
  • 带转场: ./output/merged/merged_fade.mp4
  • 带背景音乐: ./output/merged/merged_with_bgm.mp4
  • 最终版本: ./output/merged/final.mp4

目录结构

./output/
├── shorts/      # 原始短视频片段
├── merged/      # 合并后的视频
└── thumbnails/  # 封面图

./assets/
├── intro.mp4    # 片头
├── outro.mp4    # 片尾
└── bgm.mp3      # 背景音乐
Skills enregistrées