n8n 视频拆解,逐帧分析并生成提示词

通过 n8n 工作流结合 ffmpeg 和 AI 视觉模型,实现视频自动拆解、逐帧分析并生成提示词的完整自动化解决方案

关注公众号,发送 n8nfp 获取工作流

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

完整工作流

步骤

  1. 1. 使用 Read/Write Files from Disk 节点获取视频帧。
  2. 2. 使用 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;
  1. 3. 使用 loop 节点循环图片列表。
  2. 4. 使用 http request 节点调用 qwen3-vl-plus 模型。
  3. 5. 使用 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;
  1. 6. 使用 Data tables Insert row节点将提示词持久化保存。