Videos API

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.

Về tài liệu API

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

ModelThời lượngĐơn giá / videoTham chiếuTỉ lệĐộ phân giải
seedance-2.5-30s30 giây$2.271–9 ảnh16:9, 9:16, 1:1, 4:3, 3:4720p
seedance-2.5-10s10 giây$1.361–9 ảnh16:9, 9:16, 1:1, 4:3, 3:4720p
seedance-2.55, 10, 15 hoặc 20–30 giây. Mặc định 5.$0.1273 đến $0.42271–10 ảnh16:9, 9:16, 1:1, 4:3, 3:4720p
seedance-2.0-fast5, 10, 15 giây. Mặc định 5.$0.10 đến $0.25911–10 ảnh9:16, 16:9, 1:1, 3:4, 4:3720p
veo-3.14, 6, 8 giây$0.11361–3 ảnh, khung cuối9:16, 16:9720p / 1080p
google-omni-flash5, 10 giây$0.151–3 ảnh, video gốc9:16, 16:9720p

Ả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ộcMô tả
modelCóMột mã trong bảng mục 2.
promptCóMô tả video. Tiếng Việt hoặc tiếng Anh.
secondsKhôngseedance-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_ratioKhông16:9, 9:16, 1:1. Seedance thêm 3:4, 4:3.
sizeKhông1280x720, 720x1280, 1024x1024 và các khổ Seedance khác.
images / input_referenceKhôngURL https, data URI, hoặc { image_url }. Tối đa 30 MB mỗi ảnh.
last_frameKhôngẢnh kết thúc. Dùng với veo-3.1 cùng một ảnh đầu.
input_videoKhôngURL video gốc cho google-omni-flash.
resolutionKhông1080p 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: xem error.

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ânCách xử lý
400seconds hoặc size không hợp model, quá số ảnh, body sai.Đối chiếu mục 2. Đọc error.message.
401API key sai hoặc đã thu hồi.Kiểm tra Authorization: Bearer.
402Ví không đủ số dư.Nạp ví trên trang chủ rồi gọi lại.
404Không có video này, hoặc sai model khi poll.Dùng đúng id và đúng ?model=.
409Không hủy được vì job đã chạy hoặc đã xong.Đợi completed rồi tải file.
429Quá 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

  1. Ả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.
  2. 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.
  3. 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ành 9:16 竖屏.
  4. 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.
  5. Viết 镜头1 / 镜头2. Không ghi mốc giây trong prompt. Thời lượng nằm ở tham số API.
  6. Tránh từ máu me, xác, gore. Đổi sang từ mô tả an toàn ở bảng dưới.
  7. 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ặnThay bằng
blood, wound, gore, corpsesparks, black smoke, torn fabric only
vũng máu, nước ngâmmurky grey mist, dark viscous puddle
cắn xé, hồn kêuglowing wisps of spirit-light, shadowy aura
chém rách datearing only the fabric of the sleeve, no blood

7.5. Nối các đoạn 10 giây

  1. Mỗi đoạn có nội dung và tư thế kết thúc.
  2. START của clip sau bằng END của clip trước.
  3. Giữ cùng bộ ảnh và phần mở prompt, chỉ đổi phần 镜头.
  4. Không giữ hình đứng quá lâu ở cuối clip.

7.6. Lỗi thường gặp

Hiện tượngCách xử lý
Máy hỏi lại A/B hoặc thời lượng, không tạo videoGiả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ếuChuyể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ênThê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.png

Ghé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.
Zalo groupWhatsApp