n8n 视频拆解,逐帧分析并生成提示词
通过 n8n 工作流结合 ffmpeg 和 AI 视觉模型,实现视频自动拆解、逐帧分析并生成提示词的完整自动化解决方案
ffmpeg 提取视频帧
https://mp.weixin.qq.com/s/yhPJ_Nh1oD22EuxamPASGA 中介绍了重构镜像,并安装 ffmpeg。
https://mp.weixin.qq.com/s/Qf-alZiJLCvb-6mGW91L0w 中完成了视频的下载。
现在,我们用 ffmpeg 来提取视频帧。
新建n8n工作流

将下面代码复制到command节点,根据你的实际情况修改视频地址和保存地址
OUTPUT_DIR="/data/frames_$(date +%s)" && mkdir -p $OUTPUT_DIR && ffmpeg -i /data/douyin_video/douyin.wtf_douyin_7561764434223385902.mp4 -vf "fps=1,scale=640:-1" -q:v 5 $OUTPUT_DIR/frame_%04d.jpg && echo "文件已保存到: $OUTPUT_DIR" && ls -lh $OUTPUT_DIR/
运行后将每一帧保存到文件夹中

AI 提取图片提示词
这里我们使用阿里的视觉理解(qwen3-vl-plus)模型来根据图片生成提示词,并保存到 n8n 的 Data tables 中。
创建 table
为了将提示词持久化,我们先创建个数据表。选择 Data tables 选项卡,点击 Create data table

完整工作流

步骤
- 使用
Read/Write Files from Disk节点获取视频帧。 - 使用
code节点将图片转为 base64。
const out = [];
const input = $input.all();
for (let i = 0; i < input.length; i++) {
const item = input[i];
const binaryData = item.binary?.data;
if (!binaryData) continue;
const fileName = binaryData.fileName ?? 'unknown.jpg';
const mimeType = binaryData.mimeType ?? 'image/jpeg';
// 正确:传入 itemIndex + binaryPropertyName
const binaryBuffer = await this.helpers.getBinaryDataBuffer(i, 'data');
const base64String = binaryBuffer.toString('base64');
out.push({
json: {
filename: fileName,
imageBase64: `data:${mimeType};base64,${base64String}`,
fileSize: binaryData.fileSize ?? binaryBuffer.length,
mimeType,
frameNumber: Number((fileName.match(/\d+/) ?? ['0'])[0]),
},
pairedItem: i,
});
}
return out;
- 使用
loop节点循环图片列表。 - 使用
http request节点调用 qwen3-vl-plus 模型。 - 使用
code节点将返回的图片信息解析。
// 提取 choices[0].message.content
const items = [];
for (const item of $input.all()) {
const response = item.json;
// 提取 content 字段
const content = response.choices?.[0]?.message?.content || '';
// 尝试解析 JSON(因为 content 是 JSON 字符串)
let parsedContent = null;
try {
parsedContent = JSON.parse(content);
} catch (error) {
console.error('Failed to parse content:', error);
}
// 获取原始文件名
const filename = item.json.filename || 'unknown';
items.push({
json: {
filename: filename,
prompt: content, // 原始 JSON 字符串
visual_style: parsedContent, // 解析后的对象
finish_reason: response.choices?.[0]?.finish_reason || '',
timestamp: new Date().toISOString()
}
});
}
return items;
- 使用
Data tables Insert row节点将提示词持久化保存。
2728

被折叠的 条评论
为什么被折叠?



