목차 · 10개
이 글에는 제휴 링크가 없습니다. 영상과 프롬프트는 직접 준비했고, 길이·프레임·색·소리는 2026년 10월 16일 완성 파일을 직접 측정했습니다. 코드 조각은 원리를 보여 주는 설명용 예시이며 원본 코드가 아닙니다. 로봇 그림은 AI 이미지 생성, 영상 캡처·도식은 직접 제작했습니다.
모션그래픽 프롬프트 팩, 영상 AI가 아니라 코드가 그린다

모션그래픽 프롬프트 팩 — 코드로 만드는 모션그래픽 1편 (캐릭터는 AI 이미지 생성)
요즘 스레드 같은 SNS에 ‘모션그래픽 프롬프트 팩’이 자주 돌아요. 긴 프롬프트 한 장에, 글자가 튀어 오르고 화면이 사선으로 넘어가는 영상이 붙어 있죠. “이것도 영상 AI가 만든 걸까?” 궁금했던 분이 많을 거예요. 지난 글에서는 영상 모델과 코드를 나란히 비교했는데, 이번에는 코드 쪽을 끝까지 파 봐요.
프롬프트 팩은 악보와 비슷해요. 음 높이와 박자가 다 적혀 있어서, 누가 연주해도 같은 곡이 나와요. 영상 AI에게 장면을 맡기는 건 “신나는 곡 하나 쳐 줘”라고 부탁하는 쪽에 가까워요. 칠 때마다 다른 곡이 나오죠.
프롬프트 팩은 영상을 그려 달라는 부탁이 아니라, 코드로 옮길 악보예요.

도형 음표가 그려진 악보를 보며 지휘하는 로봇 — 프롬프트 팩은 코드로 옮길 악보 (AI 이미지 생성)
① 코드로 만든 12초 인트로 영상과 그 프롬프트
② 프롬프트 한 줄이 어떤 코드가 되는지 — 프레임·이징·카메라·소리
③ 코드 방식이 잘 맞는 일과 한계
직접 해 보려면: 코딩 에이전트 · 파이썬(pycairo·numpy·scipy) · ffmpeg
2026년 10월 16일 기준 · 코드로 만드는 모션그래픽 연재 1편
1. 12초 인트로, 먼저 보세요
직접 만든 오리지널 캐릭터 프리즘(PRISM)이 나오는 12초 인트로예요. 화면에 보이는 것은 모두 코드가 그렸어요. 점 하나에서 시작해(FROM A DOT.), 움직이고(MAKE IT MOVE.), 아이디어가 움직임이 된 뒤(IDEA → MOTION.), 타이틀(MOTION LAB.)에서 멈춰요.
코드로 만든 12초 모션그래픽 인트로 — 프리즘이 나오는 네 장면, 소리를 켜고 보세요 (직접 제작)
완성된 파일을 직접 재 봤어요. 12.00초, 1920×1080, 30fps에 정확히 360장이었고, 영상은 H.264, 소리는 AAC 스테레오였어요. 파일 안에 남은 인코더 기록에는 crf=16.0이 적혀 있었어요. 프롬프트에 쓴 ‘CRF 16’ 그대로예요.
2. 프롬프트 팩은 사양서예요
이 프롬프트에는 ‘멋지게’ 같은 말이 거의 없어요. 색·좌표·시간이 모두 숫자로 적혀 있어요. 글자는 Poppins Bold 210px로 왼쪽 x=140에 맞추고, 두 줄의 바닥선은 y=500과 730이에요. 장면 전환은 2.5·5.5·8.5초, 소리는 120 BPM이에요.
이렇게 쓰면 AI가 상상할 자리가 거의 없어요. 코딩 에이전트는 숫자를 그대로 변수에 옮기면 되고, 그 코드는 몇 번을 돌려도 같은 영상을 만들어요. 느낌 대신 숫자로 쓴 프롬프트가 같은 영상을 만든다는 게 프롬프트 팩의 핵심이에요.
📋 프롬프트 원문 — 그대로 복사해 쓰세요
[첨부: 프리즘 캐릭터 이미지 (1024×1024, 흰 배경 전신 일러스트, 양손 브이 포즈)]
첨부한 이미지는 내가 만든 오리지널 캐릭터 '프리즘(Prism)'이야.
이 캐릭터를 넣어서 12초 모션그래픽 인트로를 MP4로 만들어줘.
■ 출력 사양
- 12초, 1920×1080, 30fps(360프레임), H.264(yuv420p, CRF 16) + AAC 스테레오 192kbps
- 구현: Python + pycairo로 프레임을 렌더해 ffmpeg 파이프로 인코딩, 사운드는 numpy/scipy로 직접 합성
- 렌더 전에 주요 시점 프레임을 미리보기로 뽑아 검수할 것
■ 디자인 시스템
- 색: 차콜 #1C1C1F, 아이보리 #F3EFE4, 라임 #C8F43A, 보라 #7A4CFF, 렌즈 배경 라벤더 #E6DDFF
- 폰트: Poppins Bold, 대형 타이포 210px, 자간 -0.02em, 왼쪽 x=140 정렬, 두 줄 베이스라인 y=500/730
- 문장 끝 마침표는 강조색(라임 또는 보라)
- 공통 요소: 좌상단 '0N / 04', 우상단 'MOTION LAB'(22px, 자간 0.18em), 하단 y=970에 25% 불투명 가로선
- 글자 등장: 글자마다 베이스라인 아래 가려진 영역에서 솟아오르는 마스크 리빌(35ms 시차, 0.55초, ease-out-back 오버슈트)
- 움직임은 ease-out-elastic, ease-out-back 위주의 탄력 있는 이징
- 장면 전환: 2.5/5.5/8.5초를 중심으로 ±0.32초 동안 사선 와이프(기울기 420px). 선두에 색 띠(라임→보라→라임)가 지나가고 새 장면이 띠 뒤를 따라 드러남
■ 프리즘 캐릭터 처리
- 배경 제거: 이미지 가장자리와 연결된 흰색 영역(RGB 최솟값 >236, 채도 <16)만 배경으로 판단해 셔츠·운동화의 흰색은 보존. 40px 미만 잡티 제거
- 거리 변환으로 10px 흰 외곽선을 둘러 스티커 스타일로 만들기
- 클로즈업용으로 4배 Lanczos 업스케일 + 언샤프 마스크 버전을 따로 만들고, 확대 배율이 1을 넘으면 4배 소스, 그 이하면 원본 소스를 사용
- 카메라 기준점(원본 1024px 좌표): 얼굴 (527,176), 왼손 브이 (424,182), 오른손 브이 (624,182), 상반신 (527,225)
- 카메라 배율은 '원본 1px당 화면 px'. 줌은 로그 공간에서 보간하고, 팬 이동 중에는 잠깐 줌아웃되는 휩 효과를 줄 것
■ 0–2.5초 'FROM A DOT.' (차콜 배경)
- 라임 점(반지름 60)이 0–0.8초 탄성으로 커짐
- 0.45–1.3초 라임 위성이 반지름 230 보라 궤도(선폭 7)를 그리며 돌고 이후 계속 공전. 바깥에 반지름 340 아이보리 점선 궤도와 보라 위성
- 0.85–1.45초 점·궤도 그룹이 화면 중앙에서 x=1480으로 이동
- 'FROM A' / 'DOT.' 아이보리(1.1초, 1.3초 시작), 마침표 라임. 우하단에 회전하는 라임 + 기호
■ 2.5–5.5초 'MAKE IT MOVE.' (아이보리 배경)
- 'MAKE IT' / 'MOVE.' 차콜, 마침표 보라. 1.35초에 'MOVE.' 글자들이 순서대로 탄성 점프
- 오른쪽 (1470,545)에 꽃 모양 렌즈: 원(반지름 164) + 꽃잎 8개(중심거리 160, 반지름 100)의 합집합, +14px 보라 테두리. 꽃잎은 순차적으로 탄성 등장하고 마스크 전체가 회전. 바깥에 반지름 315 점선 링이 반대로 회전
- 렌즈 안: 라벤더 배경 + 프리즘 클로즈업(이미지는 회전하지 않음)
· 0.25초 오른손 브이 4.4배 → 1.35초 얼굴 3.0배(팬 + 줌아웃)
· → 2.35초 얼굴 4.1배(줌인) → 3.3초 상반신 2.0배(줌아웃)
- 회전하는 차콜 삼각형 포인트
■ 5.5–8.5초 'IDEA → MOTION.' (차콜 배경)
- 'IDEA' 뒤에 라임 화살표를 직접 그림(길이 230, 선폭 24, 화살촉은 탄성으로 펼쳐짐). 'MOTION.' 아이보리, 마침표 라임
- 오른쪽 (1545,545)에 원형 렌즈(반지름 205)가 탄성 등장
- 렌즈 주위로 열린 동심원 4개: 반지름 228/262/294/322, 색 라임/보라/아이보리/라임, 선폭 14/14/8/5, 72% 호. 순차적으로 그려지며 방향을 번갈아 회전
- 렌즈 카메라: 0.3초 왼손 4.6배 → 1.5초 오른손 4.0배(중간에 얼굴을 가로지르며 크게 빠지는 휩 줌) → 3.3초 얼굴+양손 1.7배로 천천히 줌아웃
- 회전하는 보라 사각 외곽선 포인트
■ 8.5–12초 'MOTION LAB.' 타이틀 (아이보리 배경)
- 얼굴이 화면을 가득 채운 3.0배 클로즈업으로 시작해 0.4초간 8% 푸시인
- 0.4–1.35초 ease-out-back으로 전신 포즈까지 풀백(살짝 지나쳤다 돌아옴). 최종 높이 820px, 발끝 y=1000, 중심 x=1500
- 차콜 16% 드롭섀도(16,8)
- 풀백이 끝날 무렵 뒤로 라임 원판(반지름 250, 중심 1500,575)이 탄성 등장하고, 광선 16개(보라/차콜/보라/라임 반복, 길이 40/64)가 회전하며 펼쳐져 고정
- 'PRISM' 보라 알약 태그가 (1735,285)에 -8° 기울기로 탄성 팝
- 왼쪽 막대 심볼: 5개, 폭 46, 간격 22, 높이 130/210/280/190/110, 색 차콜/보라/라임/보라/차콜, 둥근 윗면, 바닥 y=445. 순차적으로 탄성 성장
- 'MOTION LAB.'(폭 940px에 맞춤, 베이스라인 690): 라임 바가 훑으며 덮었다 걷히는 동안 글자 마스크 리빌, 마침표 보라
- 부제 'IDEAS IN MOTION — WITH PRISM'(28px) + 보라 밑줄 120px
- 모든 움직임은 10.4초에 멈추고, 마지막 1.5초 이상 완전히 정지해 타이틀을 읽을 수 있게 유지
■ 사운드 (120 BPM, 2.5/5.5/8.5/10초가 모두 박자에 맞음)
- 리듬
· 킥: 0–9.5초 매 박자(42Hz로 떨어지는 피치 사인 + 클릭)
· 클랩: 2.5초부터 2·4박
· 하이햇: 1초부터 8분 오프비트, 5.5초부터 16분 + 오픈햇
- 베이스: 2초 마디마다 루트 A-A-F-G-A, 8분 오프비트, 쏘우파 + 420Hz 로우패스. 6초부터 옥타브 위 음 추가
- 플럭 아르페지오: A 마이너 펜타토닉 16분음, 2.5–10초, 좌우로 번갈아 배치
- 장면 연출 효과음
· 0초 점 등장 블립, 1.15/1.35초 텍스트 틱
· 각 전환마다 0.5초 휘시 + 큰 킥 + 오픈햇
- 카메라 효과음: 2.75/3.9/4.85/5.8/7.05/8.85초에 줌 스우시
- 클라이맥스
· 8.5–10초 라이저, 9–10초 스네어 롤
· 9.55초 카메라가 멈출 때 '보잉', 9.78초 태그 팝
· 10초 임팩트(큰 킥 + 48Hz 서브 + 크래시) + A 마이너 패드(110/220/261.63/329.63/440Hz)가 끝까지 감쇠
- 마스터링: 마지막 0.3초 페이드아웃, tanh 소프트 클리핑, 피크 -1dB
원문 그대로예요(약 3,400자, 74줄). 첨부 이미지와 글자를 내 것으로 바꾸면 같은 틀로 다른 영상을 만드는 데 쓸 수 있어요. 프롬프트 줄이 코드에서 무엇이 되는지 짝지어 봤어요.
| 프롬프트에 적힌 것 | 코드에서는 |
|---|---|
| 12초 · 30fps(360프레임) | for 문 360번, 시각 t = 번호 ÷ 30 |
| 색 다섯 가지 · Poppins Bold | 상수 몇 개 — 모든 장면이 같이 써요 |
| ease-out-back 오버슈트 | 0~1 진행률을 바꾸는 함수 한 줄 |
| 글자마다 35ms 시차 리빌 | 글자별 시작 시각을 0.035초씩 미뤄요 |
| 2.5·5.5·8.5초 사선 와이프 | 기울어진 사각형으로 두 장면을 잘라 겹쳐요 |
| 줌은 로그 공간에서 보간 | 배율에 로그를 씌워 섞고 되돌려요 |
| 사운드 120 BPM | 0.5초마다 소리 파형을 더해요 |
3. 360장을 그려 이어 붙여요
이 영상은 그림 360장을 한 장씩 그려 이어 붙인 거예요. 넘기는 만화책, 플립북과 같은 원리예요.

플립북을 넘기며 점이 튀는 걸 보는 로봇 — 한 장씩 그린 그림 360장이 12초 영상이 돼요 (AI 이미지 생성)
코드는 0번부터 359번까지 프레임 번호를 돌면서 시각 t를 구해요(t = 번호 ÷ 30). 그리고 “이 시각에 점은 얼마나 커져 있어야 하지?”를 계산해 그 한 장을 그려요. 그리는 도구는 파이썬 그래픽 라이브러리 pycairo예요. 원·선·글자를 벡터로 그려서 경계가 깨끗하고, 1920×1080 한 장을 메모리 안에서 바로 만들어요.
다 그린 그림은 파일로 저장하지 않고 ffmpeg에 바로 흘려보내요(파이프). ffmpeg가 이 그림들을 H.264 영상으로 압축해요. CRF는 화질 기준값이라 숫자가 작을수록 화질이 좋고 파일이 커져요. yuv420p는 대부분의 플레이어와 브라우저가 재생하는 색 형식이에요.
아래는 이 흐름을 줄인 설명용 예시예요. 이 영상을 만든 원본 코드가 아니에요.
p = subprocess.Popen(cmd, stdin=PIPE)
for i in range(360):
t = i / 30
surf = draw_frame(t)
surf.flush()
p.stdin.write(surf.get_data())
p.stdin.close()
draw_frame(t)가 시각 t의 한 장을 그리는 함수예요. cmd에는 “1920×1080 그림이 초당 30장 들어간다, H.264·yuv420p·CRF 16으로 저장해”라는 ffmpeg 옵션이 들어가요. 소리는 따로 만들어 마지막에 영상과 합쳐요. 전체 흐름을 그림으로 정리했어요.

프롬프트 한 장이 MP4가 되기까지 — 프레임 360장을 pycairo로 그려 ffmpeg로 압축하고, numpy로 합성한 소리를 합쳐요 (직접 제작)
4. 통통 튀는 움직임은 공식 한 줄
탄력 있는 느낌은 이징(easing) 함수가 만들어요. 0에서 1로 가는 진행률을 살짝 넘쳤다 돌아오게 바꾸는 공식이에요. 진행률을 그대로 쓰면 기계처럼 일정한 속도로 움직여서 딱딱해 보여요.
def ease_out_back(x, s=1.70158):
x = x - 1
return 1 + (s + 1) * x**3 + s * x**2
널리 쓰이는 ease-out-back 공식을 옮긴 설명용 예시예요. 직접 계산해 보면 진행률 58% 지점에서 1.10까지 올라갔다가 1로 돌아와요. 이 10% 넘침이 ‘통’ 하는 느낌이에요. ease-out-elastic은 점점 작아지는 사인파를 더해, 고무줄처럼 몇 번 떨리다 멈춰요. 첫 장면의 라임 점이 이렇게 커져요.

1.6초 ‘FROM A DOT.’ — 탄성으로 커진 라임 점 둘레를 보라 궤도와 위성이 돌아요 (직접 캡처)
글자가 바닥선 아래에서 솟는 장면은 마스크 리빌이에요. 바닥선 위만 보이게 잘라 두고 글자를 아래에서 올리면, 땅에서 솟는 것처럼 보여요. 글자마다 시작을 0.035초씩 늦추면 한 글자씩 차례로 올라와요. 이때도 ease-out-back을 써서 살짝 넘쳤다 자리를 잡아요.
장면 전환은 기울어진 사각형 하나로 해요. 사각형 안에는 새 장면, 밖에는 옛 장면을 그리고 사각형을 옆으로 밀면 사선 와이프가 돼요. 맨 앞의 라임·보라 색 띠도 같은 기울기의 얇은 사각형을 하나 더 그린 거예요.

5.5초 사선 와이프 — 보라 띠 뒤로 다음 장면(차콜)이 따라 들어오며 앞 장면을 덮어요 (직접 캡처)
5. 캐릭터는 스티커처럼 오려요
흰 배경에서 캐릭터만 오려 낼 때 흰색을 다 지우면 흰 셔츠와 운동화에도 구멍이 나요. 그래서 그림 가장자리와 이어진 흰색만 지워요. 프롬프트도 이 점을 숫자로 정해 뒀어요.
그림 테두리에서 출발해, 이어진 흰 칸을 따라 번져 가며 지워요(플러드 필). 흰 칸은 빨강·초록·파랑 값이 모두 236보다 크고 채도가 16보다 작은 칸이에요. 캐릭터 안쪽의 흰 셔츠는 테두리와 이어져 있지 않으니 남아요. 40px보다 작은 잡티는 따로 지워요.
그다음 거리 변환으로 캐릭터 둘레 10px 거리 안의 칸을 흰색으로 채우면, 스티커 같은 흰 외곽선이 생겨요. 마지막 장면의 그림자는 같은 모양을 차콜 16% 투명도로 오른쪽 16px, 아래 8px 밀어 깐 거예요.

9.2초 풀백 — 흰 외곽선으로 오린 프리즘이 얼굴 클로즈업에서 전신으로 빠지는 중 (직접 캡처)
6. 렌즈와 카메라도 계산이에요
클로즈업은 ‘어디를, 몇 배로’ 볼지만 정하면 돼요. 카메라가 따로 있는 게 아니라 그림을 옮기고 키우는 계산이에요. 프롬프트는 원본 그림(1024px) 위의 기준점을 줘요. 얼굴 (527,176), 왼손 브이 (424,182), 오른손 브이 (624,182) 같은 식이에요.
배율은 ‘원본 1px이 화면에서 몇 px인가’예요. 4.4배면 원본 1px이 화면 4.4px이 돼요. 1배를 넘게 키울 때는 미리 4배로 키워 둔 그림(란초시 업스케일 + 언샤프)을 쓰고, 그 이하에서는 원본을 써요. 크게 확대해도 계단이 덜 보이게 하려는 거예요.
꽃 모양 렌즈는 원 하나와 꽃잎 원 8개를 합친 모양으로 그림을 잘라 낸 거예요. 잘라 내는 모양(마스크)만 돌리고 그림은 그대로 두니, 렌즈만 도는 것처럼 보여요.

3.9초 꽃 모양 렌즈 — 원과 꽃잎 8개를 합친 모양으로 프리즘 얼굴을 잘라 보여 줘요 (직접 캡처)
줌은 로그 공간에서 섞어요. 4.4배에서 3.0배로 갈 때 그냥 평균을 내면 중간이 3.7배지만, 로그로 섞으면 약 3.63배예요. 2배→4배와 4배→8배가 같은 시간에 같은 빠르기로 느껴지게 하는 방법이에요. 눈은 차이보다 비율로 크기를 느끼거든요.
한 손에서 다른 손으로 옮길 때는 중간에 잠깐 크게 빠졌다가 다시 들어가요(휩 줌). 카메라가 휙 지나가는 느낌을 내는 연출이에요.

7.4초 원형 렌즈 — 손 브이를 크게 비춘 뒤 천천히 빠지는 중, 둘레의 동심원 4개가 번갈아 돌아요 (직접 캡처)
7. 소리도 코드로, 박자에 맞춰
소리도 녹음이 아니라 계산으로 만들어요. 120 BPM이면 한 박이 0.5초라서 2.5·5.5·8.5·10초가 모두 박자 위에 떨어져요. 장면 전환을 박자에 맞추면, 화면이 바뀌는 순간 소리가 함께 ‘쿵’ 하고 들어가요.
킥은 42Hz까지 음이 떨어지는 사인파에 짧은 클릭을 더한 소리고, 베이스는 톱니파를 420Hz 로우패스로 깎은 소리예요. numpy로 파형을 계산하고 scipy로 필터를 걸어요. 마지막에 tanh로 부드럽게 눌러(소프트 클리핑) 소리가 찢어지지 않게 해요.
직접 재 보니 소리가 가장 큰 순간이 2.5·5.5·8.5·10초 바로 그 자리였어요. 소리가 크게 커지는 지점도 대부분 0.5초 간격으로 늘어서 있었어요.

12초 타임라인 — 네 장면, 사선 와이프 세 번, 박자(0.5초)와 10초 임팩트, 10.4초부터 정지 (직접 제작)
끝부분도 재 봤어요. 10.4초 뒤의 48장은 거의 같은 그림이었어요(픽셀 차이 평균 0.01 미만, 압축 잡음 수준). 프롬프트의 ‘마지막 1.5초 이상 완전히 정지’ 그대로예요. 마지막 0.3초에는 소리가 약 22dB 줄어드는 페이드아웃이 들어 있었어요.

11.5초 마지막 타이틀 ‘MOTION LAB.’ — 움직임이 모두 멈춰 타이틀을 읽을 수 있어요 (직접 캡처)
8. 영상 AI 대신 코드를 쓰는 이유
같은 코드는 몇 번을 돌려도 같은 360장을 그려요. 영상 AI는 같은 부탁에도 매번 다른 픽셀을 뽑아요. 그래서 고치기 쉬워요. ‘전환을 0.1초 늦게’처럼 숫자 하나만 바꿔 다시 렌더하면 나머지는 그대로 남아요.
글자도 정확해요. 글자는 글꼴로 찍으니 틀릴 일이 없어요. 지난 글에서 Veo 3.1 Fast에 글로만 설명해 맡긴 한글 소개 문장은 ‘AI절헌 억음 구온…’처럼 뜻 없는 글자로 바뀌었어요. 지난 글에서 소개한 클로드 모션도 영상 생성 모델 없이, 움직이는 코드로 짧은 애니메이션을 만드는 방식이었어요(공식 도움말).
저는 요즘 발표 자료에 넣을 짧은 영상을 이 방식으로 많이 만들어요. 쓸 만한 프롬프트 팩은 SECOND SYNTAX 브랜드 키트에 조금씩 모으는 중이에요. 색·글꼴·간격 같은 디자인 값을 한곳에 두면 영상마다 차콜·라임·보라를 다시 적지 않아도 되고, 프롬프트에는 장면과 움직임만 쓰면 돼요.
한계와 주의할 점
코딩 에이전트와 실행 환경이 필요해요
→ 클로드 코드·코덱스 같은 에이전트가 코드를 쓰고, 내 컴퓨터에 파이썬·pycairo·ffmpeg가 있어야 렌더가 돌아요. 코드를 실행할 수 없는 곳에서는 영상 파일이 나오지 않아요.
글꼴과 그림 파일이 있어야 해요
→ Poppins Bold 글꼴과 캐릭터 그림이 없으면 다른 글꼴로 바뀌거나 렌더가 멈춰요. 글꼴은 미리 설치하거나 작업 폴더에 넣어 두세요.
렌더와 수정에 시간이 들어요
→ 실시간으로 재생하는 게 아니라 한 장씩 그려서, 고칠 때마다 다시 렌더해요. 프롬프트처럼 주요 시점 프레임만 먼저 뽑아 확인하면 시간을 아낄 수 있어요.
숫자로 안 적은 부분은 결과가 달라질 수 있어요
→ 꽃잎이 열리는 곡선이나 효과음 질감처럼 숫자로 안 적은 부분은 에이전트마다 다르게 짜요. 미리보기를 보고 숫자로 고쳐 달라고 하세요.
실사 장면은 못 만들어요
→ 사람·풍경 같은 실사는 코드로 그릴 수 없어요. 그런 장면은 영상 모델로 만들고 글자만 코드로 얹으세요.
② 프레임 360장을 pycairo로 그려 ffmpeg로 잇고, 소리는 numpy로 합성해요
③ 숫자로 쓸수록 결과가 고정되고 글자·색이 정확해요. 실사는 영상 모델 몫이에요
코드로 만드는 모션그래픽 연재
- 1편 프롬프트 팩과 그 뒤의 기술 (이 글)
- 2편 내 프로젝트 일부를 소개하는 모션그래픽, 같은 방식으로 만들기 (다음 글)
- 3편 직접 만든 영상과 프롬프트로 한 편 더 (준비 중)
- 2편 바로 보기 https://happyvarious.com/posts/20261016-ai-code-motion-project-intro/
자주 묻는 질문
Q. 프롬프트만 있으면 정말 같은 영상이 나오나요?
색·위치·시간·글자처럼 숫자로 정한 부분은 거의 같게 나와요. 다만 코드는 에이전트가 새로 짜는 거라, 숫자로 안 적은 곡선이나 효과음 질감은 조금씩 다를 수 있어요. 한 번 만든 코드를 다시 돌리면 그때부터는 같은 영상이 나와요.
Q. 코딩을 몰라도 만들 수 있나요?
코드는 에이전트가 쓰고, 사람은 미리보기 프레임을 보고 ‘전환을 0.1초 늦게’처럼 숫자로 고쳐 달라고 하면 돼요. 파이썬과 ffmpeg 설치는 처음 한 번 필요한데, 설치도 에이전트에게 부탁할 수 있어요.
Q. 세로 영상(쇼츠)으로도 만들 수 있나요?
네. 출력 사양의 1920×1080을 1080×1920으로 바꾸고, 좌표를 세로 화면에 맞게 다시 잡아 달라고 하면 돼요. 좌표가 숫자로 적혀 있어 한꺼번에 바꾸기 쉬워요.
Q. 영상 AI와 섞어 쓸 수 있나요?
네. 실사 배경이나 분위기 장면은 영상 모델로 만들고, 글자·로고·타이틀은 코드로 얹으면 두 방식의 장점을 함께 살릴 수 있어요.
지난 글에서는 같은 장면을 영상 모델과 코드로 나란히 만들어 비교했어요 → AI 모션그래픽 만드는 법, 영상 모델과 코드 직접 비교
참고 자료
- pycairo 문서 — Surfaces · pycairo.readthedocs.io/en/latest/reference/surfaces.html
- FFmpeg 코덱 문서 — libx264 · ffmpeg.org/ffmpeg-codecs.html
- 이징 함수 모음 easings.net · github.com/ai/easings.net
영상과 프롬프트는 직접 준비했고, 길이·프레임·색·소리는 완성된 파일을 직접 재서 썼어요.
코드 조각은 원리를 보여 주는 설명용 예시이고, 영상을 만든 원본 코드가 아니에요.
제휴 링크는 없어요. 로봇 그림은 AI 이미지 생성, 영상 캡처·도식은 직접 제작이에요.
설명용 예시: ffmpeg에 넘기는 옵션
위 예시의 cmd를 풀어 쓴 모양이에요. 원본 코드가 아니라 원리를 보여 주는 예시예요. pycairo의 ARGB32 그림은 한 픽셀이 32비트이고 컴퓨터의 바이트 순서대로 저장돼서, 흔한 PC(리틀 엔디언)에서는 메모리에 B·G·R·A 순으로 놓여요. 그래서 bgra로 알려 줘요.
cmd = ["ffmpeg", "-y",
"-f", "rawvideo", "-pix_fmt", "bgra",
"-s", "1920x1080", "-r", "30", "-i", "-",
"-c:v", "libx264", "-crf", "16", "-pix_fmt", "yuv420p",
"video.mp4"]
소리를 따로 audio.wav로 만들었다면, 마지막에 이렇게 합쳐요(영상은 다시 압축하지 않고 소리만 AAC로).
ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -b:a 192k out.mp4 