Sora 2 API를 사용하여 이미지를 비디오로 변환(Image-to-Video)할 때, 참조 이미지의 크기 불일치는 개발자들이 가장 자주 겪는 오류 중 하나예요. 본문에서는 Inpaint image must match the requested width and height 오류의 근본 원인을 자세히 분석하고, 검증된 5가지 해결 방법을 제시해 드릴게요.
핵심 가치: 이 글을 읽고 나면 Sora 2 API의 참조 이미지 크기 검증 규칙을 마스터하고, Python Pillow와 FFmpeg를 사용하여 이미지를 전처리함으로써 크기 관련 오류를 완벽하게 해결할 수 있게 될 거예요.

Sora 2 API 참조 이미지 크기 오류 원인 분석
APIYI를 통해 Sora 2 API의 이미지 투 비디오 기능을 호출할 때 다음과 같은 오류 메시지가 나타난다면:
{
"error": {
"message": "Inpaint image must match the requested width and height",
"type": "invalid_request_error",
"param": null,
"code": null
}
}
이는 업로드한 참조 이미지(input_reference)의 크기가 대상 비디오 해상도와 일치하지 않음을 의미해요.
Sora 2 API 참조 이미지 크기 강제 일치 규칙
Sora 2 API는 참조 이미지에 대해 엄격한 크기 검증 메커니즘을 가지고 있습니다.
| 검증 항목 | 요구 사항 | 설명 |
|---|---|---|
| 너비 일치 | 이미지 너비 = 비디오 너비 | 픽셀 단위로 정확히 일치해야 함 |
| 높이 일치 | 이미지 높이 = 비디오 높이 | 픽셀 단위로 정확히 일치해야 함 |
| 형식 지원 | JPEG, PNG, WebP | 세 가지 형식 모두 가능 |
| 파일 전송 | multipart/form-data | 반드시 파일 형태로 업로드해야 함 |
Sora 2 API 지원 비디오 해상도
OpenAI 공식 문서에 따르면, Sora 2 API는 현재 다음과 같은 해상도를 지원합니다.
| 해상도 | 너비 x 높이 | 비율 | 활용 사례 |
|---|---|---|---|
| 720p 가로형 | 1280 x 720 | 16:9 | 유튜브, 웹 비디오 |
| 720p 세로형 | 720 x 1280 | 9:16 | 틱톡, 쇼츠, 릴스 |
| 1080p 가로형 (Pro) | 1792 x 1024 | ~16:9 | 고화질 가로 영상 |
| 1080p 세로형 (Pro) | 1024 x 1792 | ~9:16 | 고화질 세로 영상 |
🎯 중요 팁: 참조 이미지는 선택한 대상 해상도와 픽셀 단위로 완벽하게 일치해야 해요. 예를 들어 1280×720 해상도를 선택했다면, 이미지는 정확히 1280×720 픽셀이어야 하며, 단 1픽셀만 차이가 나도 오류가 발생합니다.

Sora 2 API 이미지 크기 오류를 해결하는 5가지 방법
방법 1: Python Pillow를 활용한 스마트 크롭 및 패딩
Pillow의 ImageOps.pad() 메서드를 사용하면 어떤 크기의 이미지든 스마트하게 처리할 수 있어요. 가로세로 비율을 유지하면서 목표 크기에 맞춰 빈 공간을 채워줍니다.
from PIL import Image, ImageOps
import openai
# 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"):
"""Sora 2 API 크기 요구 사항에 맞춘 이미지 전처리"""
target_size = SORA_RESOLUTIONS[target_resolution]
# 원본 이미지 열기
img = Image.open(image_path)
# pad 메서드 사용: 비율 유지 및 검은색 배경 채우기
processed = ImageOps.pad(img, target_size, color=(0, 0, 0))
# 처리된 이미지 저장
output_path = image_path.replace(".jpg", "_sora_ready.jpg")
processed.save(output_path, "JPEG", quality=95)
return output_path
# 사용 예시
processed_image = preprocess_image_for_sora("my_image.jpg", "landscape_720p")
# Sora 2 API 호출 - APIYI 통합 인터페이스 사용
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # 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
)
🚀 빠른 시작: Sora 2 API를 빠르게 테스트하려면 APIYI(apiyi.com) 플랫폼을 추천해요. 복잡한 설정 없이 바로 연동할 수 있는 인터페이스를 제공해 개발 생산성을 높여줍니다.
방법 2: Python Pillow 중앙 크롭 (피사체 유지)
검은색 여백 없이 이미지의 주요 내용을 유지하며 꽉 찬 화면을 만들고 싶다면 중앙 크롭 방식을 사용해 보세요.
from PIL import Image
def center_crop_for_sora(image_path, target_width, target_height):
"""Sora 2 API 크기 요구 사항에 맞춰 이미지 중앙 크롭"""
img = Image.open(image_path)
orig_width, orig_height = img.size
# 대상 가로세로 비율 계산
target_ratio = target_width / target_height
orig_ratio = orig_width / orig_height
if orig_ratio > target_ratio:
# 원본이 더 넓은 경우: 높이에 맞춰 축소 후 좌우 크롭
new_height = target_height
new_width = int(orig_width * (target_height / orig_height))
else:
# 원본이 더 높은 경우: 너비에 맞춰 축소 후 상하 크롭
new_width = target_width
new_height = int(orig_height * (target_width / orig_width))
# 먼저 크기 조정
img = img.resize((new_width, new_height), Image.LANCZOS)
# 그다음 중앙 크롭
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
# 가로형 720p 영상 제작을 위한 이미지 준비
processed = center_crop_for_sora("my_photo.jpg", 1280, 720)
방법 3: FFmpeg 명령어를 이용한 대량 처리
많은 양의 이미지를 한꺼번에 처리해야 할 때는 FFmpeg가 아주 효율적인 선택입니다.
중앙 크롭 모드 (Cover):
# 비율을 유지하며 크기 조정 후 대상 크기로 중앙 크롭
ffmpeg -i input.jpg -vf "scale=1280:720:force_original_aspect_ratio=increase,crop=1280:720" output_sora.jpg
패딩 모드 (Letterbox):
# 원본 비율을 유지하며 크기 조정 후 부족한 부분을 검은색으로 채움
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
대량 처리 스크립트:
#!/bin/bash
# 현재 디렉터리의 모든 jpg 이미지를 Sora 2 API 720p 가로 포맷으로 일괄 변환
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
방법 4: crop_bounds 파라미터 사용 (API 자체 크롭)
Sora 2 API는 crop_bounds 파라미터를 제공하여 API 레벨에서 직접 크롭 영역을 지정할 수 있게 해줍니다.
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # APIYI 통합 인터페이스 사용
)
# crop_bounds를 사용하여 크롭 영역 지정 (비율 형식)
with open("full_size_image.jpg", "rb") as f:
response = client.videos.create(
model="sora-2",
prompt="역동적인 비디오 효과",
size="1280x720",
input_reference=f,
crop_bounds={
"left_fraction": 0.1, # 왼쪽 10% 제거
"top_fraction": 0.1, # 상단 10% 제거
"right_fraction": 0.9, # 오른쪽 90%까지 유지
"bottom_fraction": 0.9 # 하단 90%까지 유지
},
frame_index=0 # 이미지를 첫 번째 프레임으로 사용
)
⚠️ 주의:
crop_bounds를 사용할 때도 크롭된 영역이 목표 영상 해상도와 일치해야 합니다. 가급적 사전 전처리와 결합해 사용하는 것을 권장해요.
방법 5: 완성형 이미지 전처리 도구 클래스
실제 서비스 환경에서 유용하게 사용할 수 있는, 여러 가지 처리 모드를 포함한 이미지 전처리 도구 클래스입니다.
from PIL import Image, ImageOps
from pathlib import Path
import io
class SoraImagePreprocessor:
"""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"지원하지 않는 해상도입니다: {target_resolution}")
self.target_size = self.RESOLUTIONS[target_resolution]
def pad(self, image_path, bg_color=(0, 0, 0)):
"""패딩 모드: 원본 비율 유지, 배경색 채우기"""
img = Image.open(image_path)
return ImageOps.pad(img, self.target_size, color=bg_color)
def cover(self, image_path):
"""커버 모드: 원본 비율 유지, 중앙 크롭"""
img = Image.open(image_path)
return ImageOps.fit(img, self.target_size, Image.LANCZOS)
def stretch(self, image_path):
"""늘리기 모드: 목표 크기로 강제 확장 (권장하지 않음)"""
img = Image.open(image_path)
return img.resize(self.target_size, Image.LANCZOS)
def to_bytes(self, img, format="JPEG", quality=95):
"""PIL Image를 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):
"""이미지 처리 및 저장"""
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}")
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
# 사용 예시
preprocessor = SoraImagePreprocessor("1280x720")
# 방식 1: 처리 후 저장
output = preprocessor.process_and_save("my_image.jpg", mode="cover")
print(f"처리 완료: {output}")
# 방식 2: API 호출을 위해 바이트 스트림 바로 가져오기
img = preprocessor.cover("my_image.jpg")
image_bytes = preprocessor.to_bytes(img)
전체 호출 예시 코드 보기
import openai
from PIL import Image, ImageOps
import io
class SoraImagePreprocessor:
"""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"지원하지 않는 해상도입니다: {target_resolution}")
self.target_size = self.RESOLUTIONS[target_resolution]
def cover(self, image_path):
"""커버 모드: 원본 비율 유지, 중앙 크롭"""
img = Image.open(image_path)
return ImageOps.fit(img, self.target_size, Image.LANCZOS)
def to_bytes(self, img, format="JPEG", quality=95):
"""PIL Image를 바이트 스트림으로 변환"""
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"):
"""
전처리된 이미지를 사용하여 Sora 2 비디오 생성
Args:
image_path: 원본 이미지 경로
prompt: 비디오 설명 프롬프트
resolution: 목표 해상도
Returns:
비디오 생성 작업 ID
"""
# 1. 이미지 전처리
preprocessor = SoraImagePreprocessor(resolution)
processed_img = preprocessor.cover(image_path)
image_bytes = preprocessor.to_bytes(processed_img)
# 2. 클라이언트 초기화 - APIYI 통합 인터페이스 사용
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1"
)
# 3. Sora 2 API 호출
response = client.videos.create(
model="sora-2",
prompt=prompt,
size=resolution,
input_reference=image_bytes,
duration=5 # 비디오 길이 (초)
)
return response
# 전체 호출 예시
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"비디오 생성 작업이 제출되었습니다: {result}")
Sora 2 API 이미지 전처리 모드 비교
적절한 전처리 모드를 선택하는 것은 최종 비디오 결과물의 퀄리티에 매우 중요합니다.

| 전처리 모드 | 처리 방식 | 장점 | 단점 | 추천 시나리오 |
|---|---|---|---|---|
| Pad (패딩) | 비율 유지, 검은 여백 추가 | 전체 화면 보존 | 여백이 생길 수 있음 | 내용 보존이 중요할 때 |
| Cover (크롭) | 비율 유지, 중앙 크롭 | 여백 없이 꽉 찬 화면 | 가장자리 내용 잘림 | 피사체가 중앙인 사진 |
| Stretch (늘리기) | 강제 크기 조정 | 단순하고 빠름 | 화면 왜곡 발생 | 권장하지 않음 |
💡 선택 팁: 어떤 모드를 사용할지는 이미지의 내용과 원하는 영상 효과에 따라 달라집니다. APIYI(apiyi.com) 플랫폼에서 실제 테스트를 진행해 보며 각 모드별 결과물의 차이를 직접 확인해 보는 것을 추천해요.
상황별 추천 모드
| 이미지 유형 | 추천 모드 | 설명 |
|---|---|---|
| 인물 사진 | Cover | 인물 위주로 화면을 가득 채움 |
| 풍경 사진 | Pad 또는 Cover | 구도에 따라 선택 (전체 보존 vs 꽉 찬 화면) |
| 제품 이미지 | Pad | 제품이 잘리지 않도록 전체 표시 보장 |
| 예술 이미지 | Pad | 원작의 미학적 구성 그대로 보존 |
| UI 스크린샷 | Cover | 정보가 주로 집중된 중앙부 강조 |
Sora 2 API 이미지 레퍼런스(垫图) 관련 자주 묻는 질문(FAQ)
Q1: Sora 2 API는 왜 이미지 사이즈 요구사항이 이렇게 까다로운가요?
Sora 2는 이미지를 비디오의 첫 프레임(first frame)으로 사용해요. 모델이 이 프레임부터 시작해서 후속 동적 콘텐츠를 생성해야 하기 때문이죠. 만약 이미지 사이즈가 목표 비디오와 일치하지 않으면, 모델이 생성 과정을 올바르게 초기화할 수 없답니다. 이는 생성 품질의 일관성을 확보하기 위해 OpenAI가 설계한 기술적 제한이에요.
APIYI(apiyi.com) 플랫폼을 통해 호출할 때는, 최상의 생성 효과를 얻기 위해 클라이언트 측에서 미리 이미지 전처리를 완료하는 것을 권장해 드려요.
Q2: 전처리할 때 어떤 이미지 형식을 선택해야 할까요?
Sora 2 API는 JPEG, PNG, WebP 세 가지 형식을 지원합니다.
- JPEG: 사진류 이미지에 추천하며, 파일 용량이 작고 업로드 속도가 빨라요.
- PNG: 투명 배경이 필요하거나 무손실 화질이 중요한 경우에 적합해요.
- WebP: 화질과 용량 사이의 균형이 좋지만, 호환성이 약간 떨어질 수 있어요.
보통은 JPEG 형식을 사용하고, quality 매개변수를 90-95 정도로 설정하는 것을 추천해요. 화질을 보장하면서도 파일 크기를 적절히 조절할 수 있거든요.
Q3: 처리 후 이미지 화질이 떨어지면 어떻게 해야 하나요?
이미지 화질 저하는 주로 다음과 같은 원인으로 발생해요.
- 과도한 압축: JPEG quality를 95까지 높여보세요.
- 과도한 확대: 가급적 대상 해상도와 근접한 원본 이미지를 사용하세요.
- 재샘플링(Resampling) 알고리즘:
Image.NEAREST대신Image.LANCZOS를 사용해 보세요.
# 고화질 처리 설정
img = img.resize(target_size, Image.LANCZOS) # Lanczos 알고리즘 사용
img.save(output_path, "JPEG", quality=95) # 고화질로 저장
Q4: 많은 양의 이미지를 한꺼번에 처리하려면 어떻게 하나요?
대량 처리 시나리오에서는 FFmpeg나 파이썬의 멀티스레딩(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
APIYI(apiyi.com) 플랫폼을 통해 대량 처리용 API 할당량을 확보할 수 있어, 대규모 비디오 생성 프로젝트에 매우 적합하답니다.
Q5: 이미지에 얼굴이 포함되어 있으면 거부되나요?
네, 그렇습니다. OpenAI의 정책에 따라 실제 사람의 얼굴이 포함된 이미지는 현재 Sora 2 API에서 처리가 거부될 수 있어요. 인물이 포함된 비디오가 필요하다면 다음과 같은 방법을 고려해 보세요.
- 얼굴이 또렷하게 나오지 않는 이미지 사용하기
- AI로 생성한 가상 인물 이미지 사용하기
- 추상적이거나 예술적으로 처리된 인물 이미지 사용하기
Sora 2 API 이미지 사이즈 속성 일람표
빠른 확인을 위해 정리한 전체 사이즈 매칭 표입니다.
| 대상 비디오 | 이미지 너비 | 이미지 높이 | API size 매개변수 | 활용 플랫폼 |
|---|---|---|---|---|
| 720p 가로형 | 1280 | 720 | "1280×720" | YouTube, 웹사이트 |
| 720p 세로형 | 720 | 1280 | "720×1280" | 쇼츠, TikTok |
| Pro 가로형 | 1792 | 1024 | "1792×1024" | 고화질 가로 영상 |
| Pro 세로형 | 1024 | 1792 | "1024×1792" | 고화질 세로 영상 |
📌 팁: 활용 가능한 플랫폼으로는 APIYI(apiyi.com), OpenAI 공식 API 등이 있어요. 개발 및 테스트를 위해서는 응답 속도가 빠르고 가격 혜택이 좋은 플랫폼을 선택하는 것이 좋습니다.
요약
Sora 2 API 이미지 참조(Image-to-Video) 시 발생하는 크기 오류는 개발자들이 가장 자주 겪는 문제 중 하나입니다. 핵심 해결 방법은 다음과 같습니다:
- 규칙 이해: 참조 이미지는 대상 비디오와 픽셀 단위까지 크기가 일치해야 합니다.
- 모드 선택: 이미지 내용에 따라 Pad 또는 Cover 모드를 선택하세요.
- 전처리: Python Pillow나 FFmpeg을 사용하여 이미지를 미리 처리합니다.
- 크기 확인: 처리 후 이미지 크기가 일치하는지 확인합니다.
APIYI(apiyi.com)를 통해 이미지 전처리 효과와 비디오 생성 품질을 빠르게 검증해 보시는 것을 추천합니다.
작성자: APIYI Team | 더 많은 AI 개발 팁은 apiyi.com에서 확인하세요.
참고 자료:
- OpenAI Sora API 문서: 이미지 투 비디오(Image-to-Video) 인터페이스 설명
- 링크:
platform.openai.com/docs/guides/video-generation
- 링크:
- Pillow 공식 문서: ImageOps 이미지 처리 모듈
- 링크:
pillow.readthedocs.io/en/stable/reference/ImageOps.html
- 링크:
- FFmpeg 공식 문서: 비디오 및 이미지 처리 필터
- 링크:
ffmpeg.org/ffmpeg-filters.html
- 링크:
