RapidVideoMaker
创建账户

API RapidVideoMaker

REST API 允许从任何 HTTP 客户端处理视频文件——Python 脚本、n8n 工作流、第三方工具。五种模式:合并视频(多个 MP4)、编辑音频(1 MP4 + 1 MP3)、创建视频(1 JPG/PNG + 1 MP3)、视频叠加(2 MP4 画中画)。处理为异步:提交文件后轮询结果。

免费获取您的API令牌
创建账户以获取您的API令牌 — 每天包含20次请求
创建免费账户 已有账户?登录

完整工作流程

每个集成都遵循相同的4步序列:

1
创建任务 — POST /api/v1/render.php
使用Bearer令牌将文件作为multipart/form-data发送。1张JPG/PNG图像 + 1个MP3 + mode=image_to_video → 视频生成。1个MP4 + 1个MP3 → 音频编辑。多个MP4 → 合并。服务器返回唯一的job_id
2
等待任务 — GET /api/v1/jobs.php?job_id=…
定期(每5-10秒)轮询此端点。任务会经历queuedprocessingready(或error)。
3
获取下载URL
当状态变为ready时,响应包含可用的download_url字段。
4
下载文件 — GET /api/download.php?job_id=…
下载最终MP4。文件在任务完成后2小时内可用,之后自动删除。

认证

每个请求必须包含您的API令牌。接受两种格式:

# 认证 — 每个请求必须包含您的API令牌。接受两种格式: Authorization: Bearer rvm_your_token_here # Alternative X-API-Key: rvm_your_token_here

您的令牌可在会员区获取 — 每个账户一个令牌,注册时自动创建。

配额

每个会员账户有每天20个请求,在网页界面和API之间共享。失败的任务不消耗配额。计数器在UTC午夜重置。

POST响应包含quota_usedquota_remaining。超过限制时,服务器响应429

界面 + API = 相同计数器。从网页界面创建的视频和API请求各消耗同一日配额中的1个积分。

队列

一次处理一个任务。如果同时提交多个任务,它们会排队按顺序处理。等待时,状态响应包含:

适用速率限制:/api/v1/jobs.php端点每个令牌最多接受每分钟12次调用。建议:调用间隔10秒。

可用转场效果

直接合并传入transition_type=none(默认),或使用以下类型之一在剪辑间淡入淡出:

none fade fadeblack dissolve wipeleft wiperight slideleft slideright zoomin circleclose

时长(transition_duration)在0.2到2.0秒之间。

端点

POST /api/v1/render.php 创建视频处理任务

五种模式,通过 mode 字段指定(多个 MP4 省略 mode 自动检测 fusion):

用法API模式所需文件描述
合并视频 fusion 2-20个MP4文件 剪辑按提供的顺序首尾相连组装。剪辑之间可选择性添加转场效果。
编辑音频 add_audio mix_audio 1个MP4 + 1个MP3 替换或丰富视频的音轨。视频轨道永不重新编码。

add_audio — 原始音频被删除并完全替换为MP3。
mix_audio — 原始音频被保留,MP3被叠加。
创建视频 image_to_video 1张JPG/PNG + 1个MP3 从静态图像和音频文件生成视频。文本叠加、淡入淡出、分辨率和fps可通过options字段配置。
视频叠加 overlay_video 2 MP4 将第二个视频叠加在主视频上方。位置、大小、透明度和音频可通过 options 字段配置。
文字转MP3 text_to_mp3 (仅文本) 将文本转换为语音并返回MP3文件。无需上传文件 — 将 mode=text_to_mp3textlang 作为表单字段发送。支持网站的全部20种语言。
严格验证:每种模式需要精确的文件数量和类型。add_audiomix_audio只接受1个MP4 + 1个MP3。image_to_video只接受1张JPG/PNG + 1个MP3。
时长规则:在音频和image_to_video模式下,结果时长锁定为MP3时长。

公共参数(multipart/form-data)

字段类型必填描述
videos[]File[]要处理的文件。根据模式不同:2-20个MP4,或1个MP4 + 1个MP3,或1张图像(JPG/PNG)+ 1个MP3。每个文件最大500 MB。
modestring*image_to_video | add_audio | mix_audio。这三种模式必填。仅当所有文件均为MP4时忽略(fusion)。
orderJSON仅限fusion模式 — 定义剪辑顺序的索引JSON数组。
transition_typestring仅限fusion模式。默认:none
transition_durationfloat仅限fusion模式。时长0.2-2.0秒。默认:0.5
optionsJSON仅限image_to_video模式 — 渲染参数的JSON对象。
callback_urlstring任务完成时调用的公共URL(http/https)。响应包含webhook_secret

options参数 — image_to_video模式

全部可选。未提供的值 → 由工作进程应用默认值。

类型默认值描述
textstring""作为叠加显示的文本。空 = 无文本。最多500个字符。
font_sizeint60字体大小(像素)。范围:10-300。
text_colorstring"white"文本颜色(例如:whiteyellow#ffffff)。
text_positionstring"center"文本位置:centertopbottom
boxbooltrue文本后面的半透明背景。
box_colorstring"black@0.4"FFmpeg格式的颜色 + 不透明度:color@opacity
fade_durationfloat0.5淡入/淡出时长(秒),0-2。0 = 无效果。
widthint1080视频宽度(像素),64-3840,强制为偶数。
heightint1920视频高度(像素),64-3840,强制为偶数。
fpsint24帧率(1-60)。
image_fitstring"contain"取景模式:contain = 显示完整图像;cover = 缩放以填满整个画面。
bg_colorstring"black"图像未填满目标分辨率时的背景颜色。
enable_image_motionboolfalse启用照片动画。false时图像保持静态。
image_motion_effectstring"ken_burns"动画效果。接受的值:zoom_inzoom_outpan_left_to_rightken_burns等。
motion_intensityfloat1.0照片动画强度(0.25-2.0)。乘以缩放幅度和平移速度。
text_effectstring"none"文本叠加动画。接受的值:nonefade_inslide_upbounce
text_effect_intensityfloat1.0文本动画强度(0.25-2.0)。text_effectnone时忽略。
text_border_widthint0字符周围黑色轮廓的厚度(像素),0 = 禁用。
text_modestring"static"文字显示模式。static(默认):从第一帧起显示全文。word_by_word:按 word_reveal_speed 的速率逐词显示。与 text_effect 互斥:若 text_mode=word_by_word,则 text_effect 将被忽略。
word_reveal_speedfloat1.5逐词显示速度,单位为词/秒(0.3–5.0,默认 1.5)。仅在 text_mode=word_by_word 时使用。与 OpenAI TTS 同步的推荐值:2.0。
word_animstring"none"每个单词出现的动画。none(默认):即时显示。fade:每个新单词以0.2秒淡入并与前一块交叉淡化。仅在 text_mode=word_by_word 时有效。

options 参数 — overlay_video 模式

均为可选。上传顺序很重要:第一个文件是主视频(背景),第二个文件是叠加视频(前景)。使用 chroma_key 可去除叠加视频的绿幕背景。

类型默认值描述
positionstring"bottom-right"叠加视频的放置位置:top-lefttop-rightbottom-leftbottom-rightcenter
scalefloat0.30叠加视频宽度占主视频宽度的比例。0.25 = 25%。范围:0.05–1.0。
opacityfloat1.0叠加视频的透明度。1.0 = 完全不透明,0.0 = 不可见。
marginint10叠加视频与画面边缘的像素距离。当 position=center 时忽略。范围:0–200。
audiostring"main"保留哪条音轨。main:仅主视频音频。overlay:仅叠加视频音频。mix:两者混合。
chroma_keyboolfalse设为 true 可去除叠加视频的纯绿色(#00FF00)背景 — 适用于绿幕前拍摄的摄像头或动画。
chroma_similarityfloat0.20绿幕容差。低 = 严格匹配(保留主体边缘)。高 = 更宽泛的去除(适应光线不均)。推荐:数字绿 0.10–0.20,物理屏幕 0.25–0.45。范围:0.01–0.60。

options参数 — 音频编辑(mix_audio

仅在mode=mix_audio时可用。add_audio时忽略。

类型默认值描述
mp3_volumefloat1.0叠加MP3的音量(0.0 = 静音,1.0 = 原始音量,2.0 = 双倍)。

成功响应(HTTP 200)

{ "success": true, "job_id": "a3f1c8d2e5b09471...", "mode": "fusion", // "fusion" | "add_audio" | "mix_audio" | "image_to_video" | "overlay_video" "file_count": 2, "transition": null, "quota_used": 1, "quota_remaining": 9, "status_url": "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..." }

curl示例 — image_to_video模式

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" \ -F "videos[]=@narration.mp3" \ -F "mode=image_to_video" \ -F 'options={"text":"Chapter 1","font_size":72,"text_color":"white","text_position":"bottom","box":true,"box_color":"black@0.4","fade_duration":0.5,"width":1080,"height":1920,"image_fit":"contain","bg_color":"black","enable_image_motion":true,"image_motion_effect":"ken_burns","motion_intensity":1.0,"text_effect":"slide_up","text_effect_intensity":1.0}' # image_fit : "contain" | "cover" # bg_color : ignored if image_fit="cover" # enable_image_motion : true = animation on, false (default) = static image # image_motion_effect : zoom_in | zoom_out | pan_left_to_right | pan_right_to_left | pan_top_to_bottom | pan_bottom_to_top | zoom_pan_soft | ken_burns # motion_intensity : 0.25–2.0 — photo animation amplitude (default 1.0) # text_effect : none | fade_in | slide_up | slide_down | slide_left | bounce (ignored if text_mode=word_by_word) # text_effect_intensity : 0.25–2.0 — text animation intensity (default 1.0) # text_border_width : 0–10 px — black outline around characters (0 = disabled) # text_mode : "static" (default) | "word_by_word" — reveal words one by one # word_reveal_speed : 0.3–5.0 w/s — speed for word_by_word mode (default 1.5, ~2.0 for OpenAI TTS) # word_anim : "none" (default) | "fade" — fade-in crossfade on each word (word_by_word only)

curl示例 — 音频编辑

# Replace audio (deletes original) curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "videos[]=@my_music.mp3" \ -F "mode=add_audio" # Keep original audio + overlay MP3 curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "videos[]=@my_music.mp3" \ -F "mode=mix_audio" \ -F 'options={"mp3_volume":0.7}' # mp3_volume : 0.0 (muted) → 1.0 (original volume, default) → 2.0 (amplified)

curl 示例 — overlay_video 模式

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@main_video.mp4" \ -F "videos[]=@overlay_video.mp4" \ -F "mode=overlay_video" \ -F 'options={"position":"bottom-right","scale":0.25,"opacity":1.0,"margin":20,"audio":"main"}' # Green screen overlay curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@main_video.mp4" \ -F "videos[]=@webcam_greenscreen.mp4" \ -F "mode=overlay_video" \ -F 'options={"position":"bottom-left","scale":0.35,"chroma_key":true,"chroma_similarity":0.15,"audio":"mix"}' # position : top-left | top-right | bottom-left | bottom-right | center (default: bottom-right) # scale : 0.05–1.0 — overlay width as fraction of main video (default 0.30) # opacity : 0.0–1.0 — overlay transparency (default 1.0) # margin : 0–200 px — gap from frame edge, ignored if center (default 10) # audio : main | overlay | mix — audio to keep (default: main) # chroma_key : true | false — remove green (#00FF00) background from overlay (default false) # chroma_similarity : 0.01–0.60 — green screen tolerance (default 0.20)

curl示例 — 视频合并

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@clip1.mp4" \ -F "videos[]=@clip2.mp4" \ -F "transition_type=fade" \ -F "transition_duration=0.5"
GET /api/v1/jobs.php?job_id=<hex32> 任务状态

可能的状态

状态含义额外字段
queued 在队列中,尚未处理 queue_position, queue_total, eta_minutes
processing FFmpeg处理中
ready 已完成 — 文件可用 download_url, created_at, expires_at
error 处理失败 error (message)

按状态的响应

{ "job_id": "a3f1c8...", "status": "queued", "queue_position": 2, "queue_total": 3, "eta_minutes": 7 }
{ "job_id": "a3f1c8...", "status": "ready", "download_url": "https://rapidvideomaker.com/api/download.php?job_id=a3f1c8...", "created_at": "2026-06-02T10:00:00+00:00", "expires_at": "2026-06-02T12:00:00+00:00" }

curl示例

curl -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..."
GET /api/v1/jobs.php List all jobs created with this token (paginated, sorted by date desc)

公共参数(multipart/form-data)

apidocs_th_param类型默认值apidocs_th_desc
pageinteger1Page number (starts at 1)
limitinteger20Results per page (max 50, default 20)

按状态的响应

{ "success": true, "jobs": [ { "job_id": "a3f1c8...", "status": "ready", "mode": "fusion", "created_at": "2026-06-02T10:00:00+00:00", "expires_at": "2026-06-02T12:00:00+00:00", "download_url": "https://..." }, ... ], "total": 12, "page": 1, "limit": 20 }
POST /api/v1/publish.php 将视频发布到 YouTube 或 TikTok

将已完成的 job(status=ready)发布到一个或多个社交账户。Token 必须属于会员账户(不是管理员 token)。

前提条件: 使用此端点前,需先在会员区的发布页面通过 OAuth 连接社交账号(YouTube、TikTok)。每个账号的 account_id 在该页面显示。

公共参数(multipart/form-data)

apidocs_th_param类型apidocs_th_requiredapidocs_th_desc
job_idstringapidocs_required已完成视频的 job ID(hex 32 位字符)
publicationsarrayapidocs_required发布对象数组(最多 10 个)

发布对象

apidocs_th_param类型apidocs_th_requiredapidocs_th_desc
account_idintegerapidocs_required已连接社交账号的 ID — 在会员区发布页面中查看
titlestring视频标题(最多 512 个字符)
descriptionstring视频描述(最多 5 000 个字符)
tagsstring逗号分隔的标签(最多 1 024 个字符)
visibilitystringpublic | private | unlisted — 默认:public
tiktok_modestringdraft | direct — 仅 TikTok — 默认:direct
tiktok_privacystringdirect 模式仅 TikTok — direct 模式下必填
allow_commentboolean仅 TikTok — 允许评论
allow_duetboolean仅 TikTok — 允许合拍
allow_stitchboolean仅 TikTok — 允许拼接
your_brandboolean仅 TikTok — 有机推广内容("您的品牌")。
branded_contentboolean仅 TikTok — 品牌内容披露
tiktok_cover_msinteger仅 TikTok — 封面帧时间戳(毫秒,0–60 000,默认 1 000)

按状态的响应

{ "success": true, "results": [ { "account_id": 12, "pub_id": 47, "status": "published", "provider": "youtube", "url": "https://youtu.be/abc123" } ] }

每条发布的错误代码

apidocs_th_code含义
job_not_readyjob 尚未完成
mode_not_supportedtext_to_mp3 job 无法发布
account_not_found账户未找到或已断开连接
tiktok_privacy_requireddirect 模式需要隐私级别
publication_failed上传过程中提供商返回了错误

cURL 示例

curl -X POST https://rapidvideomaker.com/api/v1/publish.php \ -H "Authorization: Bearer rvm_your_token" \ -H "Content-Type: application/json" \ -d '{ "job_id": "a3f1c8...", "publications": [ { "account_id": 12, "title": "My video", "description": "Created with RapidVideoMaker", "visibility": "public" } ] }'
GET /api/download.php?job_id=<hex32> 下载最终文件

以流的形式返回最终MP4文件(Content-Type: video/mp4)。不需要令牌。仅在状态为ready时可用。

文件在任务完成后保留2小时,然后删除。状态变为ready后请立即下载。

可选参数

参数描述
filename下载文件的建议名称(例如:my-video.mp4

curl示例

curl -o "output.mp4" \ "https://rapidvideomaker.com/api/download.php?job_id=a3f1c8...&filename=output.mp4"

Webhooks

Webhook是轮询的替代方案:不是每隔X秒检查状态,而是提供URL,服务器在任务完成时自动通知您。

工作原理

  1. 在POST到/api/v1/render.php时传入callback_url
  2. 响应包含webhook_secret — 保存它以验证签名
  3. 当任务达到readyerror时,服务器向您的URL发送签名的JSON POST
  4. 使用HMAC-SHA256(webhook_secret, raw_body)验证签名
约束:callback_url必须是可公开访问的URL(http或https)。私有、回环和保留IP地址在服务器端被阻止。超时:10秒。

接收到的有效载荷

{ "job_id": "a3f1c8...", "status": "ready", "download_url": "https://rapidvideomaker.com /api/download.php?job_id=a3f1c8...", "timestamp": "2026-04-04T12:00:00+00:00" }
{ "job_id": "a3f1c8...", "status": "error", "error": "FFmpeg xfade failed:...", "timestamp": "2026-04-04T12:00:00+00:00" }

服务器发送的标头

标头
Content-Typeapplication/json
X-RVM-Signaturesha256=<hmac_hex> — 原始主体的HMAC-SHA256签名
X-RVM-Job-Id相关的job_id

签名验证

# Python import hmac, hashlib def verify_webhook(secret: str, body: bytes, signature_header: str) -> bool: expected = "sha256=" + hmac.new( secret.encode(), body, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature_header) # Flask/FastAPI endpoint: sig = request.headers.get("X-RVM-Signature", "") if not verify_webhook(WEBHOOK_SECRET, request.data, sig): return "Invalid signature", 403 data = request.get_json()

错误代码

HTTPJSON代码原因
401unauthorized令牌缺失、无效或已撤销
400missing_files未收到文件
400too_few_files发送的文件少于2个
400too_many_files发送的文件超过20个
400invalid_mime不支持的文件 — 仅接受MP4、MP3和JPG/PNG
400wrong_file_count文件数量与所选模式不匹配
400wrong_file_types文件类型与所选模式不匹配
400invalid_file_combination没有指定模式的文件组合不匹配任何支持的模式
400invalid_optionsoptions字段不是有效的JSON
400invalid_optionoptions中的某个值无效
400file_too_large文件超过500 MB
400invalid_orderorder数组不是有效的排列
400invalid_job_idjob_id格式不正确(必须是32个字符的十六进制)
404job_not_found未找到任务 — job_id未知或从未存在
410job_expired任务已过期 — 曾经存在但2小时恢复窗口已过
429quota_exceeded已达到每天20个成功任务的限制
429rate_limited/api/v1/jobs.php每分钟超过12次调用
500server_error内部服务器错误

集成示例

各模式示例 — 使用pip install requests安装requests

公共配置

import requests, time, sys, json API_BASE = "https://rapidvideomaker.com" API_TOKEN = "rvm_your_token_here" HEADERS = {"Authorization": f"Bearer {API_TOKEN}"}

image_to_video模式 — 图像 + 音频 → 视频

with open("scene.jpg", "rb") as fi, open("narration.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("scene.jpg", fi, "image/jpeg")), ("videos[]", ("narration.mp3", fa, "audio/mpeg")), ], data={ "mode": "image_to_video", "options": json.dumps({ "text": "Chapter 1", "font_size": 72, "text_color": "white", "text_position": "bottom", "box": True, "box_color": "black@0.4", "fade_duration": 0.5, "width": 1080, "height": 1920, "image_fit": "contain", # "contain" | "cover" "bg_color": "black", # ignored if image_fit="cover" "enable_image_motion": True, "image_motion_effect": "ken_burns", "motion_intensity": 1.0, # 0.25–2.0 — photo animation amplitude "text_effect": "slide_up", # none | fade_in | slide_up | slide_down | slide_left | bounce (ignored if text_mode=word_by_word) "text_effect_intensity": 1.0, # 0.25–2.0 — text animation intensity # word-by-word reveal (mutually exclusive with text_effect): # "text_mode": "word_by_word", "word_reveal_speed": 2.0, "word_anim": "fade" }), }, )

音频编辑

# Replace audio (deletes original) — mode=add_audio with open("video.mp4", "rb") as fv, open("music.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("video.mp4", fv, "video/mp4")), ("videos[]", ("music.mp3", fa, "audio/mpeg")), ], data={"mode": "add_audio"}, ) # Keep original audio + overlay MP3 — mode=mix_audio with open("video.mp4", "rb") as fv, open("music.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("video.mp4", fv, "video/mp4")), ("videos[]", ("music.mp3", fa, "audio/mpeg")), ], data={"mode": "mix_audio", "options": json.dumps({"mp3_volume": 0.7})}, # mp3_volume : 0.0 = muted, 1.0 = original volume (default), 2.0 = amplified )

overlay_video 模式 — 画中画

with open("main.mp4", "rb") as fm, open("overlay.mp4", "rb") as fo: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("main.mp4", fm, "video/mp4")), ("videos[]", ("overlay.mp4", fo, "video/mp4")), ], data={ "mode": "overlay_video", "options": json.dumps({ "position": "bottom-right", # top-left | top-right | bottom-left | bottom-right | center "scale": 0.25, # 0.05–1.0 — overlay width fraction "opacity": 1.0, # 0.0–1.0 — transparency "margin": 20, # 0–200 px — gap from frame edge "audio": "main", # main | overlay | mix # green screen: "chroma_key": True, "chroma_similarity": 0.15 }), }, )

视频合并

with open("clip1.mp4", "rb") as f1, open("clip2.mp4", "rb") as f2: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("clip1.mp4", f1, "video/mp4")), ("videos[]", ("clip2.mp4", f2, "video/mp4")), ], data={"transition_type": "fade", "transition_duration": "0.5"}, )

轮询 + 下载(所有模式通用)

resp.raise_for_status() job_id = resp.json()["job_id"] print(f"Job created: {job_id}") for _ in range(120): # timeout 10 min (120 × 5s) r = requests.get( f"{API_BASE}/api/v1/jobs.php", headers=HEADERS, params={"job_id": job_id}, ) data = r.json() status = data["status"] if status == "queued": pos = data.get("queue_position", "?") eta = data.get("eta_minutes", "?") print(f"Queued — position {pos}, ETA ~{eta} min") elif status == "processing": print("Processing…") elif status == "ready": download_url = data["download_url"] break elif status == "error": sys.exit(f"Error: {data.get('error')}") time.sleep(5) else: sys.exit("Timeout: job not completed after 10 min") r = requests.get(download_url, stream=True) with open("output.mp4", "wb") as f: for chunk in r.iter_content(65536): f.write(chunk) print("Downloaded: output.mp4")

n8n中的两种方法:轮询(状态循环)或Webhook(服务器调用n8n)。推荐Webhook。

方法A — Webhook(推荐)

仅3个节点,无循环。

节点1 — Webhook触发器
添加Webhook节点作为工作流输入(方法POST)。

节点2 — 创建任务(HTTP请求)

方法POST
URLhttps://rapidvideomaker.com/api/v1/render.php
认证Header Auth — Authorization: Bearer rvm_…
请求体内容类型Form-Data Multipart
Body params每个剪辑的二进制字段videos[] + 文本字段callback_url

将响应中的webhook_secret保存在工作流变量中以验证签名。

节点3 — 处理结果(在Webhook触发的工作流中)
当n8n收到服务器的POST时,$json.statusreadyerror

验证签名:将{{ $headers['x-rvm-signature'] }}与您的webhook_secret的HMAC-SHA256进行比较。

方法B — 轮询(无Webhook)

5个节点,每10秒状态循环。

节点1 — 创建任务 — 同上配置,无callback_url

节点2 — 等待 — 10秒。

节点3 — 轮询状态(HTTP请求GET)

URLhttps://rapidvideomaker.com/api/v1/jobs.php
查询参数job_id = {{ $('节点1').item.json.job_id }}
认证标头认证 — 相同令牌

节点4 — If{{ $json.status }} === 'ready' → true:节点5 / false:返回节点2。

Set节点中添加迭代计数器,以在60次尝试后退出循环,避免无限循环。

节点5 — 下载:在{{ $json.download_url }}上发起HTTP请求GET。

步骤1 — 创建任务(选择模式)

# fusion JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@clip1.mp4" -F "videos[]=@clip2.mp4") # add_audio (replace audio) JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@video.mp4" -F "videos[]=@music.mp3" \ -F "mode=add_audio") # mix_audio (overlay music at 70% volume) JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@video.mp4" -F "videos[]=@music.mp3" \ -F "mode=mix_audio" -F 'options={"mp3_volume":0.7}') # image_to_video JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" -F "videos[]=@narration.mp3" \ -F "mode=image_to_video" \ -F 'options={"text":"Chapter 1","font_size":72,"text_position":"bottom","fade_duration":0.5,"width":1080,"height":1920}') JOB_ID=$(echo $JOB | grep -o '"job_id":"[^"]*"' | cut -d'"' -f4) echo "Job ID: $JOB_ID"

步骤2 — 轮询

while true; do STATUS=$(curl -s \ -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=$JOB_ID") STATE=$(echo $STATUS | grep -o '"status":"[^"]*"' | cut -d'"' -f4) echo "Status: $STATE" [ "$STATE" = "ready" ] && break [ "$STATE" = "error" ] && { echo "Error"; exit 1; } sleep 10 done

步骤3 — 下载

DOWNLOAD_URL=$(echo $STATUS | grep -o '"download_url":"[^"]*"' | cut -d'"' -f4) curl -o output.mp4 "$DOWNLOAD_URL"

最佳实践

结果文件在任务完成后保留2小时,之后自动删除。