1인칭 장면을 요청했는데 영상이 관찰자의 어깨 너머로 상대를 보여 주거나 카메라가 상대의 얼굴로 다가갈 수 있습니다. 먼저 시작 프레임과 움직임 설명에서 서로 충돌하는 카메라 단서를 찾아보세요. 클로즈업, 직접적인 눈맞춤, ‘POV’라는 이름만으로 시점이 만들어지지는 않습니다. 하이 앵글은 카메라 높이를 정하고, 1인칭은 카메라가 누구의 눈을 대신하는지 정합니다.
이 눈높이 설정에서는 시작 프레임을 관찰자 위치에서 만듭니다. 관찰자의 머리와 몸통은 화면 밖에 두세요. 손이나 팔뚝은 아래쪽 가장자리에서 들어와도 되지만, 1인칭을 설정하는 데 꼭 필요하지는 않습니다. 상대가 하는 행동과 카메라가 하는 동작을 따로 설명하세요.
아래에서는 Seedance 2.5 image-to-video로 식당 테이블에 앉은 장면을 설정하고, 실제로 나타나는 오류 수정, 움직이는 손, 이동하는 POV, 장면 연결 방법을 설명합니다. 그림 속 인물은 모두 가상의 성인입니다. 그림은 카메라 위치를 보여 주며 생성된 영상이 아닙니다.
시청자가 앉은 자리에서 첫 프레임 만들기
레퍼런스는 앉은 관찰자의 눈으로 찍은 사진처럼 보여야 합니다. 작은 테이블 건너편에 흰 셔츠의 옷깃을 열고 남색 블레이저를 입은 성인 남성이 앉아 있으며, 눈은 대략 렌즈 높이에 있습니다. 가까운 테이블 가장자리가 화면 아래를 가로지르고 관찰자의 팔뚝이 아래 양쪽 모서리에서 들어옵니다. 관찰자의 뒤통수, 어깨 윤곽, 별도의 촬영자는 보이지 않습니다.
이미지 도구에서 이 설명을 사용하거나, 사용 허가를 받은 사진으로 같은 장면을 구성하세요.
Photographic first-person view from a seated adult observer at a restaurant table beside a large window at dusk. A fictional adult man in a navy blazer over an open-collared white shirt sits directly across the small table at conversational distance, hands loosely clasped. Camera at the seated observer's eye height. His face and upper torso are unobstructed. Only the observer's relaxed forearms in dark sleeves enter from the lower corners, resting near the near table edge beside a white coffee cup. A candle in a glass holder and a small vase of flowers stand between them. Warm lamp light against a blue-hour city view through the window. The observer's head, face, shoulders and torso are outside the frame. One continuous room, no mirrors, no over-the-shoulder composition.
가장자리의 어깨는 사소한 요소가 아닙니다. 카메라가 관찰자 뒤에 있을 수 있다는 신호를 모델에 줍니다. 잘라 낸 뒤에도 앉은 위치에서 보는 자연스러운 시야가 유지된다면 어깨를 잘라 내세요. 자른 뒤 옆이나 위에서 보는 각도가 남는다면 프레임을 다시 만드세요. 영상화가 카메라 위치를 대신 옮겨 주지는 않습니다.

그림: 앞쪽의 팔뚝은 1인칭 구도를 뒷받침할 수 있지만, 머리와 어깨가 보이면 외부 시점이 됩니다.
Seedream 5.0 Flash의 표기 가격은 이미지당 약 $0.029이므로 프레임을 다섯 번이나 여섯 번 다시 만들어도 영상 한 편을 낭비하는 것보다 저렴합니다. edit 작업에서는 불필요한 어깨나 너무 큰 손처럼 하나의 결함을 장면 전체를 다시 만들지 않고 수정할 수 있습니다. Seedance 2.5 image-to-video에 올리기 전에 입력 제한을 확인하세요. 각 변은 300~6000픽셀, 최대 10 MB이며 JPG, PNG, WEBP, GIF를 지원합니다. 출력은 스틸 이미지의 형태를 따르므로 먼저 납품할 화면 비율로 자르세요. 가상 인물이나 사용 허가를 받은 인물을 사용하세요. 실존하는 식별 가능한 얼굴 사진은 Seedance의 입력 검사에서 거절될 수 있습니다.
작은 행동 하나로 초안 만들기
Seedance 2.5 image-to-video Playground에서 승인한 프레임을 업로드하고, 480p에서 다섯 초를 선택한 뒤 소리를 끄고 움직임 프롬프트를 붙여 넣으세요. 첫 테이크에서는 종료 이미지를 비워 두세요. 출력은 스틸 이미지의 형태를 따릅니다. 시점은 이미지와 문구에서 나오며 POV 스위치로 정하는 것이 아닙니다.
이 프롬프트를 복사하세요.
One continuous five-second first-person shot from the seated observer's eyes. The adult man across the table looks toward the observer, gives one small smile and tilts his head slightly. The observer remains seated and still. Keep the camera position, eye height and framing unchanged. The man's hands stay on his side of the table. The observer's forearms remain low in the foreground. Stable warm lamp light. One take, no cut, no orbit, no zoom, no external view, no dialogue.
Seedance 2.5 image-to-video의 표기 가격은 480p에서 초당 $0.1234이므로 다섯 초 초안은 $0.617입니다. 720p는 초당 $0.2773, 같은 클립 기준 $1.3865이며, 1080p는 초당 $0.6823($3.4115)입니다. 오디오를 켜거나 꺼도 요금은 같습니다. 소리가 있는 최종 렌더링에는 generate_audio를 켜고 "Sound: quiet restaurant ambience, cutlery, low voices; no music or captions."를 추가하세요. 480p로 구도와 움직임을 저렴하게 확인하고, 프레임과 문구를 확정한 뒤 720p나 1080p로 렌더링하면 해상도가 올라갑니다. 카메라 위치가 바뀌는 것은 아닙니다. 실제 작업에는 새 견적을 받으세요.
"camera circles him", "cinematic reveal", "pull back to show the couple", "over his shoulder"는 피하세요. 각각 다른 시점을 요청합니다. 카메라가 그대로 있어도 인물은 잔을 내려다볼 수 있습니다. 그 시선 변화를 카메라 이동으로 설명하면 나중에 해결해야 할 충돌이 생깁니다.

그림: 인물의 시선 변화와 카메라 이동은 다른 장면을 만듭니다.
POV 동의어를 더하기보다 보이는 증상 고치기
| 결과에 나타나는 현상 | 가능한 지시 또는 레퍼런스 충돌 | 수정 방법 |
|---|---|---|
| 관찰자의 머리나 등이 보임 | 원본이나 드러내는 장면의 문구가 외부 카메라를 암시함 | 눈 위치의 시야로 원본을 바꾸고, 드러내는 연출과 어깨 너머 지시를 제거하세요 |
| 테이블이 위에서 보임 | 레퍼런스 카메라가 너무 높음 | 앉은 눈높이로 다시 만들고 남성의 눈을 렌즈 높이에 가깝게 두세요 |
| 카메라가 얼굴로 다가감 | 클로즈업이나 전진 지시가 가만히 있는 관찰자와 충돌함 | 해당 단서를 제거하고 테이블 가장자리와 창틀을 고정 구도의 기준으로 유지하세요 |
| 눈맞춤은 사라지지만 구도는 고정됨 | 인물이 시점을 바꾼 것이 아니라 시선을 바꿈 | 관찰자를 보는 시점을 정하세요. 의도적인 시선이 축에서 벗어났다는 이유로 다시 생성하지 마세요 |
| 다른 사람의 손이 들어옴 | 두 사람 모두 모호한 "you reach" 지시를 받음 | "the man across the table"와 "the observer's right hand"를 구분하고 먼저 한 사람의 양손만 움직이세요 |
| 잔이 얼굴을 가림 | 소품의 시작 위치가 높거나 동작이 시야를 가로막음 | 잔은 테이블 위에 두고 렌즈 쪽으로 들기보다 조금 미끄러뜨리세요 |
| 휴대폰, 카메라 또는 관찰자의 반사가 나타남 | "Selfie", "vlog", 거울 문구 또는 프레임의 반사 표면 | 해당 단어를 빼고 인물 뒤의 유리와 거울을 피하며 카메라나 휴대폰이 화면에 나오지 않는다고 명시하세요 |
| 첫 초가 지나면 관찰자의 손이 사라짐 | 상대가 손을 놓거나 손이 닿지 않는 곳으로 이동함 | 프롬프트로 접촉을 유지하거나("keeps hold of the observer's hand") 손이 나간 뒤 컷을 계획하세요 |
다른 시드를 시도하기 전에 충돌하는 입력을 바꾸세요. 그렇지 않으면 다음 요청도 같은 공간적 모호함을 반복합니다.

그림: 눈높이는 시청자, 얼굴, 테이블 면의 관계를 바꿉니다.
관찰자의 손에 할 일 주기
관찰자의 손이 움직이면 POV 장면에 현장감이 생깁니다. 시점과 같은 규칙을 적용하세요. 첫 프레임에서 상황을 만들고 프롬프트는 다음 움직임에만 사용합니다. 관찰자가 잔을 들어야 한다면, 아래 가장자리에서 들어오는 팔뚝과 손에 든 잔을 프레임에 배치하고 느린 동작 하나를 요청하세요.
From the seated observer's fixed eye position, the observer's right hand lifts the white coffee cup a few centimeters and sets it back on the saucer. The man across the table watches, then smiles. One continuous shot, unchanged camera height and distance, no cuts.
물건을 건네는 동작에서는 누가 무엇을 하는지 분명해야 합니다. 서로 맞물리는 교환보다 공간적으로 설명하기 쉬운 상대의 행동부터 시작하세요. 이 동작에는 다른 첫 프레임이 필요합니다. 아래 그림처럼 잔이 상대 쪽 테이블, 손 가까이에 있어야 합니다. 영상화 전에 승인한 프레임을 편집하거나 다시 만들어 잔을 옮기세요. 그런 다음 이 프롬프트를 사용하세요.
From the seated observer's fixed eye position, the adult man across the table uses his right hand to slide the white cup a short distance toward the observer, then releases it. The cup stays on the tabletop throughout. The observer's hands remain resting at the near edge and do not touch the cup. The man briefly glances at the cup, then back toward the observer. One continuous shot, unchanged camera height and distance, no cuts.
첫 시도에서는 관찰자가 잔을 잡도록 요청하지 마세요. 새 손이 들어와 접촉하고 상대가 놓는 동안 잔을 넘겨받아야 하기 때문입니다. 이야기에 그 교환이 필요하다면 잔이 멈춘 뒤 두 번째 행동으로 구성하고, 양쪽 손이 이미 올바르게 보이는 프레임에서 시작하세요.

그림: 접촉, 밀기, 놓기는 테이블 맞은편 남성이 수행하고 관찰자의 손은 떨어져 있습니다.
카메라를 움직여야 할 때
관찰자 자신의 움직임이라면 1인칭 장면도 이동할 수 있습니다. Seedance 2.5 Spicy image-to-video 페이지의 공개 예시가 좋은 참고입니다. 시작 프레임에서 여성은 관찰자의 손을 잡고 있으며, 프롬프트는 시청자의 손을 감싸 쥐고 끌며 "breaking into a run and towing the camera after her"라고 지정합니다. 손으로 든 카메라처럼 움직이는 1인칭 장면입니다.
카메라는 사람의 눈높이 정도에서 손으로 든 카메라처럼 흔들리며 함께 이동하고, 여성은 웃으며 렌즈를 돌아봅니다. 선회나 공중 시점은 없습니다. 관찰자의 손은 시작에만 나오며 이 예시는 계속 손을 잡는 모습을 보여 주지 않습니다. 접촉이 장면에 중요하다면 계속 손을 잡으라고 요청하고 전체 클립에서 확인하세요.
걷는 POV에서는 경로가 분명한 프레임을 준비하고 그 길을 따라 앞으로 움직이도록 요청하세요. 움직임 지시와 소리 지시는 분리하세요.
One continuous first-person shot at standing eye height. The observer walks forward along the lit corridor at an easy pace; the camera advances at walking speed with a slight handheld sway and keeps the corridor centered. No one enters the frame from behind and the observer's body stays out of the frame. Sound: footsteps on tile and faint room tone.
걷는 프롬프트에 카메라 고정 문구를 추가하지 마세요. 두 지시는 서로 모순됩니다. 걷기는 다른 카메라 설정이지, 앉은 클로즈업의 강화판이 아닙니다. 같은 테이크에서 선회, 인물의 후진, 손 상호작용을 함께 요청하지 마세요.
서서 인사하는 장면이라면 설정 전체를 바꾸세요. 문간에 선 성인의 눈높이에 카메라를 놓고, 다른 성인은 실내 두 걸음 안쪽에 배치하며, 앞쪽에 의자나 앉은 사람의 팔뚝을 두지 않습니다. 상대가 문을 조금 열고 미소 짓는 동안 관찰자는 가만히 있도록 요청하세요. 앉은 식당 프레임에 "standing doorway POV"를 붙여 재사용하면 모델이 양립할 수 없는 두 공간을 해결해야 합니다.
마지막 프레임에서 다음 행동 연결하기
고정된 장면이 잘 나오면 짧은 테이크로 시퀀스를 만드세요. 각 테이크는 카메라 위치가 이미 올바른 프레임에서 시작하므로 구조 자체로 시점을 이어갑니다.
- Seedance 2.5에서
return_last_frame을true로 설정하면 응답에 클립의 마지막 프레임이 별도 이미지로 포함됩니다. 다음image_url로 사용하세요. - 이미 있는 클립에서는 직접 마지막 프레임을 내보내세요:
ffmpeg -sseof -0.2 -i input.mp4 -update 1 -q:v 2 last-frame.png. - 원하는 위치에서 끝내려면 두 번째 스틸을
last_image_url로, 반드시image_url과 함께 보내고 두 이미지 사이의 전환을 설명하세요. 구도가 맞지 않으면 끝 구성이 왜곡될 수 있으므로 두 스틸을 같은 화면 비율로 준비하세요. Seedance 2.5 Spicy도 같은 쌍을 받습니다. 양 끝에 같은 스틸을 제공해 그 구도로 돌아오도록 요청할 수 있지만, 정확히 일치한다고 가정하지 말고 렌더링된 끝부분을 확인하세요.
길다고 더 안전하지 않습니다. 모델 페이지도 늘리기 전에 다섯 초에서 움직임을 확인하라고 권합니다. 프레임 기반 장면이 길어질수록 신체 형태와 세트 장식이 달라지기 때문에, 짧은 테이크 여러 개를 편집해 잇는 편이 30초짜리 한 테이크보다 잘 유지됩니다.
클립을 검토한 뒤 자르거나 다시 렌더링하기
처음 네 초는 1인칭을 유지하지만 마지막 초에 카메라가 뒤로 빠진다면 시점이 바뀌기 전에 자르세요. 원치 않는 어깨가 가장자리에 계속 남는다면 중앙 장면이 여전히 관찰자 위치에서 보일 때만 크롭이 도움이 됩니다. 크롭으로 빠진 눈 위치의 시야를 다시 만들거나 테이블 원근을 고칠 수는 없습니다.
잠깐의 시점 변화를 숨길 수 있는 플레이어 썸네일보다 다운로드한 원본 파일을 검토하세요. 이 명령은 다섯 초 클립에서 일정 간격의 검토 이미지 네 장을 추출합니다.
ffmpeg -i input.mp4 \
-vf "fps=4/5,scale=480:-2,tile=2x2" \
-frames:v 1 pov-review.jpg콘택트 시트로 구도 변화를 찾은 다음 전체 클립을 재생해 움직임과 손 접촉을 판단하세요. 짧은 결함은 샘플 사이에 있을 수 있습니다. 사용할 수 없는 끝부분을 제거하려면 아래 명령으로 처음 네 초만 내보내고, 오디오 트랙이 있다면 보존하세요.
ffmpeg -i input.mp4 -t 4 -map 0:v:0 -map 0:a? \
-c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac pov-trimmed.mp4필터 설명은 FFmpeg 문서에 있습니다.
장면에 반대 각도가 필요하다면 다른 쇼트로 의도적으로 컷을 전환하세요. 관찰자 뒤에서 찍은 장면은 이야기 전달에 좋을 수 있지만 3인칭입니다. 1인칭 부분의 공간을 일관되게 유지한 뒤, 새로운 시점을 별도 쇼트로 보여 주세요. 쇼트 계획 가이드는 짧은 장면에 이런 컷을 배치하는 방법을 설명합니다.
장면에 맞는 경로 선택하기
- 승인한 프레임이 있는 경우: 위의 Seedance 2.5 image-to-video를 사용하세요. 직접 만든 시작 구도를 기준으로 잡으며, 클립이 이를 유지하는지 확인하세요.
- 문구만 있는 경우: text-to-video는 1인칭 설명을 받지만 카메라 위치는 모델이 정하므로 시작 구도 제어력이 낮습니다. 사건을 설명하기 전에 카메라 위치("the camera is a person seated at a table")부터 쓰세요.
- 같은 캐릭터가 여러 POV 장면에 나오는 경우: 스틸과 함께 reference-to-video를 쓰거나 일관된 캐릭터 워크플로를 따르세요.
- 고정 눈 위치가 계속 어긋나는 경우: 일부 모델에는 실제 카메라 잠금 입력이 있습니다. 고정 카메라 가이드에서 해당 모델과 입력이 없는 모델의 잠금 표현법을 설명합니다.
- 성인용 1인칭 장면: Seedance 2.5 Spicy는 무검열 LoRA 조정 버전이며 사용 사례에 1인칭 시점을 포함합니다. 같은 프레임 우선 논리를 쓰고
aspect_ratio와return_last_frame입력은 없으며, 표기 가격은 480p에서 초당 $0.216, 720p에서 $0.432, 1080p에서 $1.08입니다. 무검열 영상 프롬프트 가이드에는 1인칭 프롬프트가 있고 무검열 이미지→영상 가이드는 스틸 준비를 다룹니다.
승인한 POV 장면을 앱에서 사용하기
환경에 SPICY_API_KEY를 설정하고, SPICY_IMAGE_URI는 시작 이미지의 접근 가능한 URL이나 업로드한 spicy:// URI로 설정하세요. 이 Python 3 예시는 가격을 확인한 뒤 새로운 쇼트 하나를 제출합니다.
import json
import os
import urllib.request
import uuid
base = "https://api.spicyapi.ai/api/v1"
headers = {"Authorization": "Bearer " + os.environ["SPICY_API_KEY"],
"Content-Type": "application/json", "User-Agent": "SpicyAPI-Blog/1.0"}
settings = {
"duration_seconds": 5,
"resolution": "480p",
"generate_audio": False
}
settings["prompt"] = 'One continuous fixed-camera first-person shot from a seated observer. The man across the table gives one small smile. Keep the camera height, framing, room and clothing unchanged.'
settings["image_url"] = os.environ["SPICY_IMAGE_URI"]
payload = {"model": "bytedance/seedance-2.5/image-to-video", "input": settings}
def post(path, body):
request = urllib.request.Request(base + path, json.dumps(body).encode(), headers)
with urllib.request.urlopen(request, timeout=60) as response:
result = json.load(response)
if result.get("code") != 200:
raise RuntimeError(result)
return result["data"]
quote = post("/jobs/quote", payload)
if input(f"Maximum charge ${quote['maxCharge']}. Type yes to generate: ") != "yes":
raise SystemExit("Stopped before generation")
headers["Idempotency-Key"] = str(uuid.uuid4())
print("Request key:", headers["Idempotency-Key"], flush=True)
task = post("/jobs/createTask", {**payload, "quoteId": quote["quoteId"],
"expectedCost": quote["estimatedCost"]})
print("Task ID:", task["taskId"])출력된 요청 키는 동일한 요청의 복구를 위해 보관하세요. 새로운 쇼트에는 새 키가 필요합니다. Task API 문서에서 결과 전달과 복구를 설명합니다.
반복 촬영에는 Agent가 승인한 입력 파일을 사용하게 하세요. CLI: spicyapi tasks create --model bytedance/seedance-2.5/image-to-video --input-file input.json --wait. MCP: 해당 모델과 입력으로 spicyapi_task_create를 호출하도록 요청하세요. Skill: “Use the spicyapi Skill to generate this approved shot and return the result.”라고 요청하세요. CLI와 MCP는 생성 전에 가격을 보여 줍니다. Agent 통합 문서를 참고하세요.







