圖像輸入生成影片
先完成影片生成概覽的文字生影片流程,再加入本機參考圖片。本頁沿用相同的 Sora 相容路由及模型。
多語言 API 呼叫
執行方式見多語言範例說明。先設定 API_KEY,並替換模型、檔案網址及 ID 占位值;四種方式會顯示相同請求的原始回應。
這組範例只提交任務,成功回應中的 id 需保留供後續查詢。 先將 reference.png 放在執行目錄;圖片格式與尺寸仍需符合所選模型要求。
bash
curl --fail-with-body --silent --show-error --max-time 180 \
--request POST \
--url "https://api.tokatlas.ai/v1/videos" \
--header "Authorization: Bearer $API_KEY" \
--form model=YOUR_ENABLED_SORA_MODEL_ID \
--form 'prompt=A ceramic cup on a table, steam rising, slow camera movement' \
--form seconds=4 \
--form size=720x1280 \
--form 'input_reference=@reference.png;type=image/png'python
import os
from pathlib import Path
import requests
headers = {
'Authorization': 'Bearer ' + os.environ["API_KEY"],
}
files = {'model': (None, 'YOUR_ENABLED_SORA_MODEL_ID'),
'prompt': (None, 'A ceramic cup on a table, steam rising, slow camera movement'),
'seconds': (None, '4'),
'size': (None, '720x1280')}
files['input_reference'] = ('reference.png', Path('reference.png').read_bytes(), 'image/png')
response = requests.request(
'POST', 'https://api.tokatlas.ai/v1/videos', headers=headers,
files=files,
timeout=180,
)
response.raise_for_status()
print(response.text)js
import { readFile } from "node:fs/promises";
if (!process.env.API_KEY) throw new Error("Set API_KEY first.");
const form = new FormData();
form.append("model", "YOUR_ENABLED_SORA_MODEL_ID");
form.append("prompt", "A ceramic cup on a table, steam rising, slow camera movement");
form.append("seconds", "4");
form.append("size", "720x1280");
form.append("input_reference", new Blob([await readFile("reference.png")], { type: "image/png" }), "reference.png");
const response = await fetch("https://api.tokatlas.ai/v1/videos", {
method: "POST",
headers: {
"Authorization": "Bearer " + process.env.API_KEY,
},
body: form,
signal: AbortSignal.timeout(180_000),
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}
console.log(await response.text());java
import java.net.URI;
import java.net.http.*;
import java.time.Duration;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.io.ByteArrayOutputStream;
public class Example {
public static void main(String[] args) throws Exception {
String apiKey = System.getenv("API_KEY");
if (apiKey == null || apiKey.isBlank()) {
throw new IllegalArgumentException("Set API_KEY first.");
}
String boundary = "TokatlasExampleBoundary";
String payload =
"--TokatlasExampleBoundary\r\nContent-Disposition: form-data; name=\"model\"\r\n\r\nYOUR_ENABLED_SORA_MODEL_ID\r\n" +
"--TokatlasExampleBoundary\r\nContent-Disposition: form-data; name=\"prompt\"\r\n\r\nA ceramic cup on a table, steam rising, slow camera movement\r\n" +
"--TokatlasExampleBoundary\r\nContent-Disposition: form-data; name=\"seconds\"\r\n\r\n4\r\n" +
"--TokatlasExampleBoundary\r\nContent-Disposition: form-data; name=\"size\"\r\n\r\n720x1280\r\n";
ByteArrayOutputStream multipart = new ByteArrayOutputStream();
multipart.write(payload.getBytes(StandardCharsets.UTF_8));
multipart.write(("--" + boundary + "\r\n"
+ "Content-Disposition: form-data; name=\"input_reference\"; filename=\"reference.png\"\r\n"
+ "Content-Type: image/png\r\n\r\n").getBytes(StandardCharsets.UTF_8));
multipart.write(Files.readAllBytes(Path.of("reference.png")));
multipart.write(("\r\n--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8));
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(30)).build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.tokatlas.ai/v1/videos"))
.timeout(Duration.ofSeconds(180))
.header("Authorization", "Bearer " + apiKey)
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.method("POST", HttpRequest.BodyPublishers.ofByteArray(multipart.toByteArray()))
.build();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() < 200 || response.statusCode() >= 300) {
throw new IllegalStateException("HTTP " + response.statusCode() + ": "
+ response.body());
}
System.out.println(response.body());
}
}操作步驟
- 準備
reference.png。圖片格式及尺寸必須符合所選模型要求,範例輸出尺寸為 720×1280。 - 將圖片放到
generate_video.py同一目錄。 - 保留已生成任務的 ID:將
video-task.txt改名備份,讓腳本建立新任務。 - 在原腳本的
requests.post呼叫中,將files參數替換為下方內容。 - 執行原腳本;它會使用相同的查詢與下載流程保存
video.mp4。
python
files = {
"model": (None, os.environ["VIDEO_MODEL_ID"]),
"prompt": (None, "Slow camera movement toward the subject. Preserve its appearance."),
"seconds": (None, "4"),
"size": (None, "720x1280"),
"input_reference": ("reference.png", Path("reference.png").read_bytes(), "image/png"),
}這是參數片段,請以 files=files 傳入原本的 POST 呼叫,並在呼叫之前定義字典。不要手動設定 multipart 的 Content-Type;requests 會產生 boundary。不要沿用圖像生成的 image_urls。
若 API 拒絕圖片,先檢查格式、尺寸與模型的參考圖支援。若需要影片摘要或問答,請使用支援影片理解的模型,而不是影片生成端點。
