RapidVideoMaker
Tạo tài khoản

API RapidVideoMaker

The REST API lets you process video files from any HTTP client — Python scripts, n8n workflows, third-party tools. Five modes available: Merge videos (multiple MP4/MOV), Edit audio (1 MP4/MOV + 1 MP3), Create a video (1 JPG/PNG + 1 MP3), Overlay video (2 MP4/MOV picture-in-picture). Processing is asynchronous: submit files, then poll for the result.

Nhận token API miễn phí
Tạo tài khoản để nhận token API — 20 yêu cầu mỗi ngày.
Tạo tài khoản miễn phí Đã có tài khoản? Đăng nhập

Quy trình làm việc hoàn chỉnh

Mỗi tích hợp đều theo cùng một chuỗi 4 bước:

1
Tạo công việc — POST /api/v1/render.php
Gửi tệp của bạn dưới dạng multipart/form-data với token Bearer. 1 ảnh JPG/PNG + 1 MP3 + mode=image_to_video → tạo video. 1 MP4/MOV + 1 MP3 → chỉnh sửa âm thanh. Nhiều MP4/MOV → ghép nối. Server trả về job_id duy nhất. Hoặc 1 ảnh + options.text + options.voice: giọng đọc được tạo từ văn bản, không cần MP3.
2
Chờ công việc — GET /api/v1/jobs.php?job_id=…
Polling endpoint này thường xuyên (mỗi 5–10 giây). Công việc trải qua queued → processing → ready (hoặc error).
3
Lấy URL tải xuống
Khi trạng thái là ready, phản hồi chứa trường download_url sẵn sàng sử dụng.
4
Tải xuống tệp — GET /api/download.php?job_id=…
Tải xuống MP4/MOV cuối cùng. Tệp có sẵn trong 2 giờ sau khi công việc hoàn thành, sau đó tự động xóa.

Xác thực

Mỗi yêu cầu phải bao gồm token API của bạn. Hai định dạng được chấp nhận:

# Xác thực — Mỗi yêu cầu phải bao gồm token API của bạn. Hai định dạng được chấp nhận: Authorization: Bearer rvm_your_token_here # Alternative X-API-Key: rvm_your_token_here

Token của bạn có trong khu vực thành viên — một token mỗi tài khoản, được tạo tự động khi đăng ký.

Hạn ngạch

Mỗi tài khoản thành viên có 20 yêu cầu mỗi ngày, chia sẻ giữa giao diện web và API. Các công việc thất bại không tiêu thụ hạn ngạch. Bộ đếm đặt lại lúc nửa đêm UTC.

Phản hồi POST bao gồm quota_used và quota_remaining. Khi vượt giới hạn, server phản hồi 429.

Giao diện + API = cùng một bộ đếm. Video được tạo từ giao diện web và yêu cầu API mỗi cái tiêu thụ 1 tín dụng từ cùng hạn ngạch hàng ngày.

Hàng đợi

Một công việc được xử lý mỗi lần. Nếu nhiều công việc được gửi đồng thời, chúng sẽ được xếp hàng và xử lý theo thứ tự đến. Trong khi chờ, phản hồi trạng thái bao gồm:

Áp dụng giới hạn tốc độ: endpoint /api/v1/jobs.php chấp nhận tối đa 12 cuộc gọi mỗi phút mỗi token. Khuyến nghị: 10 giây giữa mỗi cuộc gọi.

Chuyển cảnh có sẵn

Truyền transition_type=none (mặc định) để ghép trực tiếp, hoặc một trong các loại dưới đây để mờ dần giữa các clip:

none fade fadeblack dissolve wipeleft wiperight slideleft slideright zoomin circleclose

Thời lượng (transition_duration) từ 0.2 đến 2.0 giây.

Điểm cuối

POST /api/v1/render.php Tạo công việc xử lý video

Five modes, accessible via the mode field (omit mode with multiple MP4s to auto-detect fusion):

Sử dụngChế độ APITệp bắt buộcMô tả
Ghép video fusion 2–20 tệp MP4/MOV Các đoạn clip được lắp ráp liên tiếp theo thứ tự được cung cấp. Chuyển cảnh tùy chọn giữa các clip.
Chỉnh sửa âm thanh add_audio hoặc mix_audio 1 MP4/MOV + 1 MP3 Thay thế hoặc làm phong phú thêm track âm thanh của video. Track video không bao giờ được mã hóa lại.

add_audio — âm thanh gốc bị xóa và thay thế hoàn toàn bằng MP3.
mix_audio — âm thanh gốc được giữ lại và MP3 được phủ lên.
Tạo video image_to_video 1 JPG/PNG + 1 MP3 — hoặc 1 JPG/PNG + văn bản (options.text + options.voice): giọng đọc được tạo Tạo video từ một ảnh tĩnh và MP3 của bạn — hoặc chỉ từ một đoạn văn bản (options.text) có giọng đọc được tạo (options.voice). Chữ phủ (cố định, từng từ hoặc karaoke), hiệu ứng mờ, độ phân giải và fps có thể cấu hình qua trường options.
Overlay video overlay_video 2 MP4/MOV Chồng video thứ hai lên video chính. Vị trí, kích thước, độ mờ và âm thanh có thể cấu hình qua trường options.
Thêm chữ add_text 1 MP4/MOV Chèn chữ lên video có sẵn (giữ nguyên độ phân giải, tốc độ khung hình và âm thanh). Cùng thiết lập chữ như image_to_video, thêm thời điểm chữ xuất hiện. Bắt buộc có options.text.
Văn bản thành MP3 text_to_mp3 (chỉ văn bản) Chuyển đổi văn bản thành giọng nói và trả về tệp MP3. Không cần tải tệp lên — gửi mode=text_to_mp3, text và lang dưới dạng trường biểu mẫu. Hỗ trợ tất cả 20 ngôn ngữ của trang web.
Xác thực nghiêm ngặt: mỗi chế độ yêu cầu số lượng và loại tệp chính xác. add_audio và mix_audio chỉ chấp nhận 1 MP4/MOV + 1 MP3. image_to_video chỉ chấp nhận 1 JPG/PNG + 1 MP3. Ngoại lệ: với options.text + options.voice, image_to_video chỉ nhận 1 ảnh — giọng đọc được tạo từ văn bản (không cần MP3).
Quy tắc thời lượng: trong chế độ audio và image_to_video, thời lượng kết quả bị khóa theo thời lượng MP3. Với options.voice, thời lượng image_to_video bằng giọng đọc được tạo từ văn bản (+0,6 giây).

Tham số chung (multipart/form-data)

TrườngLoạiBắt buộcMô tả
videos[]File[]CÓTệp cần xử lý. Tùy thuộc vào chế độ: 2–20 MP4/MOV, hoặc 1 MP4/MOV + 1 MP3, hoặc 1 ảnh (JPG/PNG) + 1 MP3. Tối đa 500 MB mỗi tệp.
modestring*image_to_video | add_audio | mix_audio | overlay_video | text_to_mp3. Bắt buộc cho các chế độ không phải fusion này. Bỏ qua mode khi chỉ có tệp MP4/MOV luôn kích hoạt fusion (nối bằng sao chép luồng) — không bao giờ là overlay_video, ngay cả khi tải lên đúng 2 tệp MP4/MOV. Đối với chỉnh sửa âm thanh: add_audio xóa bản gốc, mix_audio giữ lại và phủ lên. Nếu trường mode được cung cấp, các tệp đã tải lên phải khớp chính xác — nếu không yêu cầu sẽ bị từ chối. add_text cũng được chấp nhận: đây là chế độ duy nhất nhận một tệp MP4/MOV và yêu cầu options.text.
orderJSONChỉ chế độ fusion — mảng JSON chỉ mục xác định thứ tự clip.
transition_typestringChỉ chế độ fusion. Mặc định: none.
transition_durationfloatChỉ chế độ fusion. Thời lượng 0.2–2.0 giây. Mặc định: 0.5.
optionsJSONĐối tượng JSON chứa tham số render cho image_to_video, add_text, mix_audio và overlay_video (xem các bảng bên dưới).
timingsFile / stringimage_to_video / add_text: tệp thời gian karaoke (SRT hoặc LRC, tối đa 200 KB) — trường tệp hoặc văn bản thuần. Văn bản hiển thị lấy từ tệp; bắt buộc text_mode=karaoke; không dùng cùng voice.
callback_urlstringURL công khai (http/https) được gọi khi công việc hoàn thành. Phản hồi bao gồm webhook_secret.

Tham số options — chế độ image_to_video

Tất cả đều tùy chọn. Giá trị không được cung cấp → mặc định được áp dụng bởi worker.

KhóaLoạiMặc địnhMô tả
textstring""Văn bản hiển thị dưới dạng lớp phủ. Trống = không có văn bản. Tối đa 500 ký tự.
fontstring"default"Phông chữ của văn bản, theo mã định danh. Giá trị được chấp nhận: default, dejavu-sans-bold, dejavu-serif, liberation-serif, dejavu-mono, amiri, noto-sans-sc (简体中文), noto-sans-tc (繁體中文), noto-sans-jp (日本語), noto-sans-kr (한국어), noto-sans-hebrew (עברית), noto-sans-thai (ไทย). default = phông chữ tiêu chuẩn (hỗ trợ emoji); amiri = phông chữ Naskh, lý tưởng cho văn bản tiếng Ả Rập. Mọi giá trị khác sẽ trả về lỗi invalid_option. Emoji chỉ được hiển thị với default.
font_sizeint60Kích thước phông chữ tính bằng pixel. Phạm vi: 10–300.
text_colorstring"white"Màu văn bản (ví dụ: white, yellow, #ffffff).
text_positionstring"center"Vị trí văn bản: center, top, bottom.
boxbooltrueNền bán trong suốt phía sau văn bản.
box_colorstring"black@0.4"Màu + độ mờ ở định dạng FFmpeg: color@opacity.
fade_durationfloat0.5Thời lượng mờ vào/ra tính bằng giây (0–2). 0 = không có hiệu ứng.
widthint1080Chiều rộng video tính bằng pixel (64–3840, buộc chẵn).
heightint1920Chiều cao video tính bằng pixel (64–3840, buộc chẵn).
fpsint24Tốc độ khung hình (1–60).
image_fitstring"contain"contain: Hiển thị toàn bộ ảnh hoặc video và lấp khoảng trống bằng nền đã chọn. solid (mặc định) hoặc blur. Nền mờ yêu cầu image_fit=contain. Chữ vẫn rõ. cover: Ảnh phóng to để lấp đầy khung, căn giữa — các cạnh bị cắt.
bg_colorstring"black"background_mode=solid: Màu nền nếu ảnh không lấp đầy độ phân giải mục tiêu.
background_modestring"solid"solid (mặc định) hoặc blur. Nền mờ yêu cầu image_fit=contain. Chữ vẫn rõ.
blur_strengthnumber20Số từ 1 đến 50; mặc định 20. Chỉ làm mờ Gaussian cho nền.
enable_image_motionboolfalseBật hoạt ảnh ảnh. Nếu false, ảnh giữ nguyên tĩnh.
image_motion_effectstring"ken_burns"Hiệu ứng hoạt ảnh. Giá trị chấp nhận: zoom_in, zoom_out, pan_left_to_right, pan_right_to_left, ken_burns, v.v.
motion_intensityfloat1.0Cường độ hoạt ảnh ảnh (0.25–2.0). Nhân biên độ zoom và tốc độ pan.
text_effectstring"none"Hoạt ảnh lớp phủ văn bản. Giá trị chấp nhận: none, fade_in, slide_up, slide_down, slide_left, bounce.
text_effect_intensityfloat1.0Cường độ hoạt ảnh văn bản (0.25–2.0). Bị bỏ qua nếu text_effect là none.
text_border_widthint0Độ dày viền đen xung quanh ký tự tính bằng pixel (0 = vô hiệu hóa).
text_border_colorstring"black"Màu viền quanh ký tự (cùng định dạng với text_color, mặc định "black"). Dùng khi text_border_width > 0.
text_modestring"static"Chế độ hiển thị văn bản. static (mặc định): toàn bộ văn bản hiển thị từ frame đầu tiên. word_by_word: từ xuất hiện lần lượt theo tốc độ word_reveal_speed. Không dùng cùng text_effect: nếu text_mode=word_by_word, text_effect sẽ bị bỏ qua. "karaoke": văn bản đổi màu theo nhịp âm thanh, theo từng trang (tối đa 1.000 ký tự). Đồng bộ từng từ với voice, nếu không thì được chia trên âm thanh theo độ dài của từ.
word_reveal_speedfloat1.5Tốc độ hiển thị từng từ theo từ/giây (0.3–5.0, mặc định 1.5). Chỉ dùng với text_mode=word_by_word. Giá trị khuyên dùng để đồng bộ OpenAI TTS: 2.0.
word_animstring"none"Hoạt ảnh xuất hiện của từng từ. none (mặc định): hiển thị ngay lập tức. fade: mỗi từ mới xuất hiện với fade 0.2s và crossfade. Chỉ dùng với text_mode=word_by_word.
karaoke_stylestring"fill"Kiểu karaoke: fill (từ đã đọc nhận màu làm nổi bật), sweep (mỗi từ được tô dần; cả từ đối với chữ viết từ phải sang trái) hoặc highlight (chỉ tô màu từ hiện tại).
highlight_colorstring"#FFD200"Màu của từ đã đọc / từ hiện tại ở chế độ karaoke (cùng định dạng với text_color).
karaoke_linesint2Số dòng hiển thị mỗi trang ở chế độ karaoke (1–4).
voicestring""ID giọng đọc (cùng danh sách với text_to_mp3, vd. vi-VN-HoaiMyNeural): giọng đọc được tạo từ text trong cùng một job. Khi đó image_to_video chỉ cần ảnh (MP3 gửi kèm sẽ bị từ chối). Ở chế độ karaoke, mỗi từ được đồng bộ với giọng đọc.
voice_rateint0Tốc độ của giọng đọc được tạo, tính bằng % (−50 đến +50).

Karaoke với thời gian của riêng bạn (SRT / LRC)

Gửi tệp SRT hoặc LRC trong trường timings: mỗi dòng xuất hiện đúng thời điểm và tạo thành một trang karaoke (tối đa 500 dòng, 5.000 ký tự). SRT: dòng biến mất ở thời điểm kết thúc. LRC: dòng ở lại đến dòng kế tiếp (dòng trống sẽ kết thúc nó); hỗ trợ [offset:] và thời gian từng từ của LRC mở rộng <mm:ss.xx> — nếu không, mỗi dòng được chia theo thời lượng của nó. Với add_text, thời gian tính từ đầu video, dịch đi text_start.

# lyrics.srt 1 00:00:01,000 --> 00:00:03,500 First line of the song 2 00:00:04,000 --> 00:00:07,200 Second line, on its own page # lyrics.lrc — enhanced LRC: optional per-word times <mm:ss.xx> [00:01.00]<00:01.00>First <00:01.60>line <00:02.10>here [00:04.00]Second line [00:07.50]

Tham số options — chế độ overlay_video

Tất cả đều tùy chọn. Thứ tự tải lên quan trọng: tệp thứ nhất là video chính (nền), tệp thứ hai là video chồng (tiền cảnh). Dùng chroma_key để xóa nền xanh khỏi video chồng.

KhóaLoạiMặc địnhMô tả
positionstring"bottom-right"Góc đặt video chồng: top-left, top-right, bottom-left, bottom-right, hoặc center.
scalefloat0.30Kích thước video chồng theo tỷ lệ chiều rộng video chính. 0.25 = 25% chiều rộng. Phạm vi: 0.05–1.0.
opacityfloat1.0Độ trong suốt của video chồng. 1.0 = hoàn toàn hiện, 0.0 = vô hình.
marginint10Khoảng cách tính bằng pixel giữa video chồng và cạnh khung. Bị bỏ qua khi position=center. Phạm vi: 0–200.
audiostring"main"Âm thanh cần giữ lại. main: chỉ âm thanh video chính. overlay: chỉ âm thanh video chồng. mix: trộn cả hai.
chroma_keyboolfalseĐặt thành true để xóa nền xanh thuần (#00FF00) khỏi video chồng — hữu ích cho webcam hoặc hoạt hình quay trên phông xanh.
chroma_similarityfloat0.20Độ dung sai chroma key. Thấp = khớp chặt. Cao = xóa rộng hơn. Khuyến nghị: 0.10–0.20 cho màu xanh kỹ thuật số, 0.25–0.45 cho màn hình vật lý. Phạm vi: 0.01–0.60.

Tham số options — chế độ add_text

Bắt buộc có văn bản. Mặc định giữ định dạng, tốc độ khung hình và âm thanh gốc. output_format bật đổi khung với image_fit, bg_color và background_mode. width, height, fps và chuyển động ảnh vẫn bị bỏ qua. Thời lượng tối đa: 15 phút.

{"text":"Hello","output_format":"portrait","image_fit":"contain","background_mode":"blur","blur_strength":20}
KhóaLoạiMặc địnhMô tả
textstringCÓChữ cần chèn. Bắt buộc, 1–200 ký tự.
text_startfloat0Giây mà chữ xuất hiện (≥ 0). Phải trước khi video kết thúc.
text_durationfloat0Chữ hiển thị trong bao lâu, tính bằng giây (0,1–3600). 0 = đến hết video.
fontstring"default"Phông chữ của văn bản, theo mã định danh. Giá trị được chấp nhận: default, dejavu-sans-bold, dejavu-serif, liberation-serif, dejavu-mono, amiri, noto-sans-sc (简体中文), noto-sans-tc (繁體中文), noto-sans-jp (日本語), noto-sans-kr (한국어), noto-sans-hebrew (עברית), noto-sans-thai (ไทย). default = phông chữ tiêu chuẩn (hỗ trợ emoji); amiri = phông chữ Naskh, lý tưởng cho văn bản tiếng Ả Rập. Mọi giá trị khác sẽ trả về lỗi invalid_option. Emoji chỉ được hiển thị với default.
font_sizeint60Cỡ chữ, tính cho video có cạnh ngắn 1080 px và tự động co giãn theo độ phân giải thực — cùng một giá trị cho hiển thị giống nhau ở 720p và 4K. Phạm vi: 10–300.
fade_durationfloat0.5Thời lượng mờ dần vào/ra của chữ (không phải của video), tính bằng giây. Phạm vi: 0–2.
text_color, box, box_color, text_position, text_border_width, text_border_color, text_effect, text_effect_intensity, text_mode, word_reveal_speed, word_anim, karaoke_style, highlight_color, karaoke_lines, voice, voice_rate——Giống với image_to_video (xem bảng ở trên).
original_volumefloat0.3Với voice: âm lượng âm thanh gốc của video bên dưới giọng đọc (0–2, mặc định 0.3; 0 = thay thế). Giọng đọc bắt đầu tại text_start; văn bản hiển thị đến khi giọng đọc kết thúc và, nếu vượt quá cuối video, khung hình cuối sẽ được giữ lại.
background_modestring"solid"solid (mặc định) hoặc blur. Nền mờ yêu cầu image_fit=contain. Chữ vẫn rõ.
blur_strengthnumber20Số từ 1 đến 50; mặc định 20. Chỉ làm mờ Gaussian cho nền.
output_formatstring"original"Chỉ add_text: original (mặc định), portrait (1080×1920), square (1080×1080), landscape (1920×1080). Nền mờ yêu cầu định dạng khác original.
image_fitstring"contain"contain: Hiển thị toàn bộ ảnh hoặc video và lấp khoảng trống bằng nền đã chọn. solid (mặc định) hoặc blur. Nền mờ yêu cầu image_fit=contain. Chữ vẫn rõ. cover: Ảnh phóng to để lấp đầy khung, căn giữa — các cạnh bị cắt.
bg_colorstring"black"background_mode=solid: Màu nền nếu ảnh không lấp đầy độ phân giải mục tiêu.

Tham số options — Chỉnh sửa âm thanh (mix_audio)

Chỉ có sẵn với mode=mix_audio. Bị bỏ qua cho add_audio.

KhóaLoạiMặc địnhMô tả
mp3_volumefloat1.0Âm lượng của MP3 được phủ (0.0 = im lặng, 1.0 = âm lượng gốc, 2.0 = gấp đôi).

Chế độ text_to_mp3 — tham số trực tiếp (không có JSON options)

Khác với các chế độ khác, các trường này được gửi trực tiếp dưới dạng trường biểu mẫu, không nằm trong đối tượng JSON options. Chỉ text là bắt buộc.

KhóaLoạiMặc địnhMô tả
textstring—Văn bản cần chuyển thành giọng nói. Bắt buộc. Tối đa 5.000 ký tự.
langstring"en"Mã ngôn ngữ dùng để chọn giọng mặc định khi voice bị bỏ qua hoặc không hợp lệ. Một trong 20 ngôn ngữ của trang web (xem bảng bên dưới). Quay về en nếu không xác định được.
voicestringtự độngID giọng edge-tts (xem bảng bên dưới). Nếu bỏ qua hoặc không hợp lệ, giọng đầu tiên của lang sẽ được tự động sử dụng.
slowboolfalseĐặt thành true (hoặc 1) để làm chậm tốc độ nói 25%. Bất kỳ giá trị nào khác đều được coi là false.
Không cần tải file lên: khác với các chế độ khác, text_to_mp3 không cần videos[]. Gửi mode=text_to_mp3 cùng với text / lang / voice / slow như các trường biểu mẫu thông thường.

Các giọng có sẵn (edge-tts, Microsoft Neural), được nhóm theo mã ngôn ngữ:

Ngôn ngữGiọng có sẵn
en en-US-AvaNeural, en-US-AndrewNeural, en-GB-LibbyNeural, en-AU-NatashaNeural, en-AU-WilliamMultilingualNeural
fr fr-FR-DeniseNeural, fr-FR-HenriNeural, fr-FR-EloiseNeural, fr-CA-SylvieNeural, fr-CA-ThierryNeural
es es-ES-ElviraNeural, es-ES-AlvaroNeural, es-MX-DaliaNeural, es-AR-ElenaNeural, es-AR-TomasNeural
ar ar-SA-ZariyahNeural, ar-SA-HamedNeural, ar-EG-SalmaNeural, ar-MA-MounaNeural, ar-MA-JamalNeural
pt pt-BR-FranciscaNeural, pt-BR-AntonioNeural, pt-PT-RaquelNeural
de de-DE-KatjaNeural, de-DE-ConradNeural, de-DE-AmalaNeural, de-AT-IngridNeural, de-AT-JonasNeural
it it-IT-ElsaNeural, it-IT-DiegoNeural, it-IT-IsabellaNeural
nl nl-NL-ColetteNeural, nl-NL-MaartenNeural, nl-BE-DenaNeural, nl-BE-ArnaudNeural
ru ru-RU-SvetlanaNeural, ru-RU-DmitryNeural
tr tr-TR-EmelNeural, tr-TR-AhmetNeural
hi hi-IN-SwaraNeural, hi-IN-MadhurNeural
bn bn-IN-TanishaaNeural, bn-IN-BashkarNeural, bn-BD-NabanitaNeural, bn-BD-PradeepNeural
ur ur-PK-UzmaNeural, ur-PK-AsadNeural, ur-IN-GulNeural, ur-IN-SalmanNeural
id id-ID-GadisNeural, id-ID-ArdiNeural
ja ja-JP-NanamiNeural, ja-JP-KeitaNeural
ko ko-KR-SunHiNeural, ko-KR-InJoonNeural
zh-CN zh-CN-XiaoxiaoNeural, zh-CN-YunxiNeural, zh-CN-XiaoyiNeural
zh-TW zh-TW-HsiaoChenNeural, zh-TW-YunJheNeural
vi vi-VN-HoaiMyNeural, vi-VN-NamMinhNeural
pl pl-PL-ZofiaNeural, pl-PL-MarekNeural

Phản hồi thành công (HTTP 200)

{ "success": true, "job_id": "a3f1c8d2e5b09471...", "mode": "fusion", // "fusion" | "add_audio" | "mix_audio" | "image_to_video" | "overlay_video" | "add_text" | "text_to_mp3" "file_count": 2, "transition": null, "quota_used": 1, "quota_remaining": 9, "status_url": "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..." }
Đối với text_to_mp3, phản hồi không có trường file_count hay transition (không có file nào được tải lên) — phần còn lại giống hệt: job_id, quota_used, quota_remaining, status_url, webhook_secret.

Ví dụ curl — chế độ 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" # background_mode : "solid" | "blur" (blur requires contain) # blur_strength : 1–50, default 20 # 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 — outline around characters (0 = disabled) # text_border_color : outline color, default "black" (e.g. "#FF3366", "white@0.8") # 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)

Văn bản karaoke với giọng đọc được tạo (image_to_video, không cần MP3)

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" \ -F "mode=image_to_video" \ -F 'options={"text":"Every word lights up as the voice reads it.","voice":"en-US-AvaNeural","text_mode":"karaoke","karaoke_style":"sweep","highlight_color":"#FFD200","karaoke_lines":2,"text_position":"bottom","font_size":72}' # no MP3: the voice is generated from "text" and gives the timing of every word # text_mode="karaoke" : text up to 1000 characters, shown page by page (karaoke_lines: 1–4) # karaoke_style : "fill" (default) | "sweep" | "highlight" # voice_rate : -50…+50 (%), default 0 # with your own MP3 (no "voice"): karaoke timing is spread over the audio by word length # add_text: same options + "original_volume" (0–2, default 0.3) = original sound under the voice

Karaoke với tệp SRT (image_to_video + MP3 của bạn)

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@cover.jpg" \ -F "videos[]=@song.mp3" \ -F "timings=@lyrics.srt" \ -F "mode=image_to_video" \ -F 'options={"karaoke_style":"sweep","karaoke_lines":2,"text_position":"bottom","font_size":72}' # timings : SRT or LRC file (200 KB max), or its content as a plain text field: -F "timings=<lyrics.lrc" # the displayed text comes from the file ("text" is ignored), text_mode is forced to "karaoke" # not compatible with "voice" (the timings follow your own audio) # add_text: times are relative to the video start, shifted by "text_start"

Ví dụ curl — Chỉnh sửa âm thanh

# 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)

Ví dụ curl — chế độ 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)

Ví dụ curl — chế độ add_text

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "mode=add_text" \ -F 'options={"text":"Hello world","text_position":"bottom","font_size":72,"text_color":"#ffd700","text_start":2,"text_duration":5,"text_effect":"slide_up"}' # text : required, 1–200 characters # text_start : second at which the text appears (default 0) # text_duration : seconds the text stays visible, 0 = until the end (default 0) # the video keeps its resolution, frame rate and audio track

Ví dụ curl — Ghép video

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"

Ví dụ curl — chế độ text_to_mp3

# No file upload — text + lang + voice as plain form fields curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "mode=text_to_mp3" \ -F "text=Welcome to Rapid Video Maker." \ -F "lang=en" \ -F "voice=en-US-AvaNeural" \ -F "slow=false" # voice omitted or invalid -> falls back to the first voice of "lang" curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "mode=text_to_mp3" \ -F "text=Bienvenue sur Rapid Video Maker." \ -F "lang=fr"
GET /api/v1/jobs.php?job_id=<hex32> Trạng thái công việc

Trạng thái gồm giai đoạn thực tế và thời gian đã qua. Ước tính chỉ để tham khảo; hết thời gian chờ phía máy khách không có nghĩa là tác vụ thất bại. Tiếp tục kiểm tra cùng ID tác vụ. Tệp hết hạn hai giờ sau khi hoàn tất.

Các trạng thái có thể

Trạng tháiÝ nghĩaTrường bổ sung
queued Trong hàng đợi, chưa được xử lý queue_position, queue_total, eta_minutes
processing Đang xử lý FFmpeg processing_stage, processing_elapsed_seconds, stage_elapsed_seconds, last_activity_at, processed_media_seconds, eta_overrun
ready Hoàn thành — tệp có sẵn download_url, media_available, created_at, expires_at
error Xử lý thất bại error (message), quota_refund_status: pending | confirmed | not_required
cancelled Đã hủy quota_refund_status: pending | confirmed | not_required

Phản hồi theo trạng thái

{ "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" }

Ví dụ curl

curl -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..."
GET /api/v1/jobs.php Liệt kê tất cả job đã tạo bằng token này (phân trang, sắp xếp theo ngày giảm dần)

Tham số chung (multipart/form-data)

Tham sốLoạiMặc địnhMô tả
pageinteger1Số trang (bắt đầu từ 1)
limitinteger20Số kết quả mỗi trang (tối đa 50, mặc định 20)

Phản hồi theo trạng thái

{ "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 }
GET /api/download.php?job_id=<hex32> Tải xuống tệp cuối cùng

Truyền trực tuyến tệp cuối cùng. Content-Type là video/mp4 cho các chế độ video, hoặc audio/mpeg cho text_to_mp3. Không yêu cầu token. Chỉ có sẵn khi trạng thái là ready.

Tệp được giữ trong 2 giờ sau khi công việc hoàn thành, sau đó bị xóa. Tải xuống ngay khi trạng thái trở thành ready.

Tham số tùy chọn

Tham sốMô tả
filenameTên được đề xuất cho tệp đã tải xuống (ví dụ: video-cua-toi.mp4)
previewĐặt thành 1 để phát trực tiếp trong trang (bỏ qua Content-Disposition: attachment) thay vì kích hoạt tải xuống — dùng để xem trước ngay trên trình duyệt.

Ví dụ curl

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

Webhook

Webhook là lựa chọn thay thế cho polling: thay vì kiểm tra trạng thái mỗi X giây, bạn cung cấp URL và server tự động gọi bạn khi công việc hoàn thành.

Cách hoạt động

  1. Truyền callback_url trong POST đến /api/v1/render.php
  2. Phản hồi chứa webhook_secret — giữ lại để xác minh chữ ký
  3. Khi công việc đạt ready hoặc error, server gửi JSON POST đã ký đến URL của bạn
  4. Xác minh chữ ký với HMAC-SHA256(webhook_secret, raw_body)
Ràng buộc: callback_url phải là URL có thể truy cập công khai (http hoặc https). Địa chỉ IP riêng tư, loopback và dự phòng bị chặn ở phía server. Thời gian chờ: 10 giây.

Payload nhận được

{ "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" }

Header được gửi bởi server

Tiêu đềGiá trị
Content-Typeapplication/json
X-RVM-Signaturesha256=<hmac_hex> — chữ ký HMAC-SHA256 của body thô
X-RVM-Job-Idjob_id liên quan

Xác minh chữ ký

# 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()

Mã lỗi

HTTPMã JSONNguyên nhân
401unauthorizedToken bị thiếu, không hợp lệ hoặc bị thu hồi
400missing_filesKhông có tệp nào được nhận
400too_few_filesÍt hơn 2 tệp được gửi
400too_many_filesHơn 20 tệp được gửi
400invalid_mimeTệp không được hỗ trợ — chỉ chấp nhận MP4, MP3 và JPG/PNG
400wrong_file_countSố lượng tệp không khớp với chế độ đã chọn
400wrong_file_typesLoại tệp không khớp với chế độ đã chọn
400invalid_file_combinationKết hợp tệp không có chế độ được chỉ định không khớp với bất kỳ chế độ nào được hỗ trợ
400invalid_optionsTrường options không phải là JSON hợp lệ
400invalid_optionMột giá trị trong options không hợp lệ
400file_too_largeMột tệp vượt quá 500 MB
400text_requiredTrường options.text bị thiếu hoặc trống (chế độ add_text)
400video_too_longVideo dài hơn 15 phút (chế độ add_text)
400text_start_out_of_rangetext_start vượt quá thời điểm kết thúc video
400invalid_voiceID voice không xác định.
400invalid_timingsTệp thời gian không đọc được (định dạng không nhận ra, không có dòng có thời gian, kết thúc trước bắt đầu, quá dài…).
400invalid_orderMảng order không phải là hoán vị hợp lệ
400invalid_job_idĐịnh dạng job_id sai (phải là 32 ký tự hex)
404job_not_foundKhông tìm thấy công việc — job_id không xác định hoặc chưa từng tồn tại
410job_expiredCông việc đã hết hạn — tồn tại nhưng cửa sổ phục hồi 2 giờ đã qua
429quota_exceededĐạt 20 công việc thành công/ngày
429rate_limitedHơn 12 cuộc gọi/phút trên /api/v1/jobs.php
500server_errorLỗi máy chủ nội bộ

Ví dụ tích hợp

Ví dụ cho mỗi chế độ — cài đặt requests với pip install requests.

Cấu hình chung

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

Chế độ image_to_video — ảnh + âm thanh → 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" "background_mode": "solid", # or "blur" with contain "blur_strength": 20, "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" }), }, )

Chỉnh sửa âm thanh

# 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 )

Chế độ overlay_video — hình trong hình

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 }), }, )

Chế độ add_text — chữ trên video

with open("video.mp4", "rb") as fv: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[("videos[]", ("video.mp4", fv, "video/mp4"))], data={ "mode": "add_text", "options": json.dumps({ "text": "Hello world", # required "text_position": "bottom", # center | top | bottom "font": "amiri", # font id (see the table above) "font_size": 72, "text_start": 2, # appears at 2 s "text_duration": 5, # stays 5 s (0 = until the end) }), }, )

Ghép video

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"}, )

Chế độ text_to_mp3 — chuyển văn bản thành giọng nói

# No files — text + lang (+ optional voice / slow) as form fields resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, data={ "mode": "text_to_mp3", "text": "Welcome to Rapid Video Maker.", "lang": "en", # one of the 20 site language codes "voice": "en-US-AvaNeural", # optional — falls back to the first voice of "lang" "slow": "false", # "true" = -25% speech rate }, )

Polling + tải xuống (chung cho tất cả các chế độ)

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")

Hai cách tiếp cận trong n8n: polling (vòng lặp trạng thái) hoặc webhook (server gọi n8n). Webhook được khuyến nghị.

Cách A — Webhook (được khuyến nghị)

Chỉ 3 node, không có vòng lặp.

Node 1 — Kích hoạt Webhook
Thêm node Webhook làm đầu vào quy trình làm việc (phương thức POST).

Node 2 — Tạo công việc (HTTP Request)

Phương thứcPOST
URLhttps://rapidvideomaker.com/api/v1/render.php
Xác thựcHeader Auth — Authorization: Bearer rvm_…
Loại nội dung BodyForm-Data Multipart
Body paramsTrường nhị phân videos[] cho mỗi clip + Trường văn bản callback_url

Giữ webhook_secret từ phản hồi trong biến quy trình làm việc để xác minh chữ ký.

Node 3 — Xử lý kết quả (trong quy trình làm việc được kích hoạt bởi webhook)
Khi n8n nhận POST của server, $json.status là ready hoặc error.

Để xác minh chữ ký: so sánh {{ $headers['x-rvm-signature'] }} với HMAC-SHA256 từ webhook_secret của bạn.

Cách B — Polling (không có webhook)

5 node, vòng lặp trạng thái mỗi 10 giây.

Node 1 — Tạo công việc — cùng cấu hình không có callback_url.

Node 2 — Chờ — 10 giây.

Node 3 — Poll trạng thái (HTTP Request GET)

URLhttps://rapidvideomaker.com/api/v1/jobs.php
Query paramsjob_id = {{ $('Node 1').item.json.job_id }}
Xác thựcHeader Auth — cùng token

Node 4 — If: {{ $json.status }} === 'ready' → true: Node 5 / false: quay lại Node 2.

Thêm bộ đếm lần lặp trong node Set để thoát vòng lặp sau 60 lần thử.

Node 5 — Tải xuống: HTTP Request GET trên {{ $json.download_url }}.

Bước 1 — Tạo công việc (chọn chế độ)

# 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"

Bước 2 — Polling

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

Bước 3 — Tải xuống

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

Thực hành tốt nhất

Tệp kết quả được giữ 2 giờ sau khi công việc hoàn thành, sau đó tự động xóa.