ffmpeg 명령어 하나로 10분 영상을 한 장의 이미지로 만들고, AI에게 검수시키기
요약
ffmpeg 명령어와 컨택트 시트를 활용하여 긴 영상을 여러 프레임 이미지로 압축한 뒤, 이를 멀티모달 AI에게 검수시키는 방법을 제시합니다. 이 방식을 통해 10분 분량의 영상에 대한 육안 검수를 단 몇 분 만에 효율적으로 수행할 수 있습니다.
핵심 포인트
- ffmpeg 명령어 하나로 영상을 컨택트 시트로 변환 가능
- 멀티모달 AI가 모든 프레임을 균등하게 분석하여 누락된 오류 발견
- 타일 위치를 역산하여 시간 정보를 정확히 제공할 수 있음

AI에게 영상을 대량 생산하게 시작했는데, 곧 벽에 부딪혔다. 바로 검수(検品) 문제였다. 10분짜리 영상 2편을 매번 처음부터 끝까지 보면 20분이 걸린다. 그렇다고 안 본다고 하면, '배경이 몇 분 동안 새까맣다' 같은, 기계적인 체크를 빠져나가는 외형적 사고(事故)가 출하될 수 있다.
결론부터 말하자면, ffmpeg의 컨택트 시트(contact sheet: 일정한 간격의 프레임을 타일 형태로 배열한 한 장의 이미지)를 만들고, 이를 멀티모달 AI에게 보여줌으로써, 10분짜리 영상에 대한 육안 검수 수준의 검수가 1~2분 만에 끝날 수 있게 되었다. 걸리는 것은 ffmpeg 명령어 실행 1회와 이미지 1장 분량의 추론(inference)뿐이다.
명령어는 이것만 있으면 된다
ffmpeg -i input.mp4 \
-vf "fps=1/5,scale=320:180,tile=8x16" \
-frames:v 1 sheet.png
fps=1/5
— 5초마다 1프레임 추출 -
scale=320:180
— 각 프레임을 축소한다 (1080p 그대로면 너무 커진다) -
tile=8x16
— 가로 8×세로 16 그리드에 채워 넣는다 (10분 영상 = 약 120프레임용. 6분이라면 8x10으로 충분하다) -
-frames:v 1
— 출력은 한 장만
내가 가진 8분 24초짜리 1080p 영상으로 시도했을 때, 처리는 약 8초가 걸렸고, 출력은 2560×2880px의 PNG 1장(3.6MB)이었다. 사람이 대충 봐도 이상한 점을 알아차릴 수 있고, AI에게 주면 모든 프레임을 균등하게 살펴본다.
단 하나 주의할 점이 있다. 영상 길이에 비해 타일 칸이 많으면, 남는 칸은 검은색으로 채워진다. 8분 24초(약 101프레임)를 8x16의 128칸에 넣으면, 아래쪽 3줄 정도가 새까맣게 되었다. 검은 화면 사고와 구별하기 어렵기 때문에, AI에게 전달할 때는 '후반부의 검은 칸은 여백'이라고 설명해 주는 것이 좋다.
타임스탬프는 타일 위치에서 역산한다
각 프레임에 시간을 찍어 넣고 싶지만, drawtext 필터는 libfreetype이 포함되어 빌드된 ffmpeg에만 있다. 내가 가진 Homebrew 버전(ffmpeg 8.1.1)에서는 ffmpeg -filters 목록에 drawtext가 보이지 않았다. 본인 환경에 있는지 확인하려면 ffmpeg -filters | grep drawtext로 확인할 수 있다.
하지만 실제로는 시간 기록이 필요하지 않았다. 타일은 왼쪽 상단부터 행 우선(row-major order)으로 배열되기 때문에, 위치에서 시간을 역산할 수 있다.
시간(초) = ((행-1) × 열수 + (열-1)) × 추출 간격
8열・5초 간격이라면, 3번째 줄의 4번째 칸은 ((3-1)×8+(4-1))×5 = 95초가 된다. AI에게 전달할 때도 '1칸=5초, 8열 행 우선'이라고 알려주면, 지적에 시간을 붙여서 돌려준다.
AI에게 전달하는 방법과 실제로 발견된 것들
컨택트 시트를 멀티모달 대응 AI(나는 Claude)에게 주고 이렇게 질문한다.
'8열・행 우선・1칸 5초의 컨택트 시트입니다. 배경이 단색/검은색으로 길게 이어지는 구간, 자막이나 테로프가 겹치거나 잘리는 부분, 앞뒤에서 부자연스럽게 변하는 부분을 대략적인 시간과 함께 지적해 주세요.'
내 경우의 10분 영상에서는 약 8할이 단색 배경으로 유지되는 설계 사고가 이것으로 발각되었다. 처음부터 끝까지 보는 것만으로는 '뭔가 심심한데' 하고 넘어갈 수 있는 것이, 120칸을 한 장에 압축하니 한눈에 보인다. 같은 초록색 칸이 화면의 대부분을 차지하고 있기 때문이다. 수정 후 같은 명령어로 다시 한 장을 만들면, before/after 비교도 할 수 있다.
5초 간격의 빈틈은 결정론적 체크로 메운다
이 방법의 약점은 명확하다. 5초 미만의 사고(순간적인 검은 프레임, 짧은 테로프 오타)는 칸 사이에 빠진다. 이곳은 샘플링(sampling)이 아니라 결정론적(deterministic) 체크로 찾아야 할 영역이다.
# 0.5초 이상의 검은 화면을 감지
ffmpeg -i input.mp4 -vf blackdetect=d=0.5 -f null - 2>&1 | grep black
우리 팀에서는 blackdetect(검은 화면)・freezedetect(프리즈)・실제 시간과 음성 타이밍의 대조를 결정론적 계층(deterministic layer), 컨택트 시트+AI를 육안 검수 계층(visual inspection layer)으로 나누고 있다. 결정론적 계층은 확실하지만 '정의할 수 있는 이상'만 포착할 수 있다. 육안 검수 계층은 '언어화하지 못했던 이상'을 잡을 수 있지만, 샘플링 간격의 거침을 허용한다. 둘 다 한 세트다.
내일 할 일이라면 이것
내가 가진 영상 1편에 위의 명령어를 한 번 실행해 보고, 나온 한 장을 AI에게 주면서 '이상한 점이 있으면 시간과 함께'라고 물어봐 주었으면 한다. 설정도 의존 라이브러리도 필요 없고, 5분 만에 끝난다. 본인 눈으로 처음부터 끝까지 보는 것은 그 후에 지적된 시간만 봐도 충분하다.
저는 현직 EM으로서, 1on1 및 팀 운영의 시스템화에 대해 글을 쓰고 있습니다. 1on1 관리용 Notion 템플릿을 무료로 공개합니다 → 사용해 보기. X: @anikuma_tech
토론
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기