Lors de l'utilisation de l'API Sora 2 pour la génération de vidéo à partir d'image (Image-to-Video), l'incohérence des dimensions de l'image de référence est l'une des erreurs les plus fréquentes rencontrées par les développeurs. Cet article analyse en détail la cause profonde de l'erreur Inpaint image must match the requested width and height et propose 5 solutions éprouvées.
Valeur ajoutée : À la fin de cet article, vous maîtriserez les règles de vérification des dimensions de l'image de référence de l'API Sora 2 et saurez comment utiliser Python Pillow et FFmpeg pour prétraiter vos images, résolvant ainsi définitivement les erreurs de dimensions.

Analyse de l'erreur de dimension de l'image de référence Sora 2 API
Lorsque vous appelez la fonction de génération de vidéo à partir d'image de l'API Sora 2, si vous voyez le message d'erreur suivant :
{
"error": {
"message": "Inpaint image must match the requested width and height",
"type": "invalid_request_error",
"param": null,
"code": null
}
}
Cela signifie que les dimensions de l'image que vous avez téléchargée (input_reference) ne correspondent pas à la résolution vidéo cible.
Règles de correspondance stricte des dimensions de l'API Sora 2
L'API Sora 2 impose un mécanisme de vérification rigoureux pour les images de référence :
| Élément de vérification | Exigence | Description |
|---|---|---|
| Largeur | Largeur image = Largeur vidéo | Doit être identique au pixel près |
| Hauteur | Hauteur image = Hauteur vidéo | Doit être identique au pixel près |
| Formats supportés | JPEG, PNG, WebP | Les trois formats sont acceptés |
| Transfert de fichier | multipart/form-data | Doit être téléchargé sous forme de fichier |
Résolutions vidéo supportées par l'API Sora 2
Selon la documentation officielle d'OpenAI, l'API Sora 2 supporte actuellement les résolutions suivantes :
| Résolution | Largeur x Hauteur | Ratio | Cas d'utilisation |
|---|---|---|---|
| 720p Paysage | 1280 x 720 | 16:9 | YouTube, vidéos web |
| 720p Portrait | 720 x 1280 | 9:16 | TikTok, Instagram Reels |
| 1080p Paysage (Pro) | 1792 x 1024 | ~16:9 | Vidéos HD paysage |
| 1080p Portrait (Pro) | 1024 x 1792 | ~9:16 | Vidéos HD portrait |
🎯 Note importante : Votre image de référence doit être exactement de la même dimension que la résolution cible choisie. Par exemple, si vous choisissez une résolution de 1280×720, l'image doit faire précisément 1280×720 pixels. Un écart d'un seul pixel provoquera une erreur.

5 solutions pour les erreurs de dimensions d'image de référence de l'API Sora 2
Solution 1 : Remplissage et recadrage intelligent avec Python Pillow
L'utilisation de la méthode ImageOps.pad() de Pillow permet de traiter intelligemment n'importe quelle dimension d'image, en conservant le format d'image (aspect ratio) tout en remplissant jusqu'à la taille cible :
from PIL import Image, ImageOps
import openai
# Résolutions standards supportées par l'API Sora 2
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"):
"""Prétraite l'image pour correspondre aux exigences de dimensions de l'API Sora 2"""
target_size = SORA_RESOLUTIONS[target_resolution]
# Ouvrir l'image originale
img = Image.open(image_path)
# Utiliser la méthode pad : conserver le ratio, remplir avec un fond noir
processed = ImageOps.pad(img, target_size, color=(0, 0, 0))
# Enregistrer l'image traitée
output_path = image_path.replace(".jpg", "_sora_ready.jpg")
processed.save(output_path, "JPEG", quality=95)
return output_path
# Exemple d'utilisation
processed_image = preprocess_image_for_sora("my_image.jpg", "landscape_720p")
# Appeler l'API Sora 2 - via l'interface unifiée APIYI
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # Utilisation de l'interface unifiée 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
)
🚀 Démarrage rapide : Nous vous recommandons d'utiliser la plateforme APIYI (apiyi.com) pour tester rapidement l'API Sora 2. Elle propose une interface prête à l'emploi, permettant une intégration sans configurations complexes.
Solution 2 : Recadrage centré avec Python Pillow (conserver le sujet)
Si vous souhaitez conserver le contenu principal de l'image sans avoir de bandes noires de remplissage, vous pouvez utiliser le recadrage centré :
from PIL import Image
def center_crop_for_sora(image_path, target_width, target_height):
"""Recadre l'image par le centre pour correspondre aux dimensions de l'API Sora 2"""
img = Image.open(image_path)
orig_width, orig_height = img.size
# Calculer le ratio cible
target_ratio = target_width / target_height
orig_ratio = orig_width / orig_height
if orig_ratio > target_ratio:
# L'image d'origine est plus large, redimensionner selon la hauteur puis recadrer les côtés
new_height = target_height
new_width = int(orig_width * (target_height / orig_height))
else:
# L'image d'origine est plus haute, redimensionner selon la largeur puis recadrer le haut et le bas
new_width = target_width
new_height = int(orig_height * (target_width / orig_width))
# D'abord redimensionner
img = img.resize((new_width, new_height), Image.LANCZOS)
# Puis recadrer au centre
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
# Préparer l'image de référence pour une vidéo 720p en mode paysage
processed = center_crop_for_sora("my_photo.jpg", 1280, 720)
Solution 3 : Traitement par lot en ligne de commande avec FFmpeg
Pour les scénarios nécessitant un traitement par lot, FFmpeg est un choix plus efficace :
Mode recadrage centré (Cover) :
# Redimensionner en gardant le ratio, puis recadrer au centre aux dimensions cibles
ffmpeg -i input.jpg -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output_sora.jpg
Mode remplissage (Letterbox) :
# Garder le ratio d'origine, remplir en noir les zones vides
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
Script de traitement par lot :
#!/bin/bash
# Traiter par lot toutes les images jpg du répertoire actuel au format paysage 720p pour l'API Sora 2
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
Solution 4 : Utilisation du paramètre crop_bounds (recadrage intégré à l'API)
L'API Sora 2 propose le paramètre crop_bounds, qui permet de spécifier la zone de recadrage directement au niveau de l'API :
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # Utilisation de l'interface unifiée APIYI
)
# Utiliser crop_bounds pour spécifier la zone de recadrage (sous forme de ratios)
with open("full_size_image.jpg", "rb") as f:
response = client.videos.create(
model="sora-2",
prompt="Effet vidéo dynamique",
size="1280x720",
input_reference=f,
crop_bounds={
"left_fraction": 0.1, # Coupe 10% à gauche
"top_fraction": 0.1, # Coupe 10% en haut
"right_fraction": 0.9, # Garde jusqu'à 90% à droite
"bottom_fraction": 0.9 # Garde jusqu'à 90% en bas
},
frame_index=0 # L'image sert de première image
)
⚠️ Attention : Lors de l'utilisation de
crop_bounds, la zone recadrée doit toujours correspondre à la résolution vidéo cible. Il est recommandé de l'utiliser en complément d'un prétraitement en amont.
Solution 5 : Classe utilitaire complète de prétraitement d'image
Voici une classe utilitaire de prétraitement d'image de niveau production, incluant plusieurs modes de traitement :
from PIL import Image, ImageOps
from pathlib import Path
import io
class SoraImagePreprocessor:
"""Outil de prétraitement d'image de référence pour l'API Sora 2"""
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"Résolution non supportée : {target_resolution}")
self.target_size = self.RESOLUTIONS[target_resolution]
def pad(self, image_path, bg_color=(0, 0, 0)):
"""Mode remplissage : conserve le ratio d'origine, ajoute une couleur de fond"""
img = Image.open(image_path)
return ImageOps.pad(img, self.target_size, color=bg_color)
def cover(self, image_path):
"""Mode couverture : conserve le ratio d'origine, recadre au centre"""
img = Image.open(image_path)
return ImageOps.fit(img, self.target_size, Image.LANCZOS)
def stretch(self, image_path):
"""Mode étirement : force l'étirement aux dimensions cibles (non recommandé)"""
img = Image.open(image_path)
return img.resize(self.target_size, Image.LANCZOS)
def to_bytes(self, img, format="JPEG", quality=95):
"""Convertit une image PIL en flux d'octets pour l'upload via l'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):
"""Traite et enregistre l'image"""
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 non supporté : {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
# Exemple d'utilisation
preprocessor = SoraImagePreprocessor("1280x720")
# Option 1 : Traiter et enregistrer
output = preprocessor.process_and_save("my_image.jpg", mode="cover")
print(f"Traitement terminé : {output}")
# Option 2 : Obtenir directement le flux d'octets pour l'appel API
img = preprocessor.cover("my_image.jpg")
image_bytes = preprocessor.to_bytes(img)
Voir l’exemple de code d’appel complet
import openai
from PIL import Image, ImageOps
import io
class SoraImagePreprocessor:
"""Outil de prétraitement d'image de référence pour l'API Sora 2"""
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"Résolution non supportée : {target_resolution}")
self.target_size = self.RESOLUTIONS[target_resolution]
def cover(self, image_path):
"""Mode couverture : conserve le ratio d'origine, recadre au centre"""
img = Image.open(image_path)
return ImageOps.fit(img, self.target_size, Image.LANCZOS)
def to_bytes(self, img, format="JPEG", quality=95):
"""Convertit une image PIL en flux d'octets"""
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"):
"""
Génère une vidéo Sora 2 en utilisant une image prétraitée
Args:
image_path: Chemin de l'image originale
prompt: Invite de description de la vidéo
resolution: Résolution cible
Returns:
ID de la tâche de génération vidéo
"""
# 1. Prétraiter l'image
preprocessor = SoraImagePreprocessor(resolution)
processed_img = preprocessor.cover(image_path)
image_bytes = preprocessor.to_bytes(processed_img)
# 2. Initialiser le client - via l'interface unifiée APIYI
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1"
)
# 3. Appeler l'API Sora 2
response = client.videos.create(
model="sora-2",
prompt=prompt,
size=resolution,
input_reference=image_bytes,
duration=5 # Durée de la vidéo (en secondes)
)
return response
# Exemple d'appel complet
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"Tâche de génération vidéo soumise : {result}")
Comparaison des modes de prétraitement d'image pour l'API Sora 2
Le choix du mode de prétraitement approprié est essentiel pour le rendu final de vos vidéos :
| Mode de prétraitement | Méthode | Avantages | Inconvénients | Scénarios recommandés |
|---|---|---|---|---|
| Pad (Remplissage) | Garde le ratio, ajoute des bandes noires | Conserve l'image complète | Présence possible de bandes noires | Haute exigence d'intégrité du contenu |
| Cover (Recadrage) | Garde le ratio, recadrage centré | Pas de bandes, image pleine | Risque de couper les bords | Sujets centrés dans l'image |
| Stretch (Étirage) | Étirement forcé | Simple et direct | Déformation de l'image | Non recommandé |
💡 Conseil de sélection : Le choix du mode dépend principalement du contenu de votre image et du rendu souhaité. Nous vous recommandons d'effectuer des tests sur la plateforme APIYI (apiyi.com) pour comparer rapidement les résultats entre les différents modes.
Modes recommandés par scénario
| Type d'image | Mode recommandé | Explication |
|---|---|---|
| Portraits | Cover | Garde le sujet principal centré et entier |
| Paysages | Pad ou Cover | À choisir selon la composition de la photo |
| Photos de produits | Pad | Garantit l'affichage complet du produit |
| Œuvres d'art | Pad | Préserve l'intégrité artistique de l'œuvre |
| Captures d'écran UI | Cover | L'information essentielle est généralement centrée |
FAQ sur l'image de référence (垫图) pour l'API Sora 2
Q1 : Pourquoi l’API Sora 2 est-elle si stricte sur les dimensions de l’image de référence ?
Sora 2 utilise l'image de référence comme première image (first frame) de la vidéo. Le modèle doit commencer à générer le contenu dynamique à partir de cette image précise. Si les dimensions de l'image ne correspondent pas à la vidéo cible, le modèle ne peut pas initialiser correctement le processus de génération. Il s'agit d'une limitation technique conçue par OpenAI pour garantir la cohérence de la qualité de génération.
Lors de l'appel via la plateforme APIYI (apiyi.com), il est recommandé d'effectuer le prétraitement de l'image côté client pour obtenir les meilleurs résultats de génération.
Q2 : Quel format d’image choisir lors du prétraitement ?
L'API Sora 2 prend en charge trois formats : JPEG, PNG et WebP.
- JPEG : Recommandé pour les photos ; fichiers légers et téléchargement rapide.
- PNG : Idéal pour les scènes nécessitant un fond transparent ou une qualité sans perte.
- WebP : Un bon équilibre entre qualité et taille, mais avec une compatibilité légèrement inférieure.
Il est conseillé d'utiliser le format JPEG avec un paramètre de qualité réglé entre 90 et 95 pour garantir la qualité tout en contrôlant la taille du fichier.
Q3 : Que faire si la qualité de l’image diminue après le traitement ?
Une baisse de qualité est généralement due aux raisons suivantes :
- Compression excessive : Augmentez la qualité JPEG à 95.
- Agrandissement trop important : Utilisez autant que possible une image originale dont la résolution est proche de la cible.
- Algorithme de rééchantillonnage : Utilisez
Image.LANCZOSau lieu deImage.NEAREST.
# Paramètres de traitement haute qualité
img = img.resize(target_size, Image.LANCZOS) # Utilisation de l'algorithme Lanczos
img.save(output_path, "JPEG", quality=95) # Sauvegarde en haute qualité
Q4 : Comment traiter un grand volume d’images par lot ?
Pour les scénarios de traitement par lot, il est recommandé d'utiliser FFmpeg ou le multi-threading en Python :
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
Via la plateforme APIYI (apiyi.com), vous pouvez obtenir des quotas d'API pour le traitement par lot, ce qui est idéal pour les projets de génération de vidéo à grande échelle.
Q5 : L’image de référence sera-t-elle rejetée si elle contient des visages ?
Oui, conformément à la politique d'OpenAI, les images de référence contenant des visages humains réels sont actuellement rejetées par l'API Sora 2. Si votre projet nécessite des vidéos de personnages, nous vous suggérons :
- D'utiliser des images où les visages ne sont pas clairement identifiables.
- D'utiliser des images de personnages virtuels générés par IA.
- D'utiliser des images de personnages ayant subi un traitement abstrait ou artistique.
Tableau de référence rapide des dimensions pour l'API Sora 2
Pour faciliter vos recherches rapides, voici le tableau complet de correspondance des dimensions :
| Vidéo cible | Largeur image | Hauteur image | Paramètre size API |
Plateformes adaptées |
|---|---|---|---|---|
| 720p Paysage | 1280 | 720 | "1280×720" | YouTube, Web |
| 720p Portrait | 720 | 1280 | "720×1280" | Douyin, TikTok |
| Pro Paysage | 1792 | 1024 | "1792×1024" | Paysage HD |
| Pro Portrait | 1024 | 1792 | "1024×1792" | Portrait HD |
📌 Note : Les plateformes disponibles incluent APIYI (apiyi.com), l'API officielle d'OpenAI, etc. Il est conseillé de choisir une plateforme offrant une vitesse de réponse rapide et des tarifs avantageux pour vos tests de développement.
Résumé
L'erreur de dimensions de l'image de référence (image source) avec l'API Sora 2 est l'un des problèmes les plus fréquents rencontrés par les développeurs. L'approche principale pour résoudre cela consiste à :
- Comprendre les règles : l'image de référence doit avoir des dimensions identiques (au pixel près) à celles de la vidéo cible.
- Choisir le mode : sélectionnez le mode Pad ou Cover en fonction du contenu de l'image.
- Prétraitement : utilisez Python Pillow ou FFmpeg pour le traitement préalable.
- Vérifier les dimensions : assurez-vous que les dimensions de l'image correspondent parfaitement après le traitement.
Nous vous recommandons d'utiliser APIYI (apiyi.com) pour tester rapidement l'efficacité de votre prétraitement d'image et la qualité de la génération vidéo.
Auteur : Équipe APIYI | Pour plus d'astuces sur le développement IA, visitez apiyi.com
Références :
- Documentation API OpenAI Sora : Instructions pour l'interface Image-to-Video (Image-vers-Vidéo)
- Lien :
platform.openai.com/docs/guides/video-generation
- Lien :
- Documentation officielle de Pillow : Module de traitement d'image ImageOps
- Lien :
pillow.readthedocs.io/en/stable/reference/ImageOps.html
- Lien :
- Documentation officielle de FFmpeg : Filtres de traitement vidéo et image
- Lien :
ffmpeg.org/ffmpeg-filters.html
- Lien :
