AOI Demo Clip Maker
通过终端命令本地制作、裁剪和修剪 hackathon 演示视频,基于 ffmpeg/ffprobe。
基于ffmpeg的多平台短视频自动化制作工具,支持剪辑、配乐、字幕、特效及一键多平台导出。
openclaw skills install @yash-kavaiya/viral-reels-creator命令、参数、文件名以原文为准
一个基于 ffmpeg 的综合性技能,用于创建爆款 Instagram Reels、TikTok 视频和 YouTube Shorts,包含从原始素材中提取最佳片段、节拍同步剪辑、多平台导出以及病毒式内容策略。
apt-get update && apt-get install -y ffmpeg fonts-noto fonts-noto-color-emoji fontconfig
# 用于场景检测 + 节拍同步:
pip install --break-system-packages opencv-python numpy librosa soundfile/mnt/user-data/uploads/ 目录中的用户资源。/home/claude/ 再进行处理。/mnt/user-data/outputs/ 并提供给用户。| 属性 | Instagram / TikTok / YT Shorts |
|---|---|
| 分辨率 | 1080×1920(9:16 纵向) |
| 帧率 | 30 fps(YouTube Shorts 使用 60fps) |
| 最大时长 | 90秒(IG/FB)· 60秒(TikTok/YT/Snap) |
| 编码格式 | H.264(libx264) |
| 音频编码 | AAC,44100 Hz,立体声 |
| 像素格式 | yuv420p |
| 容器格式 | .mp4 |
基础输出参数(始终使用):
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p -r 30 -c:a aac -ar 44100 -ac 2 -movflags +faststart获取完整平台特定规格及导出命令 → **references/platform-specs.md**
用户请求
├── "寻找最佳片段 / 高光时刻"?
│ └── 运行 scripts/scene-detect.py → 获取时间戳 → 裁剪片段
├── "让它变得爆款" / "病毒式钩子"?
│ └── 加载 references/viral-hooks.md → 应用钩子公式
├── 单个视频输入?
│ ├── 裁剪/剪辑 → 参见:裁剪章节
│ ├── 添加字幕 → 加载 references/caption-templates.md
│ ├── 添加音乐 → 参见:音频混音章节
│ ├── 节拍同步剪辑 → 加载 references/beat-sync.md + scripts/beat-detect.py
│ ├── 色调调校 → 加载 references/color-grading.md
│ ├── 速度变化 → 参见:速度渐变章节
│ ├── 添加特效/动画 → 加载 references/animations.md
│ └── 仅调整尺寸 → 参见:缩放章节
├── 多个视频输入?
│ └── 合并并添加转场 → 加载 references/transitions.md
├── 图片输入(幻灯片)?
│ └── 使用肯·伯恩斯效果 / 幻灯片 → 参见:幻灯片章节
├── 导出多个平台?
│ └── 运行 scripts/batch-export.sh → 一次性导出所有平台
├── 从零开始制作完整 Reel?
│ └── 组合所有步骤:场景检测 → 钩子 → 内容 → 节拍同步 → 字幕 + 音乐
└── "让它看起来更好" / 通用需求?
└── 自动缩放 + 色调调校(黄金时段或克拉伦登风格)+ 字幕模板 + 淡入淡出转场重要提示:对于字幕、动画、色调调校、转场、病毒式策略、节拍同步及平台规格 —— 在生成 ffmpeg 命令前,请务必查阅对应参考文件。
当用户拥有原始素材并希望提取最佳片段时:
# 找出前 10 个视觉上最吸引人的片段
python scripts/scene-detect.py raw_footage.mp4 --top 10 --thumbnail
# 提取指定数量的片段用于 30 秒 Reel(每段 5 秒 = 6 个片段)
python scripts/scene-detect.py raw_footage.mp4 --top 6 --clip-duration 5 --thumbnail
# 针对快节奏内容且场景切换频繁的情况
python scripts/scene-detect.py video.mp4 --threshold 0.2 --top 15
# 输出为 JSON 以供后续处理
python scripts/scene-detect.py video.mp4 --json > moments.json然后根据脚本输出的 ffmpeg 命令逐一裁剪每个片段。
加载 **references/viral-hooks.md** 获取完整策略。核心原则如下:
爆款 Reel 公式:
[0–3秒] 钩子 → 大胆的文字断言或模式打断
[3–7秒] 建立背景 → 说明“你将看到什么”
[7–20秒] 内容主体 → 核心价值,快速剪辑,画面多样性
[20–25秒] 收尾 → 揭示、转变、笑点
[25–30秒] 行动号召 → “收藏这个”,“评论 X 获取第二部分”加载 **references/beat-sync.md** 获取完整工作流程。
# 步骤 1:检测节拍
python scripts/beat-detect.py music.mp3
# → 输出节拍时间戳,例如:0.469, 0.938, 1.407, 1.876...
# 步骤 2:使用节拍时间戳作为剪辑点
# (详见 beat-sync.md 中的 ffmpeg 多片段合成方法)
# 步骤 3:在每个节拍处添加缩放脉冲(120 BPM = 2Hz)
ffmpeg -i video.mp4 -filter_complex "
zoompan=z='1+0.05*abs(sin(PI*t*2))':
x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=1:s=1080x1920:fps=30
" OUTPUT_FLAGS zoom_pulse.mp4# 缩放 + 裁剪(填充画面 — 推荐用于 Reels)
ffmpeg -i input.mp4 -vf "scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920" OUTPUT_FLAGS output.mp4
# 模糊背景填充(电影感 — 适用于横屏源素材)
ffmpeg -i input.mp4 -filter_complex "
[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,boxblur=20:5[bg];
[0:v]scale=1080:1920:force_original_aspect_ratio=decrease[fg];
[bg][fg]overlay=(W-w)/2:(H-h)/2
" OUTPUT_FLAGS output.mp4ffmpeg -ss 00:00:05 -i input.mp4 -t 00:00:30 -c copy trimmed.mp4ffmpeg -i input.mp4 -ss 00:00:05 -to 00:00:35 OUTPUT_FLAGS trimmed.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_FLAGS slow.mp4
# 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_FLAGS fast.mp4
# 速度渐变:正常 → 慢速 → 正常
ffmpeg -i input.mp4 -filter_complex "
[0:v]trim=0:3,setpts=PTS-STARTPTS[v1];
[0:v]trim=3:6,setpts=2*(PTS-STARTPTS)[v2];
[0:v]trim=6:10,setpts=PTS-STARTPTS[v3];
[v1][v2][v3]concat=n=3:v=1:a=0[v]
" -map "[v]" OUTPUT_FLAGS ramp.mp4# 混合原始音频 + 背景音乐(背景音乐音量为30%)
ffmpeg -i video.mp4 -i music.mp3 -filter_complex "
[0:a]volume=1.0[voice];
[1:a]volume=0.3[music];
[voice][music]amix=inputs=2:duration=shortest
" -map 0:v OUTPUT_FLAGS output.mp4
# 背景音乐淡入淡出
ffmpeg -i video.mp4 -i music.mp3 -filter_complex "
[1:a]afade=t=in:st=0:d=3,afade=t=out:st=27:d=3,volume=0.3[music];
[0:a]volume=1.0[voice];
[voice][music]amix=inputs=2:duration=shortest
" -map 0:v OUTPUT_FLAGS output.mp4# 电影推拉效果(缩放+平移)
ffmpeg -loop 1 -i image.jpg -vf "
scale=2160:3840,
zoompan=z='min(zoom+0.001,1.5)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=150:s=1080x1920:fps=30
" -t 5 OUTPUT_FLAGS kenburns.mp4在生成涉及以下功能的 ffmpeg 命令前,请务必阅读对应参考文件。
| 功能 | 参考文件 | 内容说明 |
|---|---|---|
| 病毒式传播策略与钩子 | references/viral-hooks.md | 钩子公式、格式、留存技巧、行动号召(CTA) |
| 节拍同步剪辑 | references/beat-sync.md | 节拍拼接、缩放脉冲、高潮特效 |
| 多平台导出 | references/platform-specs.md | 平台规格、安全区域、画幅比例变体 |
| 字幕模板 | references/caption-templates.md | 10 种 Instagram 风格字幕设计 |
| 动画效果(50+种) | references/animations.md | 50+ 种文字/视频动画:弹跳、打字机等 |
| 色彩调校 | references/color-grading.md | 20 种无 LUT 色彩调校及 Instagram 滤镜 |
| 过场转场 | references/transitions.md | 12+ 种转场效果:淡入淡出、擦除、缩放、故障等 |
| 脚本文件 | 用途 |
|---|---|
scripts/scene-detect.py | 从原始素材中识别最佳或最具病毒传播潜力的片段 |
scripts/beat-detect.py | 检测节拍时间点,用于精准同步剪辑 |
scripts/batch-export.sh | 将单个短视频批量导出至 Instagram、TikTok、YouTube 等平台 |
在 -filter_complex 中组合多个效果时,顺序至关重要:
1. 缩放/裁剪至 1080x1920
2. 应用色彩调校
3. 应用速度变化
4. 应用动画/特效
5. 叠加字幕/文字
6. 添加多片段之间的转场示例:完整的病毒式短视频制作流程
ffmpeg -i clip1.mp4 -i music.mp3 -filter_complex "
[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,
eq=brightness=0.06:saturation=1.4:contrast=1.05,
vignette=PI/5,
drawtext=text='Wait for it...':fontfile=/usr/share/fonts/truetype/noto/NotoSans-Bold.ttf:
fontsize=72:fontcolor=white:borderw=4:bordercolor=black:
x=(w-tw)/2:y=(h-th)/2:enable='between(t,0,3)',
drawtext=text='Your Caption Here':fontfile=/usr/share/fonts/truetype/noto/NotoSans-Bold.ttf:
fontsize=56:fontcolor=white:borderw=3:bordercolor=black:
x=(w-tw)/2:y=h-th-250:enable='between(t,3,28)',
drawtext=text='Save this!':fontfile=/usr/share/fonts/truetype/noto/NotoSans-Bold.ttf:
fontsize=40:fontcolor=yellow:borderw=3:bordercolor=black:
x=(w-tw)/2:y=h-th-120:enable='between(t,25,30)',
fade=t=in:st=0:d=1,fade=t=out:st=28:d=2[v];
[1:a]afade=t=in:st=0:d=2,afade=t=out:st=27:d=3,volume=0.4[a]
" -map "[v]" -map "[a]" -t 30 \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p -r 30 \
-c:a aac -ar 44100 -ac 2 -movflags +faststart \
/mnt/user-data/outputs/reel_final.mp4完成视频制作后,可一键导出至所有目标平台:
bash scripts/batch-export.sh /mnt/user-data/outputs/reel_final.mp4 my_reel all
# 输出文件:my_reel_instagram.mp4, my_reel_tiktok.mp4, my_reel_youtube_shorts.mp4,
# my_reel_facebook.mp4, my_reel_snapchat.mp4, my_reel_pinterest.mp4也可仅导出指定平台:
bash scripts/batch-export.sh reel.mp4 cooking_video instagram,tiktok,youtube# 动态水印(淡入,半透明)
ffmpeg -i video.mp4 -i logo.png -filter_complex "
[1:v]scale=120:-1,format=rgba,colorchannelmixer=aa=0.7[logo];
[0:v][logo]overlay=W-w-30:H-h-30
" OUTPUT_FLAGS output.mp4pip install --break-system-packages openai-whisper pysrtimport whisper
model = whisper.load_model("base")
result = model.transcribe("audio.mp3", word_timestamps=True)
with open("captions.srt", "w") as f:
for i, seg in enumerate(result["segments"], 1):
start = seg["start"]
end = seg["end"]
text = seg["text"].strip()
f.write(f"{i}\n")
f.write(f"{int(start//3600):02}:{int(start%3600//60):02}:{start%60:06.3f} --> ")
f.write(f"{int(end//3600):02}:{int(end%3600//60):02}:{end%60:06.3f}\n")
f.write(f"{text}\n\n")随后将字幕烧录到视频中(详见 references/caption-templates.md 获取样式建议):
ffmpeg -i video.mp4 -vf "subtitles=captions.srt:force_style='FontSize=22,PrimaryColour=&Hffffff,OutlineColour=&H000000,Outline=2,Alignment=2'" OUTPUT_FLAGS output.mp4ffprobe -i input.mp4 -show_streams -select_streams a-an 参数,或生成静音音频:-f lavfi -i anullsrcapt-get install -y fonts-noto fonts-liberation-t 5 -preset ultrafast 只渲染前 5 秒fontfile=/usr/share/fonts/truetype/noto/NotoColorEmoji.ttf-movflags +faststart 以确保网页和移动设备流畅播放交付最终视频前请确认:
/mnt/user-data/outputs/batch-export.sh 脚本导出已收录 1 个 Skill