Saat menggunakan Sora 2 API untuk fitur Image-to-Video (gambar ke video), ketidakcocokan ukuran gambar referensi (墊圖) adalah salah satu error yang paling sering ditemui pengembang. Artikel ini akan mengupas tuntas akar penyebab error Inpaint image must match the requested width and height dan memberikan 5 solusi yang telah teruji.
Nilai Inti: Setelah membaca artikel ini, Anda akan memahami aturan validasi ukuran gambar referensi Sora 2 API, mempelajari cara menggunakan Python Pillow dan FFmpeg untuk pra-pemrosesan gambar, serta menyelesaikan masalah error ukuran sepenuhnya.

Analisis Penyebab Error Ukuran Gambar Referensi Sora 2 API
Saat Anda memanggil fungsi Image-to-Video pada Sora 2 API, jika muncul pesan error berikut:
{
"error": {
"message": "Inpaint image must match the requested width and height",
"type": "invalid_request_error",
"param": null,
"code": null
}
}
Ini berarti ukuran gambar referensi (input_reference) yang Anda unggah tidak sesuai dengan resolusi video target.
Aturan Wajib Pencocokan Ukuran Sora 2 API
Sora 2 API memiliki mekanisme validasi ukuran yang ketat:
| Item Validasi | Persyaratan | Keterangan |
|---|---|---|
| Kecocokan Lebar | Lebar Gambar = Lebar Video | Harus sama persis hingga tingkat piksel |
| Kecocokan Tinggi | Tinggi Gambar = Tinggi Video | Harus sama persis hingga tingkat piksel |
| Dukungan Format | JPEG, PNG, WebP | Ketiga format ini didukung |
| Transmisi File | multipart/form-data | Harus diunggah dalam bentuk file |
Resolusi Video yang Didukung Sora 2 API
Berdasarkan dokumentasi resmi OpenAI, Sora 2 API saat ini mendukung resolusi berikut:
| Resolusi | Lebar x Tinggi | Rasio | Skenario Penggunaan |
|---|---|---|---|
| 720p Landscape | 1280 x 720 | 16:9 | YouTube, video web |
| 720p Portrait | 720 x 1280 | 9:16 | TikTok, Instagram Reels |
| 1080p Landscape (Pro) | 1792 x 1024 | ~16:9 | Video landscape HD |
| 1080p Portrait (Pro) | 1024 x 1792 | ~9:16 | Video portrait HD |
🎯 Penting: Gambar referensi Anda harus sama persis secara piksel dengan resolusi target yang dipilih. Misalnya, jika memilih resolusi 1280×720, maka gambar referensi harus berukuran tepat 1280×720 piksel. Selisih 1 piksel saja akan menyebabkan error.

5 Solusi untuk Galat Ukuran Gambar Referensi Sora 2 API
Solusi 1: Padding dan Pemotongan Cerdas Python Pillow
Menggunakan metode ImageOps.pad() dari Pillow memungkinkan pemrosesan gambar dengan ukuran apa pun secara cerdas, menjaga rasio aspek sambil mengisi (padding) ke ukuran target:
from PIL import Image, ImageOps
import openai
# Resolusi standar yang didukung oleh Sora 2 API
SORA_RESOLUTIONS = {
"landscape_720p": (1280, 720),
"portrait_720p": (720, 1280),
"landscape_1080p": (1792, 1024),
"portrait_1080p": (1024, 1792),
}
def preprocess_image_for_sora(image_path, target_resolution="landscape_720p"):
"""Pra-pemrosesan gambar untuk memenuhi persyaratan ukuran Sora 2 API"""
target_size = SORA_RESOLUTIONS[target_resolution]
# Buka gambar asli
img = Image.open(image_path)
# Gunakan metode pad: pertahankan rasio aspek, isi latar belakang dengan warna hitam
processed = ImageOps.pad(img, target_size, color=(0, 0, 0))
# Simpan gambar yang telah diproses
output_path = image_path.replace(".jpg", "_sora_ready.jpg")
processed.save(output_path, "JPEG", quality=95)
return output_path
# Contoh penggunaan
processed_image = preprocess_image_for_sora("my_image.jpg", "landscape_720p")
# Panggil Sora 2 API - Melalui antarmuka terpadu APIYI
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # Menggunakan antarmuka terpadu APIYI
)
with open(processed_image, "rb") as f:
response = client.videos.create(
model="sora-2",
prompt="A serene landscape comes to life",
size="1280x720",
input_reference=f
)
🚀 Mulai Cepat: Direkomendasikan menggunakan platform APIYI (apiyi.com) untuk menguji Sora 2 API dengan cepat. Platform ini menyediakan antarmuka yang siap pakai, memungkinkan integrasi tanpa konfigurasi yang rumit.
Solusi 2: Center Crop Python Pillow (Mempertahankan Subjek Utama)
Jika Anda ingin mempertahankan konten utama gambar tanpa isian bar hitam (letterbox), Anda bisa menggunakan pemotongan tengah (center crop):
from PIL import Image
def center_crop_for_sora(image_path, target_width, target_height):
"""Memotong gambar di tengah untuk menyesuaikan dengan persyaratan ukuran Sora 2 API"""
img = Image.open(image_path)
orig_width, orig_height = img.size
# Hitung rasio aspek target
target_ratio = target_width / target_height
orig_ratio = orig_width / orig_height
if orig_ratio > target_ratio:
# Gambar asli lebih lebar, skala berdasarkan tinggi lalu potong kedua sisi
new_height = target_height
new_width = int(orig_width * (target_height / orig_height))
else:
# Gambar asli lebih tinggi, skala berdasarkan lebar lalu potong atas dan bawah
new_width = target_width
new_height = int(orig_height * (target_width / orig_width))
# Skala terlebih dahulu
img = img.resize((new_width, new_height), Image.LANCZOS)
# Kemudian potong di tengah
left = (new_width - target_width) // 2
top = (new_height - target_height) // 2
right = left + target_width
bottom = top + target_height
cropped = img.crop((left, top, right, bottom))
output_path = image_path.replace(".jpg", f"_{target_width}x{target_height}.jpg")
cropped.save(output_path, "JPEG", quality=95)
return output_path
# Menyiapkan gambar referensi untuk video 720p landscape
processed = center_crop_for_sora("my_photo.jpg", 1280, 720)
Solusi 3: Pemrosesan Batch Baris Perintah FFmpeg
Untuk skenario yang membutuhkan pemrosesan massal, FFmpeg adalah pilihan yang lebih efisien:
Mode Center Crop (Cover):
# Skala dulu dengan mempertahankan rasio, lalu potong di tengah ke ukuran target
ffmpeg -i input.jpg -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output_sora.jpg
Mode Padding (Letterbox):
# Pertahankan rasio asli saat skala, bagian yang kurang diisi dengan warna hitam
ffmpeg -i input.jpg -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2:black" output_sora.jpg
Skrip Pemrosesan Batch:
#!/bin/bash
# Memproses semua gambar jpg di direktori saat ini ke format landscape 720p Sora 2 API secara massal
for file in *.jpg; do
ffmpeg -i "$file" \
-vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" \
-q:v 2 \
"sora_ready_$file"
done
Solusi 4: Menggunakan Parameter crop_bounds (Pemotongan Bawaan API)
Sora 2 API menyediakan parameter crop_bounds, yang memungkinkan penentuan area pemotongan langsung di level API:
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # Menggunakan antarmuka terpadu APIYI
)
# Gunakan crop_bounds untuk menentukan area pemotongan (dalam bentuk rasio)
with open("full_size_image.jpg", "rb") as f:
response = client.videos.create(
model="sora-2",
prompt="Efek video dinamis",
size="1280x720",
input_reference=f,
crop_bounds={
"left_fraction": 0.1, # Potong 10% dari kiri
"top_fraction": 0.1, # Potong 10% dari atas
"right_fraction": 0.9, # Pertahankan hingga 90% di kanan
"bottom_fraction": 0.9 # Pertahankan hingga 90% di bawah
},
frame_index=0 # Gambar sebagai frame pertama
)
⚠️ Catatan: Saat menggunakan
crop_bounds, area yang telah dipotong harus tetap sesuai dengan resolusi video target. Disarankan untuk mengombinasikannya dengan pra-pemrosesan awal.
Solusi 5: Kelas Utilitas Pra-pemrosesan Gambar yang Lengkap
Berikut adalah kelas utilitas pra-pemrosesan gambar tingkat produksi yang mencakup berbagai mode pemrosesan:
from PIL import Image, ImageOps
from pathlib import Path
import io
class SoraImagePreprocessor:
"""Alat pra-pemrosesan gambar referensi Sora 2 API"""
RESOLUTIONS = {
"1280x720": (1280, 720),
"720x1280": (720, 1280),
"1792x1024": (1792, 1024),
"1024x1792": (1024, 1792),
}
def __init__(self, target_resolution="1280x720"):
if target_resolution not in self.RESOLUTIONS:
raise ValueError(f"Resolusi tidak didukung: {target_resolution}")
self.target_size = self.RESOLUTIONS[target_resolution]
def pad(self, image_path, bg_color=(0, 0, 0)):
"""Mode Padding: Pertahankan rasio asli, tambahkan warna latar belakang"""
img = Image.open(image_path)
return ImageOps.pad(img, self.target_size, color=bg_color)
def cover(self, image_path):
"""Mode Cover: Pertahankan rasio asli, potong di tengah"""
img = Image.open(image_path)
return ImageOps.fit(img, self.target_size, Image.LANCZOS)
def stretch(self, image_path):
"""Mode Stretch: Paksa regangkan ke ukuran target (tidak direkomendasikan)"""
img = Image.open(image_path)
return img.resize(self.target_size, Image.LANCZOS)
def to_bytes(self, img, format="JPEG", quality=95):
"""Mengonversi PIL Image menjadi aliran byte untuk unggahan API"""
buffer = io.BytesIO()
img.save(buffer, format=format, quality=quality)
buffer.seek(0)
return buffer
def process_and_save(self, image_path, mode="cover", output_path=None):
"""Memproses dan menyimpan gambar"""
if mode == "pad":
processed = self.pad(image_path)
elif mode == "cover":
processed = self.cover(image_path)
elif mode == "stretch":
processed = self.stretch(image_path)
else:
raise ValueError(f"Mode tidak didukung: {mode}")
if output_path is None:
p = Path(image_path)
output_path = p.parent / f"{p.stem}_sora_{self.target_size[0]}x{self.target_size[1]}{p.suffix}"
processed.save(output_path, quality=95)
return output_path
# Contoh penggunaan
preprocessor = SoraImagePreprocessor("1280x720")
# Cara 1: Proses dan simpan
output = preprocessor.process_and_save("my_image.jpg", mode="cover")
print(f"Proses selesai: {output}")
# Cara 2: Dapatkan aliran byte langsung untuk pemanggilan API
img = preprocessor.cover("my_image.jpg")
image_bytes = preprocessor.to_bytes(img)
Lihat kode contoh pemanggilan lengkap
import openai
from PIL import Image, ImageOps
import io
class SoraImagePreprocessor:
"""Alat pra-pemrosesan gambar referensi Sora 2 API"""
RESOLUTIONS = {
"1280x720": (1280, 720),
"720x1280": (720, 1280),
"1792x1024": (1792, 1024),
"1024x1792": (1024, 1792),
}
def __init__(self, target_resolution="1280x720"):
if target_resolution not in self.RESOLUTIONS:
raise ValueError(f"Resolusi tidak didukung: {target_resolution}")
self.target_size = self.RESOLUTIONS[target_resolution]
def cover(self, image_path):
"""Mode Cover: Pertahankan rasio asli, potong di tengah"""
img = Image.open(image_path)
return ImageOps.fit(img, self.target_size, Image.LANCZOS)
def to_bytes(self, img, format="JPEG", quality=95):
"""Mengonversi PIL Image menjadi aliran byte"""
buffer = io.BytesIO()
img.save(buffer, format=format, quality=quality)
buffer.seek(0)
return buffer
def generate_video_with_image(image_path, prompt, resolution="1280x720"):
"""
Menghasilkan video Sora 2 menggunakan gambar yang telah diproses sebelumnya
Args:
image_path: Jalur gambar asli
prompt: Petunjuk deskripsi video
resolution: Resolusi target
Returns:
ID tugas pembuatan video
"""
# 1. Pra-pemrosesan gambar
preprocessor = SoraImagePreprocessor(resolution)
processed_img = preprocessor.cover(image_path)
image_bytes = preprocessor.to_bytes(processed_img)
# 2. Inisialisasi klien - Melalui antarmuka terpadu APIYI
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1"
)
# 3. Panggil Sora 2 API
response = client.videos.create(
model="sora-2",
prompt=prompt,
size=resolution,
input_reference=image_bytes,
duration=5 # Durasi video (detik)
)
return response
# Contoh pemanggilan lengkap
if __name__ == "__main__":
result = generate_video_with_image(
image_path="landscape_photo.jpg",
prompt="The scene comes alive with gentle wind moving through the trees",
resolution="1280x720"
)
print(f"Tugas pembuatan video telah dikirim: {result}")
Perbandingan Mode Pra-pemrosesan Gambar Referensi Sora 2 API
Memilih mode pra-pemrosesan yang tepat sangat penting untuk hasil video:

| Mode Pra-pemrosesan | Cara Kerja | Kelebihan | Kekurangan | Skenario Rekomendasi |
|---|---|---|---|---|
| Pad (Isian) | Jaga rasio, tambah bar hitam | Menjaga keutuhan gambar | Mungkin ada bar hitam | Keutuhan konten sangat penting |
| Cover (Potong) | Jaga rasio, potong tengah | Tanpa bar hitam, layar penuh | Bagian pinggir mungkin terpotong | Gambar dengan subjek di tengah |
| Stretch (Regang) | Paksa regangkan | Sederhana dan langsung | Gambar terdistorsi | Tidak direkomendasikan |
💡 Saran Pemilihan: Mode pra-pemrosesan mana yang dipilih sangat bergantung pada konten gambar Anda dan kebutuhan hasil akhir. Kami menyarankan untuk melakukan pengujian nyata melalui platform APIYI (apiyi.com) untuk memvalidasi perbedaan efek dari berbagai mode dengan cepat.
Mode Rekomendasi untuk Berbagai Skenario
| Tipe Gambar | Mode Rekomendasi | Penjelasan |
|---|---|---|
| Foto Potret | Cover | Menjaga subjek manusia tetap di tengah dan utuh |
| Foto Pemandangan | Pad atau Cover | Pilih berdasarkan komposisi gambar |
| Gambar Produk | Pad | Memastikan produk ditampilkan secara utuh |
| Gambar Seni | Pad | Mempertahankan integritas karya seni |
| Tangkapan Layar UI | Cover | Biasanya informasi terpusat di tengah |
Pertanyaan Umum seputar Image Padding Sora 2 API
Q1: Mengapa Sora 2 API sangat ketat terhadap ukuran image padding?
Sora 2 menggunakan image padding (gambar acuan) sebagai frame pertama (first frame) dari video. Model perlu mulai menghasilkan konten dinamis berikutnya dari frame ini. Jika ukuran gambar tidak sesuai dengan target video, model tidak dapat menginisialisasi proses pembuatan dengan benar. Ini adalah batasan teknis yang dirancang oleh OpenAI untuk memastikan konsistensi kualitas hasil video.
Saat memanggil API melalui platform APIYI (apiyi.com), disarankan untuk melakukan prapemrosesan gambar di sisi klien untuk mendapatkan hasil pembuatan video yang optimal.
Q2: Format gambar apa yang sebaiknya dipilih saat prapemrosesan?
Sora 2 API mendukung tiga format: JPEG, PNG, dan WebP:
- JPEG: Direkomendasikan untuk foto, ukuran file kecil, dan unggah lebih cepat.
- PNG: Cocok untuk skenario yang membutuhkan latar belakang transparan atau kualitas tanpa kompresi (lossless).
- WebP: Keseimbangan antara kualitas dan ukuran, tetapi kompatibilitasnya sedikit lebih rendah.
Disarankan menggunakan format JPEG dengan parameter kualitas (quality) diatur ke 90-95 untuk menjamin kualitas sekaligus menjaga ukuran file tetap terkendali.
Q3: Bagaimana jika kualitas gambar menurun setelah diproses?
Penurunan kualitas gambar biasanya disebabkan oleh beberapa faktor berikut:
- Kompresi berlebihan: Tingkatkan kualitas JPEG ke 95.
- Upscaling berlebihan: Gunakan gambar asli yang resolusinya mendekati target.
- Algoritma resampling: Gunakan
Image.LANCZOSalih-alihImage.NEAREST.
# Pengaturan pemrosesan kualitas tinggi
img = img.resize(target_size, Image.LANCZOS) # Menggunakan algoritma Lanczos
img.save(output_path, "JPEG", quality=95) # Simpan dengan kualitas tinggi
Q4: Bagaimana cara memproses banyak gambar sekaligus (batch processing)?
Untuk skenario pemrosesan massal, direkomendasikan menggunakan FFmpeg atau Python multi-threading:
from concurrent.futures import ThreadPoolExecutor
import os
def batch_process(image_dir, output_dir, resolution="1280x720"):
preprocessor = SoraImagePreprocessor(resolution)
def process_single(filename):
input_path = os.path.join(image_dir, filename)
output_path = os.path.join(output_dir, f"sora_{filename}")
return preprocessor.process_and_save(input_path, "cover", output_path)
image_files = [f for f in os.listdir(image_dir) if f.endswith(('.jpg', '.png'))]
with ThreadPoolExecutor(max_workers=4) as executor:
results = list(executor.map(process_single, image_files))
return results
Melalui platform APIYI (apiyi.com), Anda bisa mendapatkan kuota API untuk pemrosesan batch yang cocok untuk proyek pembuatan video skala besar.
Q5: Apakah image padding yang berisi wajah orang akan ditolak?
Ya, sesuai dengan kebijakan OpenAI, image padding yang berisi wajah manusia asli saat ini akan ditolak oleh Sora 2 API. Jika bisnis Anda memerlukan video karakter, disarankan untuk:
- Menggunakan gambar yang tidak memperlihatkan wajah secara jelas.
- Menggunakan gambar karakter virtual yang dihasilkan oleh AI.
- Menggunakan gambar karakter yang telah diproses secara abstrak atau artistik.
Tabel Referensi Cepat Ukuran Image Padding Sora 2 API
Untuk memudahkan pengecekan cepat, berikut adalah tabel lengkap kecocokan ukuran:
| Video Target | Lebar Gambar | Tinggi Gambar | Parameter size API | Platform yang Sesuai |
|---|---|---|---|---|
| 720p Landscape | 1280 | 720 | "1280×720" | YouTube, Web |
| 720p Portrait | 720 | 1280 | "720×1280" | Douyin, TikTok |
| Pro Landscape | 1792 | 1024 | "1792×1024" | HD Landscape |
| Pro Portrait | 1024 | 1792 | "1024×1792" | HD Portrait |
📌 Petunjuk: Platform yang tersedia meliputi APIYI apiyi.com, API resmi OpenAI, dll. Disarankan untuk memilih platform dengan kecepatan respons yang cepat dan harga yang kompetitif untuk pengembangan dan pengujian.
Kesimpulan
Kesalahan ukuran gambar referensi (padding) pada Sora 2 API adalah salah satu masalah yang paling sering dihadapi pengembang. Strategi penyelesaian utamanya adalah:
- Pahami Aturan: Gambar referensi harus memiliki ukuran piksel yang sama persis dengan video target.
- Pilih Mode: Pilih mode Pad atau Cover berdasarkan konten gambar.
- Pra-pemrosesan: Gunakan Python Pillow atau FFmpeg untuk melakukan pemrosesan awal.
- Verifikasi Ukuran: Pastikan ukuran gambar sudah sesuai setelah diproses.
Direkomendasikan menggunakan APIYI apiyi.com untuk memverifikasi efek pra-pemrosesan gambar dan kualitas pembuatan video dengan cepat.
Penulis: APIYI Team | Kunjungi apiyi.com untuk lebih banyak tips pengembangan AI.
Referensi:
- Dokumentasi OpenAI Sora API: Penjelasan antarmuka Image-to-Video
- Tautan:
platform.openai.com/docs/guides/video-generation
- Tautan:
- Dokumentasi Resmi Pillow: Modul pemrosesan gambar ImageOps
- Tautan:
pillow.readthedocs.io/en/stable/reference/ImageOps.html
- Tautan:
- Dokumentasi Resmi FFmpeg: Filter pemrosesan video dan gambar
- Tautan:
ffmpeg.org/ffmpeg-filters.html
- Tautan:
