n8n短视频自动化工厂:低代码工作流搭建指南 简介这是一套基于n8n构建全自动短视频生产线的开源项目代码包面向具备基础Docker与API调用能力的开发者及AI内容自动化实践者解决短视频从文案生成、视频合成到YouTube发布全流程手动操作效率低下的问题。压缩包共11个文件17KB含2个核心Python脚本驱动MoneyPrinterTurbo视频生成与Gemini文案调用、2个Markdown文档README与TODO说明、1个docker-compose.yml定义n8n服务栈、1个Shell安装脚本、1个.env环境配置文件、1个JSON格式n8n工作流定义以及HTML入口页等结构精简、模块职责明确便于快速部署与二次开发。已有120人学习下载资源直接提供可运行的完整工作流定义与跨平台Ubuntu/Debian/macOS/WSL2适配脚本附带常见问题排错提示与扩展方向建议帮助用户跳过环境踩坑、聚焦流程集成与业务优化。1. 什么是 n8n 自动短视频工厂用低代码工作流把脚本、剪辑、发布串成一条流水线你有没有遇到过这种场景每天要给 5 个平台发 3 类短视频——口播稿从 Notion 拉、字幕用 Whisper 生成、封面图靠 Stable Diffusion 批量出、最后还得按平台规则裁成 9:16/1:1/16:9 三版再分别发到抖音、视频号、小红书。手动操作 2 小时起步错一帧就得重来。而「n8n 自动短视频工厂」就是把这套动作全交给工作流Notion 新建一条待发布记录 → 自动触发语音转文字 → 调用本地 FFmpeg 剪掉静音段 → 用 Python 脚本插入动态字幕 → 调用 ComfyUI API 渲染封面 → 分别上传至各平台 API 并自动填标题/标签/描述。它不是“一键成片”的黑匣子而是可调试、可分段验证、可灰度上线的短视频生产流水线。适合中小团队内容运营、独立创作者批量产内容、教育机构做课程短视频分发——核心价值不在“省时间”而在“让每一步都可追溯、可回滚、可替换”。比如某高校新媒体组用它把 120 条思政微课视频的发布周期从 3 天压到 47 分钟关键不是快是每次改字幕样式或换封面模板只动一个节点不影响其他环节。2. 搭建基础环境n8n 服务 必备插件 短视频工具链对齐n8n 不是传统意义上的“视频剪辑软件”它本质是事件驱动的工作流引擎。想让它指挥短视频生产得先让它的“手”能碰到剪辑工具、“眼”能读取元数据、“嘴”能调用 API。下面这三步缺一不可跳过任何一步后面所有节点都会卡在“找不到命令”或“权限拒绝”。2.1 在 Linux 服务器上部署 n8n推荐 Docker 方式n8n 官方明确不支持 Windows 下的本地文件系统路径调度尤其涉及 FFmpeg 调用时路径解析会玄学失败Mac 因 SIP 机制常拦截 Python 子进程调用。所以生产环境必须用 LinuxUbuntu 22.04 LTS 最稳。Docker 部署最干净避免 Node.js 版本冲突# 创建专用网络和数据卷 docker network create n8n-net docker volume create n8n-data # 启动 n8n关键参数说明见下文 docker run -d \ --name n8n \ --restart always \ --network n8n-net \ -v n8n-data:/home/node/.n8n \ -v /path/to/your/videos:/home/node/videos:rw \ # 必须挂载视频工作目录 -v /usr/bin/ffmpeg:/usr/bin/ffmpeg:ro \ # 必须挂载系统级 ffmpeg -v /path/to/python/scripts:/home/node/scripts:ro \ -p 5678:5678 \ -e N8N_BASIC_AUTH_ACTIVEtrue \ -e N8N_BASIC_AUTH_USEReditor \ -e N8N_BASIC_AUTH_PASSWORDyour_strong_password \ -e WEBHOOK_TUNNEL_URLhttps://your-domain.com \ n8nio/n8n提示-v /path/to/your/videos:/home/node/videos:rw是整条流水线的“中央仓库”所有节点读写都走这个路径-v /usr/bin/ffmpeg:/usr/bin/ffmpeg:ro是硬性要求——n8n 的 Execute Command 节点无法通过apt install ffmpeg在容器内安装必须宿主机提供二进制并挂载。实测 Ubuntu 22.04 自带的 ffmpeg 5.1.2 完全兼容无需降级。2.2 安装 n8n 必备社区节点非官方但高稳定n8n 默认节点库不支持 ComfyUI、Whisper.cpp、小红书 API 等需手动安装经生产验证的社区包。进入容器执行docker exec -it n8n bash npm install n8n-nodes-comfyui1.3.0 \ n8n-nodes-whisper-cpp0.4.2 \ n8n-nodes-xiaohongshu0.2.1 \ n8n-nodes-ffmpeg0.5.0 exit docker restart n8n参数说明n8n-nodes-comfyui1.3.0专为 ComfyUI 0.9.12 设计支持 workflow JSON 直传、支持自定义模型路径变量n8n-nodes-whisper-cpp0.4.2基于 whisper.cpp v1.5.2 编译比 Python 版快 3.2 倍内存占用低 60%n8n-nodes-xiaohongshu0.2.1绕过小红书 Web 端反爬直连其开放平台 OAuth2 接口支持草稿箱存入定时发布n8n-nodes-ffmpeg0.5.0非简单 shell 封装内置 12 种常用剪辑逻辑如remove-silence、add-subtitle、resize-to-ratio参数全部暴露为 workflow 变量。2.3 验证工具链连通性三步真机测试光装完不行得确认每个“手”真能干活。在 n8n UI 中新建临时 workflow依次测试FFmpeg 连通性测试用Execute Command节点执行ffmpeg -version输出应含ffmpeg version 5.1.2Whisper.cpp 测试用Whisper.cpp节点上传一段 5 秒测试音频.wav格式检查是否返回text字段含识别文本ComfyUI 测试用ComfyUI节点传入最小 workflow JSON仅含LoadImageSaveImage检查/home/node/videos/output/是否生成新图片。血泪经验某开发者卡在第 2 步 3 天最终发现是 Whisper.cpp 节点默认使用tiny.en模型但他的音频采样率是 48kHz而该模型只接受 16kHz。解决方案在节点配置里显式指定model: base.en并勾选resample_to_16k: true。这个参数藏在高级设置里UI 上无提示。3. 设计核心工作流从 Notion 触发到多平台分发的 7 个原子节点一个可维护的短视频工厂不能堆砌功能而要拆成职责单一、输入输出明确、失败可隔离的原子节点。我们以“口播类知识短视频”为基准场景时长 60±10 秒含字幕封面平台适配设计以下 7 个核心节点。每个节点都对应一个真实可运行的 n8n 操作不是概念图。3.1 Notion 数据库监听用 Webhook 替代轮询降低延迟与负载n8n 内置的 Notion 节点只支持轮询polling默认间隔 5 分钟对时效性要求高的发布场景不适用。正确做法是在 Notion 数据库开启Public Share→ 获取Webhook URL→ 在 n8n 中用Webhook节点接收。Notion 端设置如下字段名类型说明statusSelect值为ready-to-process时才触发video_urlURL指向原始 MP4必须是公开可直链script_textText口播稿全文用于 Whisper 校对platformsMulti-select[douyin, weixin, xiaohongshu]n8n Webhook 节点配置Path:/notion-triggerResponse Code:200Response Body:{status: received}Response Headers:Content-Type: application/json逻辑说明Notion 每次修改status字段为ready-to-process会向该 Webhook 发 POST 请求携带完整 page 数据。n8n 自动解析为json对象后续节点直接用{{$json[properties][video_url][url]}}取值。比轮询快 300 倍且零资源消耗。3.2 视频预处理用 FFmpeg 节点切片 降噪 统一分辨率原始视频常含片头片尾、背景噪音、分辨率混乱。用FFmpeg社区节点一次性解决{ input: {{$json[properties][video_url][url]}}, output: /home/node/videos/raw/{{ $json[id] }}.mp4, operations: [ { type: trim, start: 00:00:03, end: 00:01:05 }, { type: denoise, strength: 0.35 }, { type: resize-to-ratio, ratio: 9:16, method: crop } ] }参数说明trim硬编码起止时间实际项目中建议从 Notion 字段读取trim_start/trim_enddenoisestrength: 0.35是实测平衡点——低于 0.2 噪声残留明显高于 0.5 人声发闷resize-to-ratiomethod: crop表示居中裁剪适合口播若用pad则加黑边适合教程类。此节点输出即为后续所有步骤的统一输入源。3.3 语音转文字与校对Whisper.cpp 脚本后处理双保险纯 Whisper 输出常有专业术语错误如“Transformer” 识别成 “Trans former”。我们用两步法先 Whisper 粗识别再用 Python 脚本做规则校对。Whisper.cpp 节点配置audio_url:{{$node[FFmpeg].json[output]}}接上一节点输出路径model:base.enlanguage:entemperature:0.2降低随机性Python 校对脚本存于/home/node/scripts/correct_subtitles.py#!/usr/bin/env python3 import sys import re def correct(text): # 专业术语映射表可从 Notion 数据库动态加载 corrections { r\btrans former\b: Transformer, r\bback prop\b: backpropagation, r\bloss func\b: loss function } for pattern, replacement in corrections.items(): text re.sub(pattern, replacement, text, flagsre.IGNORECASE) return text.strip() if __name__ __main__: input_text sys.stdin.read().strip() print(correct(input_text))n8n 中用Execute Command节点调用python3 /home/node/scripts/correct_subtitles.py输入设为{{$node[Whisper.cpp].json[text]}}输出即为校对后字幕。为什么不用大模型润色实测 GPT-4 Turbo 对字幕做“语义润色”后与视频口型严重不同步。而规则校对只改错字不增删词保证时间轴零偏移。3.4 动态字幕合成用 FFmpeg 节点注入 SRT支持字体/位置/动画n8n 的FFmpeg节点支持add-subtitle操作直接将 SRT 文件烧录进视频{ input: {{$node[FFmpeg].json[output]}}, output: /home/node/videos/subtitled/{{ $json[id] }}.mp4, operations: [ { type: add-subtitle, srt_content: 1\n00:00:00,000 -- 00:00:02,000\nHello world\n\n2\n00:00:02,000 -- 00:00:04,000\nThis is a demo, font: /home/node/fonts/SourceHanSansSC-Bold.otf, fontsize: 48, x: w/2, y: h-120, border: 4, shadow: 2, animation: fade-up } ] }关键细节srt_content字段支持 Jinja2 模板语法可动态拼接{{$node[Python Script].json}}的校对文本font必须挂载到容器内中文字体推荐SourceHanSansSC思源黑体避免乱码animation: fade-up是该节点特有功能会自动生成-vf fadetin:st0:d0.3,drawboxyh-120:h120:cblack0.7:tfill效果比纯 CSS 字幕更兼容播放器。3.5 封面图生成ComfyUI 工作流参数化复用同一张底图不用为每条视频重绘封面。我们用 ComfyUI 的LoadImageCLIPTextEncodeKSamplerSaveImage最小链但关键在参数化控制ComfyUI 节点配置workflow_json: 从文件读取/home/node/comfy/workflows/video_cover.jsoninputs:{ image: {{$node[FFmpeg].json[output]}}, // 取预处理后首帧 prompt: professional tech thumbnail, clean background, bold Chinese text: {{$json[properties][title][title][0][plain_text]}}, seed: {{ $json[id].slice(-6) }} // 用 Notion ID 后 6 位作 seed保证同 ID 封面一致 }避坑点ComfyUI 默认保存路径是/comfyui/output但 n8n 节点会自动将结果拷贝到output字段。为统一管理我们在 ComfyUI 的SaveImage节点里显式设filename_prefix: /home/node/videos/cover/{{ $json[id] }}确保封面存到中央仓库。3.6 多平台适配用 FFmpeg 批量生成不同比例版本抖音9:16、视频号1:1、小红书4:5尺寸不同不能只发一个版本。FFmpeg节点支持batch-resize{ input: {{$node[FFmpeg (subtitles)].json[output]}}, output_dir: /home/node/videos/final/, batch_resize: [ { suffix: _douyin, ratio: 9:16, method: crop }, { suffix: _weixin, ratio: 1:1, method: crop }, { suffix: _xiaohongshu, ratio: 4:5, method: pad } ] }输出结构/home/node/videos/final/abc123_douyin.mp4/home/node/videos/final/abc123_weixin.mp4/home/node/videos/final/abc123_xiaohongshu.mp4后续发布节点直接按platforms字段选择对应文件。3.7 平台发布三个独立节点并行执行失败不阻塞用HTTP Request节点调用各平台 OpenAPI但必须独立部署、独立认证、独立重试平台认证方式重试策略关键字段抖音Access TokenOAuth23 次间隔 2svideo_url,title,desc,tags视频号API Key Secret2 次间隔 5smedia,title,description,cover_image小红书Cookie CSRF Token1 次失败告警source_note_id,title,content,at_users为什么不用单节点聚合某次抖音接口升级导致 503如果三个平台共用一个 HTTP 节点视频号和小红书也会被卡住。拆开后抖音失败只影响抖音其他照常。4. 避坑指南7 条血泪经验总结覆盖 90% 新手翻车现场n8n 短视频工厂看似是“拖拽连线”实则每个节点背后都有操作系统、文件权限、网络协议、API 版本四层水下暗礁。以下是某跨平台系统团队踩过的 7 个典型坑按发生频率排序4.1 现象Whisper.cpp 节点报错Error: Cannot find model file原因节点默认从$HOME/.cache/whisper加载模型但容器内该路径为空且节点未提供自定义路径选项。解决在容器启动时挂载模型目录-v /path/to/models:/root/.cache/whisper:ro并确保模型文件名为base.en.binwhisper.cpp 要求。4.2 现象FFmpeg 节点执行resize-to-ratio后视频黑屏原因输入视频编码为 H.265HEVC而部分 FFmpeg 版本默认不支持硬件解码 HEVC导致帧读取失败。解决在FFmpeg节点的advanced设置中显式添加decoder: libx265或提前用ffmpeg -i in.mp4 -c:v libx264 out.mp4转码。4.3 现象Notion Webhook 触发后n8n 日志显示401 Unauthorized原因Notion 共享链接过期默认 7 天或 n8n 的WEBHOOK_TUNNEL_URL域名证书失效。解决用curl -I https://your-domain.com检查 HTTPS 状态在 Notion 中重新生成 Public Share 链接并更新 n8n Webhook 节点的Path需同步改 Notion 的 webhook 地址。4.4 现象ComfyUI 节点返回500 Internal Server Error日志显示CUDA out of memory原因ComfyUI 默认启用 GPU 推理但 n8n 容器未配置--gpus all导致 fallback 到 CPU 后内存溢出。解决启动 ComfyUI 容器时加--gpus all --shm-size2g并在 n8n 节点配置中设device: cuda若无 GPU则强制device: cpu并调小cfg: 4降低采样步数。4.5 现象小红书发布节点成功但后台显示“审核中”3 小时后被拒原因小红书 API 要求content字段含至少 100 字正文而节点只传了标题。解决在 Notion 中新增content字段Rich Text 类型n8n 节点用{{$json[properties][content][rich_text][0][plain_text]}}拼接不足 100 字时自动补#知识分享 #AI教程标签。4.6 现象多平台发布时抖音视频正常视频号报错invalid media type原因视频号要求 MP4 必须含moovbox 在文件开头faststart而 FFmpeg 默认放在末尾。解决在FFmpeg节点的advanced选项中勾选move_moov_to_front: true或手动加参数-movflags faststart。4.7 现象n8n 重启后所有工作流状态丢失显示No credentials found原因n8n 的凭证Credentials默认存在内存未持久化到/home/node/.n8n/credentials.json。解决在docker run命令中加-e N8N_ENCRYPTION_KEYyour_32_char_key并确保n8n-data卷挂载正确首次启动后在 UI 中手动导出 Credentials 并备份。5. 进阶技巧用 n8n 的表达式引擎实现动态决策与灰度发布当短视频工厂跑顺后真正的效率提升来自让工作流自己做判断而不是人工干预。n8n 的表达式Expression引擎是核心杠杆它能让同一个 workflow 应对不同场景无需复制粘贴。5.1 基于 Notion 字段的动态流程分支Notion 数据库中增加video_type字段Select 类型选项talking_head,screen_record,animationn8n 用IF节点分流// IF 节点 condition 表达式 {{$json[properties][video_type][select][name] talking_head}}True path走“口播类”流程启用字幕封面口型校对False path走“录屏类”流程跳过 Whisper启用add-watermark操作。好处某教育机构有 3 类课程视频以前要维护 3 套 workflow现在一套搞定新增类型只需改 Notion 字段加一个分支。5.2 灰度发布按 Notion ID 哈希值决定发布平台不想所有视频立刻发全平台用 ID 哈希做灰度// 在 Set 节点中计算 hash_mod const id $json[id]; const hash id.split().reduce((acc, char) acc char.charCodeAt(0), 0); return { hash_mod: hash % 100 };然后用IF节点// condition {{$node[Set].json[hash_mod] 30}} // 30% 视频只发抖音True只连接抖音发布节点False连接全部三个平台节点。实测效果某知识博主用此法测试新封面风格先让 20% 视频用新封面7 天后看完播率提升 12%再全量切换零风险。5.3 失败自动降级当 Whisper 失败时用脚本生成伪字幕Whisper 偶尔因音频质量失败但不能让整条流水线停摆。用Catch节点捕获错误降级为规则字幕// Catch 节点后接 Execute Command echo 0\n00:00:00,000 -- 00:00:05,000\n[Audio not processed]\n\n1\n00:00:05,000 -- 00:00:10,000\nCheck audio quality /home/node/videos/subs/{{$json[id]}}.srt再用FFmpeg节点读取该 SRT 烧录——保证视频必有字幕哪怕只是占位符。5.4 参数对照表高频表达式速查可直接抄场景表达式说明取 Notion 标题前 30 字{{$json[properties][title][title][0][plain_text].substring(0,30)}}防止抖音标题超长生成 ISO 时间戳{{$now.toISOString().substring(0,19).replace(T, )}}用于视频描述“录制于 2024-06-15 14:22:05”拼接多平台标签{{ [#AI, #n8n, #automation].join( ) }}避免手动输错空格判断视频时长是否超 60 秒{{$node[FFmpeg].json[duration] 60}}超时则触发剪辑警告节点从 URL 提取文件名{{$json[properties][video_url][url].split(/).pop()}}用于日志追踪我的习惯是所有 Notion 字段读取都加.toString()强转避免null导致 workflow 中断所有路径拼接都用path.join()在 Execute Command 中用 Node.js 脚本不用字符串防止/缺失。这些细节看着小但省下 80% 的 debug 时间。希望帮到你。本文还有配套的精品资源点击获取