Tích hợp video AI
Vietrouter nhận chuẩn OpenAI Videos (/v1/videos): tạo video từ chữ, từ ảnh, ghép nhiều ảnh tham chiếu, nối khung đầu với khung cuối, upscale 1080p trên Veo và hủy task đang chờ. Job tạo thành công thì trừ tiền ngay. Nếu trạng thái sau đó là lỗi (failed, error), hệ thống hoàn toàn bộ số tiền và hạn mức gói của lượt đó. Hủy task bằng DELETE không hoàn tiền.
1. Kết nối
- Base URL:
https://vietrouter.com.vn/v1 - Xác thực:
Authorization: Bearer sk-mtm-... - Tương thích SDK
openai(Python, Node.js), cURL, Requests, Axios, Fetch.
2. Model và tính năng
| Model | Thời lượng | Đơn giá / video | Tham chiếu | Tỉ lệ | Độ phân giải |
|---|---|---|---|---|---|
seedance-2.5-30s | 30 giây | $2.27 | 1–9 ảnh | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
seedance-2.5-10s | 10 giây | $1.36 | 1–9 ảnh | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
seedance-2.5 | 5, 10, 15 hoặc 20–30 giây. Mặc định 5. | $0.1273 đến $0.4227 | 1–10 ảnh | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
seedance-2.0-fast | 5, 10, 15 giây. Mặc định 5. | $0.10 đến $0.2591 | 1–10 ảnh | 9:16, 16:9, 1:1, 3:4, 4:3 | 720p |
veo-3.1 | 4, 6, 8 giây | $0.1136 | 1–3 ảnh, khung cuối | 9:16, 16:9 | 720p / 1080p |
google-omni-flash | 5, 10 giây | $0.15 | 1–3 ảnh, video gốc | 9:16, 16:9 | 720p |
Ảnh tham chiếu, last_frame và 1080p không tính thêm. Gửi mã seedance-2.5-stable-10s được hiểu là seedance-2.5-10s. seedance-2.5-10s luôn tạo 10 giây và seedance-2.5-30s luôn tạo 30 giây, kể cả khi body gửi seconds khác. Giá hai mã này không đổi.
3. Endpoint
3.1. Tạo job: POST /v1/videos
Gửi application/json hoặc multipart/form-data. Cổng trả ngay queued kèm id. Tiền trừ khi lần gọi này trả HTTP 200.
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
| model | Có | Một mã trong bảng mục 2. |
| prompt | Có | Mô tả video. Tiếng Việt hoặc tiếng Anh. |
| seconds | Không | seedance-2.0-fast: 5, 10, 15. seedance-2.5: 5, 10, 15 hoặc 20–30. veo-3.1: 4, 6, 8. google-omni-flash: 5, 10. Hai mã 10s và 30s cố định theo tên model. |
| aspect_ratio | Không | 16:9, 9:16, 1:1. Seedance thêm 3:4, 4:3. |
| size | Không | 1280x720, 720x1280, 1024x1024 và các khổ Seedance khác. |
| images / input_reference | Không | URL https, data URI, hoặc { image_url }. Tối đa 30 MB mỗi ảnh. |
| last_frame | Không | Ảnh kết thúc. Dùng với veo-3.1 cùng một ảnh đầu. |
| input_video | Không | URL video gốc cho google-omni-flash. |
| resolution | Không | 1080p trên veo-3.1. Mặc định 720p. |
3.2. Tra trạng thái: GET /v1/videos/{id}
Poll mỗi 5–10 giây. Thêm ?model= đúng mã đã dùng lúc tạo. Không gửi model thì cổng hỏi bằng seedance-2.5. Lệnh này không trừ thêm tiền.
{
"id": "video_abc123",
"object": "video",
"model": "seedance-2.5",
"status": "completed",
"progress": 100,
"seconds": "10",
"size": "1280x720",
"error": null
}queued: đã nhận, đang chờ.in_progress: đang render.completed: tải được file.failed: xemerror.
3.3. Tải MP4: GET /v1/videos/{id}/content
Trả binary video/mp4. Có thể thêm ?variant=video và model. Không trừ thêm tiền.
3.4. Hủy: DELETE /v1/videos/{id}
Hủy job còn queued. Lệnh hủy không tính thêm phí. Job đã in_progress hoặc completed trả 409. Gửi kèm ?model=.
4. Bảng giá
seedance-2.5-30s: $2.27 / video, 30 giây.seedance-2.5-10s: $1.36 / video, 10 giây.seedance-2.0-fast: 5 giây $0.10, 10 giây $0.1682, 15 giây $0.2591.seedance-2.5: 5 giây $0.1273, 10 giây $0.1955, 15 giây $0.2864, 20–30 giây $0.4227. Không gửi seconds thì tính 5 giây.veo-3.1: $0.1136 / video.google-omni-flash: $0.15 / video.
5. Code mẫu
5.1. Python SDK
from openai import OpenAI
client = OpenAI(
api_key="sk-mtm-...",
base_url="https://vietrouter.com.vn/v1",
)
video = client.videos.create_and_poll(
model="seedance-2.5",
prompt="Cinematic drone shot flying through futuristic neon Tokyo at night",
seconds="10",
size="1280x720",
)
print(video.id, video.status)
content = client.videos.download_content(video.id)
content.write_to_file("tokyo_neon.mp4")5.2. Text-to-video
curl -X POST "https://vietrouter.com.vn/v1/videos" \
-H "Authorization: Bearer sk-mtm-..." \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5",
"prompt": "Cinematic drone shot flying through futuristic neon Tokyo at night",
"seconds": 10,
"aspect_ratio": "16:9"
}'5.3. Image-to-video
curl -X POST "https://vietrouter.com.vn/v1/videos" \
-H "Authorization: Bearer sk-mtm-..." \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0-fast",
"prompt": "The girl in the photo gently turns towards the camera and smiles",
"seconds": 5,
"size": "720x1280",
"input_reference": { "image_url": "https://example.com/portrait.jpg" }
}'5.4. Nhiều ảnh tham chiếu
curl -X POST "https://vietrouter.com.vn/v1/videos" \
-H "Authorization: Bearer sk-mtm-..." \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-10s",
"prompt": "The character in image 1 walking with the puppy in image 2 across the street in image 3",
"aspect_ratio": "16:9",
"input_reference": [
{ "image_url": "https://example.com/char.jpg" },
{ "image_url": "https://example.com/puppy.jpg" },
{ "image_url": "https://example.com/background.jpg" }
]
}'5.5. Khung đầu và khung cuối, 1080p
curl -X POST "https://vietrouter.com.vn/v1/videos" \
-H "Authorization: Bearer sk-mtm-..." \
-H "Content-Type: application/json" \
-d '{
"model": "veo-3.1",
"prompt": "The flower bud slowly blossoms into a brilliant flower",
"seconds": 8,
"size": "1280x720",
"resolution": "1080p",
"input_reference": { "image_url": "https://example.com/bud.jpg" },
"last_frame": { "image_url": "https://example.com/bloom.jpg" }
}'5.6. Video 30 giây
curl -X POST "https://vietrouter.com.vn/v1/videos" \
-H "Authorization: Bearer sk-mtm-..." \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.5-30s",
"prompt": "A quiet temple courtyard at night, three continuous shots, cinematic lighting",
"aspect_ratio": "16:9"
}'5.7. Poll, tải, hủy
curl "https://vietrouter.com.vn/v1/videos/VIDEO_ID?model=seedance-2.5" \
-H "Authorization: Bearer sk-mtm-..."
curl "https://vietrouter.com.vn/v1/videos/VIDEO_ID/content?model=seedance-2.5" \
-H "Authorization: Bearer sk-mtm-..." \
--output tokyo.mp4
curl -X DELETE "https://vietrouter.com.vn/v1/videos/VIDEO_ID?model=seedance-2.5" \
-H "Authorization: Bearer sk-mtm-..."5.8. Node.js
const res = await fetch("https://vietrouter.com.vn/v1/videos", {
method: "POST",
headers: {
Authorization: "Bearer sk-mtm-...",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "seedance-2.5",
prompt: "Cinematic sunset over oceanic waves crashing against rocky cliffs",
seconds: 10,
size: "1280x720",
}),
});
const data = await res.json();
console.log(data.id, data.status);6. Mã lỗi
| Mã | Nguyên nhân | Cách xử lý |
|---|---|---|
| 400 | seconds hoặc size không hợp model, quá số ảnh, body sai. | Đối chiếu mục 2. Đọc error.message. |
| 401 | API key sai hoặc đã thu hồi. | Kiểm tra Authorization: Bearer. |
| 402 | Ví không đủ số dư. | Nạp ví trên trang chủ rồi gọi lại. |
| 404 | Không có video này, hoặc sai model khi poll. | Dùng đúng id và đúng ?model=. |
| 409 | Không hủy được vì job đã chạy hoặc đã xong. | Đợi completed rồi tải file. |
| 429 | Quá nhiều request cùng lúc. | Đợi vài giây rồi thử lại. |
7. Cẩm nang prompt Seedance 2.5
Áp dụng cho seedance-2.5-30s, seedance-2.5-10s và seedance-2.5khi cần giữ đúng nhân vật và bố cục.
7.1. Bảy quy tắc
- Ảnh có mặt người nên chuyển sang phác thảo chì màu. Ảnh trông như ảnh thật dễ bị từ chối.
- Mở prompt bằng câu khóa: ảnh chì chỉ để lấy thiết kế nhân vật và trang phục, video phải render 3D điện ảnh.
- Dòng đầu tiếng Trung để máy khỏi hỏi lại tham số:
Xác nhận tạo. Thông số đã chốt: 16:9 ngang, ba cảnh nối tiếp thành một video hoàn chỉnh, tạo ngay, không cần xác nhận hay hỏi lại.Video dọc thì đổi thành9:16 竖屏. - 10 giây: 1 cảnh. 15 giây: 1–2 cảnh. 30 giây: 2–3 cảnh. Quá nhiều cảnh dễ bị hỏi lại.
- Viết 镜头1 / 镜头2. Không ghi mốc giây trong prompt. Thời lượng nằm ở tham số API.
- Tránh từ máu me, xác, gore. Đổi sang từ mô tả an toàn ở bảng dưới.
- Khóa bố cục: ai bên trái, ai bên phải, đèn ở đâu, và câu "Nobody disappears, teleports or swaps sides."
7.2. Ảnh tham chiếu
- Nhân vật có mặt: vẽ lại bằng chì màu, giữ dáng, quần áo, vũ khí, góc mặt.
- Quái vật, bối cảnh không người: giữ ảnh gốc.
- Không gửi hai ảnh mâu thuẫn vị trí cùng một vật.
- JPEG hoặc PNG, cạnh dài khoảng 1280–1536 px, tổng nên dưới 12 MB, tối đa 9 ảnh.
- Thứ tự ảnh khớp Image 1, Image 2, Image 3 trong prompt.
7.3. Khung prompt 30 giây, 3 cảnh
Xác nhận tạo. Thông số đã chốt: 16:9 ngang, ba cảnh nối tiếp thành một video hoàn chỉnh, tạo ngay, không cần xác nhận hay hỏi lại.
Epic folk-horror action set piece. The reference images of characters are colored-pencil design sketches: use them only for character design and outfits, and render the whole video as photoreal 3D CG game cinematic, UE5 look, dramatic lighting, heavy motion blur on fast action.
Image 1 = PROTAGONIST: [mô tả nhân vật chính].
Image 2 = ANTAGONIST: [mô tả đối thủ].
Image 3 = ENVIRONMENT: [bối cảnh].
FIXED LAYOUT: altar in the background CENTER; protagonist on the LEFT; antagonist on the RIGHT. Nobody disappears, teleports or swaps sides.
LIGHTING: torchlight from the left wall, cool moonlight from the broken ceiling.
Style of action: fast, dense, well-choreographed, orbiting camera. No blood, no wounds, no gore.
Sound: heavy impacts, wind, no dialogue.
镜头1: camera pushes in, protagonist on the left draws a weapon, antagonist on the right raises claws.
镜头2: fast exchange, camera orbits.
镜头3: climax strike, both stay on their sides, protagonist lands ready.
Keep faces and outfits consistent. No text, no numbers, no subtitles, no watermark.Đoạn 10 giây chỉ dùng một 镜头. Ghi START ở đầu và END ở cuối để nối clip sau.
7.4. Từ nên tránh
| Dễ bị chặn | Thay bằng |
|---|---|
| blood, wound, gore, corpse | sparks, black smoke, torn fabric only |
| vũng máu, nước ngâm | murky grey mist, dark viscous puddle |
| cắn xé, hồn kêu | glowing wisps of spirit-light, shadowy aura |
| chém rách da | tearing only the fabric of the sleeve, no blood |
7.5. Nối các đoạn 10 giây
- Mỗi đoạn có nội dung và tư thế kết thúc.
- START của clip sau bằng END của clip trước.
- Giữ cùng bộ ảnh và phần mở prompt, chỉ đổi phần 镜头.
- Không giữ hình đứng quá lâu ở cuối clip.
7.6. Lỗi thường gặp
| Hiện tượng | Cách xử lý |
|---|---|
| Máy hỏi lại A/B hoặc thời lượng, không tạo video | Giảm số cảnh. Thêm dòng xác nhận tiếng Trung ở đầu prompt. |
| failed ngay khi bắt đầu | Đổi từ nặng theo bảng 7.4 rồi gửi lại. |
| Từ chối ảnh tham chiếu | Chuyển mặt người sang phác thảo chì màu. |
| Nhân vật biến mất hoặc đổi bên | Thêm FIXED LAYOUT và đối chiếu hai ảnh không mâu thuẫn. |
| Tải file lỗi 502 | Đợi 5–10 giây rồi gọi lại /content. |
7.7. Soi khung bằng ffmpeg
ffmpeg -i clip.mp4 -vf "fps=1,scale=320:-1,tile=6x5" -frames:v 1 luoi_kiem_tra.pngGhép clip thì đưa về cùng 1280x720, 24 fps, rồi nối. Chỉnh sáng nhẹ bằng eq của ffmpeg, không cần render lại.
8. Checklist trước khi gửi
- Dòng đầu có câu xác nhận tiếng Trung, đúng tỉ lệ và số cảnh.
- Có câu khóa: chì màu chỉ để thiết kế, video render 3D.
- Ảnh mặt người đã chuyển chì màu.
- Thứ tự ảnh khớp Image 1 đến N.
- Có FIXED LAYOUT và câu không biến mất, không đổi bên.
- Có LIGHTING.
- Dùng 镜头, không ghi số giây trong prompt.
- Không còn từ máu me.
- Có câu No text, no numbers, no subtitles, no watermark.