본문으로 건너뛰기
Cutfac

클로드 코드로 유튜브 쇼츠 썸네일 만들기

유튜브 홈 화면과 채널의 Shorts 탭에서는 쇼츠가 재생되기 전에 썸네일로 먼저 보여요. 2026년 7월부터는 YouTube 파트너 프로그램 크리에이터가 프레임을 고르는 대신 직접 만든 썸네일을 올릴 수 있어요. 좋은 썸네일은 알맞은 프레임에서 시작하고, 영상에서 하는 말과 맞는 짧은 문구를 담고, 카드 크기로 잘리고 줄어들어도 읽혀야 해요. 이 가이드는 클로드 코드가 ffmpeg와 ImageMagick으로 36초짜리 쇼츠의 썸네일을 비교할 수 있게 세 가지 버전으로 만든 실제 작업 하나를 따라가요. 단계마다 명령어, 출력, 그리고 도구가 하는 일을 보여 줘요.

발행일:

유튜브가 요구하는 것

유튜브는 쇼츠 썸네일로 2160 × 3840픽셀을 권장해요. 쇼츠와 같은 9:16이고, 높이는 640픽셀 이상, 파일은 JPG나 PNG예요. 컴퓨터에서 올리면 50MB까지, 모바일에서는 2MB까지 돼요. 세로 영상에 16:9 썸네일을 넣으면 그 대신 자동으로 만든 4:5 썸네일이 쓰여요.

쇼츠에 직접 만든 썸네일을 올리는 건 새로 생긴 기능이에요. 2026년 7월 24일부터 YouTube 파트너 프로그램 크리에이터가 올릴 수 있고, 유튜브는 앞으로 더 많은 크리에이터에게 열겠다고 했어요. 계정 인증도 돼 있어야 하고, 지금은 컴퓨터의 YouTube 스튜디오에서만 쇼츠 썸네일을 추가할 수 있어요. 그 밖의 경우에는 쇼츠의 한 프레임을 골라요. 컴퓨터의 스튜디오는 세 개를 추천해 주고, 휴대폰의 YouTube 앱에서는 아무 프레임이나 고를 수 있어요.

쇼츠는 대부분 쇼츠 피드에서 보는데, 피드는 썸네일 없이 바로 재생해요. 유튜브의 Creator Insider 채널에 따르면 썸네일이 중요한 곳은 홈 화면과 채널의 홈 탭, Shorts 탭이고, 거기서도 늘 전체가 보이지는 않아요. 기기마다 실제로 보이는 부분은 9:16 전체보다 3 × 2에 가까우니 중요한 건 가장자리에서 떨어뜨려 두라는 게 그 채널의 조언이에요. 너비 1,024픽셀인 브라우저 창에서 채널의 Shorts 탭을 보면 카드 하나가 206 × 309픽셀로, 썸네일 가운데를 2:3으로 잘라 낸 모양이에요. 2160 × 3840 썸네일이라면 y 300부터 3540까지 남고, 위아래 300픽셀씩 잘려요.

만들 썸네일

긴 영상 하나로 쇼츠 여러 개를 만드는 가이드에서 만든 36초짜리 쇼츠 heat.mp4에 쓸 썸네일 하나예요. 영국 왕립학회(The Royal Society)의 “Interview on extreme weather with physical geographer Hannah Cloke”에서 잘라 낸 쇼츠로, 수문학 교수 해나 클로크(Hannah Cloke)가 지난여름 영국의 40도 폭염과 폭염이 왜 소리 없이 사람을 죽이는지 이야기해요. 인터뷰는 CC BY 3.0으로 공개돼 있고, 거기서 만든 썸네일에도 그대로 적용돼요. 출처는 쇼츠와 똑같이 밝히면 돼요. 영국 왕립학회, 라이선스 링크, 그리고 바꿨다는 표시요.

목표는 같은 프레임으로 만든 세 가지 버전이에요. 그래야 비교할 수 있어요. 제목이 아래에 있는 것, 가운데에 있는 것, 그리고 프레임만 있는 것이요. 사람들은 썸네일을 채널 Shorts 탭의 카드 크기로 보니까, 셋 다 그 크기로 자르고 줄여서 확인해요.

아래 명령어, 출력, 이미지는 모두 이 작업에서 나온 그대로예요. 이 쇼츠에만 해당하는 건 없어서, 얼굴이 나오는 쇼츠라면 똑같이 하면 돼요.

준비물

Homebrew가 깔린 Mac, 내 계정으로 로그인한 클로드 코드, 그리고 쇼츠가 들어 있는 폴더가 있으면 돼요. 각각 하는 일은 이래요.

  • 클로드 코드: 에이전트예요. 프레임을 보고, 하나를 고르고, 제목과 명령어를 쓰고, 결과를 확인해요.
  • ffmpeg: thumbnail 필터로 후보 프레임을 뽑아요. 함께 깔리는 ffprobe는 파일 안에 뭐가 들었는지 읽어 줘요.
  • ImageMagick: 프레임을 한 장에 늘어놓고, 고른 프레임을 키우고, 제목을 그려요. 무료 오픈소스예요.
  • Anton: Google Fonts에 있는 길쭉하고 굵은 폰트예요. SIL 오픈 폰트 라이선스라 만드는 무엇에든 쓸 수 있어요.
  • 쇼츠의 자막이 있으면 함께 쓰세요. heat.vtt는 긴 영상 가이드에서 Whisper로 만든 거예요. 자막이 있으면 클로드 코드가 프레임마다 무슨 말을 하고 있는지 알 수 있어요.

1단계: ImageMagick 설치하고 폰트 받기

Homebrew로 두 도구를 설치해요.

brew install ffmpeg imagemagick

ffmpeg에도 글자를 넣는 drawtext 필터가 있지만, FreeType 폰트 라이브러리와 함께 빌드했을 때만 들어 있고 Homebrew의 ffmpeg는 그렇지 않아요. 이름이 drawtext인 필터를 세어 보면 하나도 없어요.

ffmpeg -hide_banner -filters | grep -c drawtext
0

그래서 프레임은 ffmpeg로 뽑고, 그리는 건 ImageMagick이 해요. Anton은 GitHub의 Google Fonts 저장소에서 받아요. 171KB짜리 파일 하나이고, 0.56초 걸렸어요.

curl -L -O https://github.com/google/fonts/raw/main/ofl/anton/Anton-Regular.ttf

2단계: 클로드 코드에게 브리프 주기

폴더에서 클로드 코드를 열어요. 브리프에는 좋은 프레임의 조건과 결과를 확인할 방법을 적고, 고르는 일과 명령어는 클로드 코드에게 맡겨요.

Claude Code

heat.mp4는 곧 올릴 쇼츠고, heat.vtt는 그 자막이야. 이 쇼츠의 썸네일을 만들어 줘. - 후보 프레임을 뽑아서 시간과 함께 한 장에 늘어놓아 - 눈을 뜨고 있고, 얼굴이 크고, 하는 말과 표정이 맞는 프레임을 골라 - 굵은 폰트로 짧은 제목을 넣은 2160 × 3840 JPG로 - 버전은 세 가지. 제목이 아래, 제목이 가운데, 프레임만 - 셋 다 채널 Shorts 탭의 카드 크기로, 2:3으로 잘라서 확인하고, 어떻게 다른지 알려 줘. 내가 하나 고를게

클로드 코드는 이미지를 읽을 수 있어서, 사람이 하듯 한 장에 늘어놓은 프레임을 보고 골라요. 프레임만으로는 알 수 없는 건 자막이 채워 줘요. 그 프레임이 찍힐 때 무슨 말을 하고 있었는지요.

3단계: 후보 프레임 뽑기

먼저 ffprobe로 봐요. heat.mp4는 1080 × 1920, 초당 25프레임이고, 36.4초에 909프레임이에요.

ffprobe -v error -show_entries stream=codec_name,width,height,r_frame_rate,nb_frames:format=duration -of compact=p=0 heat.mp4
codec_name=h264|width=1080|height=1920|r_frame_rate=25/1|nb_frames=909
codec_name=aac|r_frame_rate=0/0|nb_frames=1706
duration=36.400000

ffmpeg의 thumbnail 필터는 프레임을 묶음으로, 여기서는 50개씩 읽고, 묶음마다 색이 그 묶음 평균에 가장 가까운 프레임 하나를 남겨요. -fps_mode vfr은 프레임 수를 일정하게 맞추려고 같은 프레임을 반복하지 않고 남긴 것만 써요. 어떤 프레임을 남겼는지는 로그에 나와요.

mkdir framesffmpeg -hide_banner -i heat.mp4 -vf thumbnail=50 -fps_mode vfr frames/%02d.png 2> thumbs.loggrep selected thumbs.log | head -3
[Parsed_thumbnail_0 @ 0x7b0f0024c0] frame id #29 (pts_time=1.200000) selected from a set of 50 images
[Parsed_thumbnail_0 @ 0x7b0f0024c0] frame id #16 (pts_time=2.680000) selected from a set of 50 images
[Parsed_thumbnail_0 @ 0x7b0f0024c0] frame id #18 (pts_time=4.760000) selected from a set of 50 images

909프레임은 50개짜리 묶음 18개와 9개짜리 하나가 돼서, 대략 2초에 하나씩 19프레임이 나와요. 각각 1080 × 1920 PNG 원본 크기예요. 0.98초 걸렸어요. 평균에 가장 가깝다고 가장 좋은 건 아니에요. 다음 단계에서 보듯 19개 중 두 개는 눈을 감는 순간이 찍혔어요.

4단계: 한 장에 늘어놓기

로그에는 프레임마다 시간이 pts_time으로 적혀 있어요. grep으로 시간만 꺼내고, awk로 파일 이름과 같은 번호를 붙여요.

grep -o 'pts_time=[0-9.]*' thumbs.log | cut -d= -f2 | awk '{printf "%02d\t%.2f\n", NR, $1}' > times.tsvhead -3 times.tsv
01	1.20
02	2.68
03	4.76

그다음 ImageMagick의 montage가 19개를 이미지 한 장에 모으고, 각각에 번호와 시간을 달아요.

args=(); while IFS=$'\t' read -r n t; do args+=(-label "$n  ${t}s" "frames/$n.png"); done < times.tsvmagick montage "${args[@]}" -tile 7x -geometry 216x384+8+8 -pointsize 28 -background white sheet.png

첫 줄은 times.tsv로 인자를 만들어요. 프레임마다 -label 다음에 파일이 와요. -tile 7x는 한 줄에 일곱 개씩 놓고, -geometry 216x384+8+8은 프레임을 216 × 384로 줄이고 둘레에 8픽셀씩 여백을 둬요. 2.02초 걸렸어요.

세로 프레임 19개를 세 줄로 늘어놓고 각각 번호와 시간을 단 이미지예요. 1~10번과 17~19번은 흰색 #ShowYourStripes 티셔츠를 입은 해나 클로크의 클로즈업이고, 11~16번은 책장 앞 파란 안락의자에 앉은 해나 클로크의 와이드 숏이에요.
sheet.png예요. thumbnail 필터가 heat.mp4에서 남긴 19프레임에 번호와 시간을 달았어요.

5단계: 프레임 고르기

클로드 코드는 한 장씩 보면서 프레임을 걸러 냈어요.

  • 11~16번은 와이드 숏이에요. 얼굴이 화면에서 차지하는 부분이 작아서, 206픽셀짜리 카드에서는 표정을 알아보기 어려워요.
  • 03번과 05번은 눈을 감은 순간이고, 09번은 눈이 반쯤 감겨 있어요.
  • 02번은 웃는 얼굴이라, 폭염으로 사람들이 숨지는 이야기를 하는 쇼츠와 맞지 않아요.
  • 17~19번은 다른 카메라로 찍은 두 번째 클로즈업이고, 옆을 보고 있어요.

남은 것 중 18.92초의 10번은 눈을 뜨고 거의 카메라를 정면으로 보고 있고, 표정도 진지해요. 그때 무슨 말을 하는지는 자막에 나와요.

grep -A 6 '^00:18.560' heat.vtt
00:18.560 --> 00:23.480
inhospitable to live. So heat is
a giant killer. It's a silent

00:23.480 --> 00:27.320
killer as well. So it's not like
a roaring flood water coming

제목은 이 말에서 가져왔어요. A SILENT KILLER, 조용한 살인자요. 세 단어라 카드에서도 읽히는 크기로 한 줄에 들어가고, 썸네일을 위해 지어낸 말이 아니라 해나 클로크가 한 말이에요.

6단계: 세 가지 버전 만들기

명령어마다 10번 프레임에서 시작해 버전 하나를 만들어요.

magick frames/10.png -filter Lanczos -resize 2160x3840 \  -fill "rgba(0,0,0,0.8)" -draw "rectangle 0,2960 2160,3500" \  -font Anton-Regular.ttf -pointsize 330 -fill white -gravity center -annotate +0+1310 "A SILENT KILLER" \  -quality 92 a.jpgmagick frames/10.png -filter Lanczos -resize 2160x3840 \  -fill "rgba(0,0,0,0.8)" -draw "rectangle 0,1800 2160,2340" \  -font Anton-Regular.ttf -pointsize 330 -fill white -gravity center -annotate +0+150 "A SILENT KILLER" \  -quality 92 b.jpgmagick frames/10.png -filter Lanczos -resize 2160x3840 -quality 92 c.jpg

-filter Lanczos -resize 2160x3840은 1080 × 1920 프레임을 권장 크기로 두 배 키워요. 디테일이 늘지는 않지만, 제목은 그다음에 원래 크기로 그려서 글자 가장자리가 선명하게 남아요.

-draw는 80% 검정 띠를 가로 전체에 540픽셀 높이로 깔아요. a.jpg는 y 2960부터 3500까지, 셔츠의 #ShowYourStripes 아래이고, b.jpg는 1800부터 2340까지, 얼굴과 줄무늬 사이의 옷깃을 가로질러요. 티셔츠가 흰색이라 흰 글자 뒤에는 어두운 바탕이 있어야 해요.

-gravity center를 주면 -annotate가 이미지 가운데인 y 1920을 기준으로 제목을 놓아요. +0+1310은 제목의 가운데를 a.jpg 띠의 가운데인 3230에, +0+150은 b.jpg 띠의 가운데인 2070에 놓아요. 330포인트 Anton으로 쓴 A SILENT KILLER는 너비가 1,890픽셀이라 양쪽에 135픽셀씩 남아요. c.jpg는 프레임만 있는 버전이고, YouTube의 프레임 고르기에서 18.92초를 골랐을 때와 같은 그림이에요.

-quality 92는 JPG 압축 정도를 정해요. 셋 다 만드는 데 1.03초 걸렸고, identify로 픽셀 크기와 파일 크기를 봐요.

magick identify -format '%f %wx%h %b\n' a.jpg b.jpg c.jpg
a.jpg 2160x3840 755234B
b.jpg 2160x3840 738491B
c.jpg 2160x3840 769529B

셋 다 2160 × 3840이고 800KB 미만이라, 컴퓨터의 50MB 제한과 모바일의 2MB 제한 안에 들어요.

같은 해나 클로크 클로즈업으로 만든 세로 버전 세 개를 나란히 놓고, 각각 위아래 띠를 어둡게 처리했어요. 왼쪽 a.jpg는 화면 아래쪽, 어둡게 처리한 띠 바로 위의 검은 띠에 흰 글자로 A SILENT KILLER가 있어요. 가운데 b.jpg는 같은 제목이 옷깃을 가로지르는 띠에 있어요. 오른쪽 c.jpg는 제목 없는 프레임이에요.
a.jpg, b.jpg, c.jpg예요. 위아래로 어둡게 처리한 300픽셀이 채널 Shorts 탭의 카드에서 빠지는 부분이에요.

7단계: 카드 크기로 확인하기

썸네일은 2160 × 3840으로 만들지만 보이는 건 그보다 훨씬 작아요. 그래서 버전마다 가운데 2:3만 잘라서 카드 크기로 줄여 봐요.

for f in a b c; do  magick $f.jpg -gravity center -crop 2160x3240+0+0 +repage -resize 206x309 $f-card.pngdonemagick a-card.png -size 12x309 xc:white b-card.png -size 12x309 xc:white c-card.png +append cards.png

-gravity center -crop 2160x3240+0+0은 높이 가운데 3,240픽셀, 그러니까 카드에 보이는 y 300부터 3540까지를 남겨요. +repage는 잘라 낸 위치 정보를 지워서 다음 단계가 평범한 이미지로 받게 하고, -resize 206x309가 카드 크기로 줄여요. +append는 셋을 12픽셀 흰 간격을 두고 나란히 붙여요. 0.52초 걸렸어요.

세 버전을 2:3으로 잘라 작게 나란히 놓았어요. 왼쪽은 아래 가장자리 가까운 띠에 제목이 있고, 가운데는 제목이 한가운데를 가로질러요. 오른쪽은 제목 없이 얼굴과 #ShowYourStripes 티셔츠만 있어요. 셋 다 머리 윗부분이 잘려 있어요.
a.jpg, b.jpg, c.jpg를 2:3으로 잘라 카드 크기인 206 × 309로 줄였어요.

8단계: 비교하고 올리기

카드 크기에서도 제목이 있는 두 버전은 제목이 읽히고, 셋 다 머리 윗부분이 잘려요. 그 밖에는 글자가 어디 있는지가 달라요.

  • a.jpg: 제목이 얼굴보다 한참 아래에 있어서 손과 셔츠 아랫부분만 가려요. 띠가 원래 크기 기준으로 카드 아래 가장자리보다 40픽셀 위에서 끝나서, 조금만 더 좁게 잘려도 띠가 잘려요.
  • b.jpg: 제목이 가운데, 얼굴 가까이에 있고, 가운데를 남기는 자르기라면 어떤 것이든 남아요. Creator Insider의 3 × 2를 가운데를 가로지르는 넓은 띠로 보면 y 1200부터 2640까지 남는데, b.jpg의 제목은 그 안에 있고 a.jpg의 제목은 그렇지 않아요.
  • c.jpg: 제목이 없어요. 카드에 보이는 글자는 셔츠의 #ShowYourStripes뿐이라, 누가 말하는지는 보이지만 무슨 이야기인지는 보이지 않아요.

올리려면 컴퓨터의 YouTube 스튜디오에서 쇼츠를 열고, '썸네일' 아래에서 '파일 업로드'를 클릭해요. 휴대폰으로 쇼츠를 올렸다면 나중에 같은 방법으로 썸네일을 추가하면 돼요. 직접 만든 썸네일을 올릴 수 없다면 c.jpg가 바로 쓸 수 있는 버전이에요. YouTube 앱에서 18.92초의 프레임을 고르면 돼요.

막히는 지점

명령어는 다 합쳐 5초쯤 걸렸어요. 나머지는 판단이에요. 하는 말에 어떤 얼굴이 맞는지, 어떤 말을 어디에 넣을지, 그리고 그걸 이미지 너비의 10분의 1도 안 되는 카드에서 하나씩 확인하는 일이요. 쇼츠가 늘어나면, 그걸 고르고 하나하나 무엇을 바꿀지 말하는 게 일의 대부분이 돼요.

컷팩(Cutfac)은 바로 그 부분을 위해 저희가 만드는 Mac 앱이에요. 영상마다 클로드 코드나 Codex를 실행하고, 구간을 선택하거나 화면에 박스를 그려 고칠 점을 말하면 돼요. 버전은 나란히 놓고 비교해서 고를 수 있어요. 물론 이 가이드의 내용은 컷팩 없이도 전부 할 수 있어요.

함께 쓰면 좋은 무료 도구

출처

자주 묻는 질문