使用 ffmpeg 将 GIF 与视频合并为竖向或网格布局的组合教程
夜市技能——从claude-night-market/scry移植. 对于代理、钩子和命令的全部体验,请安装 Claude 代码插件.是一项面向实际任务的技能,主要用于Colution.;Table of Control.;
使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
Night Market Skill — 由 claude-night-market/scry 移植而来。如需完整体验(含智能体、钩子与命令支持),请安装 Claude Code 插件。
将多个媒体资源(GIF、视频、图片)组合为复合输出,适用于详尽的教程与文档制作。
本技能协调多个独立生成的媒体资产,将其合成为统一输出。它读取定义了组件及其合成规则的清单文件,验证所有输入文件是否存在,并执行 FFmpeg 命令生成最终的复合媒体文件。
- 解析合成清单文件 - 验证所有组件输出文件均存在 - 确定合成布局及参数 - 执行 FFmpeg 合成命令 - 验证合成输出文件已成功创建 - 上报合成指标(文件大小、分辨率等)
验证方式:运行命令时添加 --help 参数,确认其可用性。
清单文件定义需合成的组件及其排列方式:
# 示例清单:tutorials/mcp.manifest.yaml
name: mcp
title: "MCP Server Integration"
components:
- type: tape
source: mcp.tape
output: assets/gifs/mcp-terminal.gif
- type: playwright
source: browser/mcp-browser.spec.ts
output: assets/gifs/mcp-browser.gif
requires:
- "skrills serve"
combine:
output: assets/gifs/mcp-combined.gif
layout: vertical
options:
padding: 10
background: "#1a1a2e"
验证方式:运行命令时添加 --help 参数,确认其可用性。
| 字段 | 类型 | 是否必需 | 说明 |
|---|---|---|---|
name |
string | 是 | 合成任务的唯一标识符 |
title |
string | 否 | 面向用户的可读标题 |
components |
array | 是 | 待合成的媒体组件列表 |
components[].type |
string | 是 | 数据源类型:tape、playwright、static |
components[].source |
string | 是 | 源文件路径 |
components[].output |
string | 是 | 生成的目标输出路径 |
components[].requires |
array | 否 | 生成前需执行的命令列表 |
combine.output |
string | 是 | 合成后输出文件路径 |
combine.layout |
string | 是 | 布局模式(见下表) |
combine.options |
object | 否 | 布局相关配置项 |
# 读取并校验清单结构 yq eval '.' manifest.yaml # 提取各组件的 output 字段值 yq eval '.components[].output' manifest.yaml
验证方式:运行命令时添加 --help 参数,确认其可用性。
# 检查所有要求的输出文件是否存在
for output in $(yq eval '.components[].output' manifest.yaml); do
if [[ ! -f "$output" ]]; then
echo "ERROR: Missing component: $output"
exit 1
fi
done
验证方式:运行命令时添加 --help 参数,确认其可用性。
根据清单文件中指定的 layout,执行对应的 FFmpeg 命令。
# 验证输出文件存在且非空 if [[ -f "$output" && -s "$output" ]]; then echo "Composition successful: $output" ls -lh "$output" else echo "ERROR: Composition failed" exit 1 fi
验证方式:运行命令时添加 --help 参数,确认其可用性。
将 GIF/视频自上而下堆叠:
ffmpeg -i top.gif -i bottom.gif -filter_complex "[0:v][1:v]vstack=inputs=2" -y output.gif
验证方式:运行命令时添加 --help 参数,确认其可用性。
带组件间间距(padding):
ffmpeg -i top.gif -i bottom.gif -filter_complex "[0:v]pad=iw:ih+10:0:0:color=black[top];[top][1:v]vstack=inputs=2" -y output.gif
验证方式:运行命令时添加 --help 参数,确认其可用性。
将 GIF/视频并排堆叠:
ffmpeg -i left.gif -i right.gif -filter_complex "[0:v][1:v]hstack=inputs=2" -y output.gif
验证方式:运行命令时添加 --help 参数,确认其可用性。
按顺序播放 GIF/视频:
# 创建 concat 列表文件 cat > concat_list.txt << EOF file 'first.gif' file 'second.gif' file 'third.gif' EOF # 执行拼接 ffmpeg -f concat -safe 0 -i concat_list.txt -y output.gif
验证方式:运行命令时添加 --help 参数,确认其可用性。
ffmpeg -i tl.gif -i tr.gif -i bl.gif -i br.gif -filter_complex "[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2" -y output.gif
验证方式:运行命令时添加 --help 参数,确认其可用性。
ffmpeg -i top.gif -i bottom.gif -filter_complex "color=c=#1a1a2e:s=800x600[bg];[bg][0:v]overlay=0:0[tmp];[tmp][1:v]overlay=0:300" -y output.gif
验证方式:运行命令时添加 --help 参数,确认其可用性。
| 布局 | 说明 | 支持的配置项 |
|---|---|---|
vertical |
自上而下堆叠 | padding、background、align |
horizontal |
从左至右堆叠 | padding、background、align |
sequential |
按顺序播放 | transition、duration |
grid |
N × M 网格布局 | rows、cols、padding |
overlay |
图层叠加(上层覆盖下层) | position、opacity |
pip |
画中画(Picture-in-Picture) | corner、scale、margin |
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
padding |
int | 0 | 组件之间的像素间距 |
background |
string | "black" | 背景色(支持十六进制或颜色名称) |
align |
string | "center" | 对齐方式:left / center / right |
transition |
string | "none" | 转场类型:fade / wipe / none |
scale |
float | 0.25 | PiP 缩放比例 |
corner |
string | "br" | PiP 所在角落:tl(左上)、tr(右上)、bl(左下)、br(右下) |
name: plugin-demo
components:
- type: tape
source: demo.tape
output: terminal.gif
- type: playwright
source: browser.spec.ts
output: browser.gif
combine:
output: demo-combined.gif
layout: vertical
options:
padding: 5
background: "#0d1117"
验证方式:运行命令时添加 --help 参数,确认其可用性。
name: before-after
components:
- type: static
source: before.gif
output: before.gif
- type: static
source: after.gif
output: after.gif
combine:
output: comparison.gif
layout: horizontal
options:
padding: 10
验证方式:运行命令时添加 --help 参数,确认其可用性。
name: pip-demo
components:
- type: tape
source: main.tape
output: main.gif
- type: playwright
source: overlay.spec.ts
output: overlay.gif
combine:
output: pip-demo.gif
layout: pip
options:
corner: br
scale: 0.3
margin: 20
验证方式:运行命令时添加 --help 参数,确认其可用性。
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习
最新文章