FFmpeg로 영상에서 프레임 추출하기: 한 장, 매초, 전체

FFmpeg로 프레임을 추출할 때 -frames:v 1은 이미지 한 장을, -r 1은 초당 한 장을 저장하고, 번호를 붙인 파일 패턴은 모든 프레임을 씁니다.

읽는 시간 5분Sume
전체 글

FFmpeg로 영상에서 프레임을 추출하려면 출력을 이미지 파일로 지정하세요. -frames:v 1은 프레임 하나를 쓰고 멈추고, -ss는 어느 지점에서 뽑을지 정하며, -r 1은 초당 프레임 하나를 쓰고, frame-%04d.png 같은 번호 패턴은 시퀀스 전체를 담습니다. FFmpeg 문서에 나오는 예시인 ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg 명령은 초당 프레임 하나를 추출해 각각 WxH 크기로 조정합니다.

FFmpeg 관련 내용은 ffmpeg, 필터, 포맷 문서에서, Sume 관련 내용은 영상 프레임 문서에서 가져왔으며, 모두 2026-09-28에 확인했습니다.

프레임 한 장만 추출하려면 어떻게 하나요?

프레임 하나를 쓰고 멈추게 하세요. 영상 시작 부분의 프레임이 필요한 것이 아니라면 먼저 탐색하세요.

  • -frames:v 1은 프레임 하나를 쓴 뒤 쓰기를 멈춥니다. FFmpeg의 이미지 먹서 문서는 영상 시작 부분에서 이미지 한 장을 만드는 예에 이 옵션을 씁니다.
  • -i 앞의 -ss는 입력을 탐색합니다. 이미지를 쓰려면 디코딩해야 하고, 기본값인 -accurate_seek 옵션이 켜져 있으면 FFmpeg가 가장 가까운 탐색 지점과 지정 위치 사이 구간을 디코딩한 뒤 버리므로, 요청한 시각의 프레임을 얻습니다.
  • -sseof -1은 끝나기 일 초 전으로 탐색하고, -update 1은 새 이미지가 나올 때마다 같은 파일을 덮어쓰므로 파일에는 결국 마지막 프레임이 남습니다. 영상의 마지막 프레임 추출하기는 같은 일을 Sume API로 합니다.
  • .png 같은 이미지 확장자를 쓰고 -f를 지정하지 않으면 FFmpeg가 image2 먹서를 자동으로 고릅니다.
# The first frame
ffmpeg -i input.mp4 -frames:v 1 first.png

# The frame at 5 seconds
ffmpeg -ss 5 -i input.mp4 -frames:v 1 frame.png

# The last frame
ffmpeg -sseof -1 -i input.mp4 -update 1 last.png

프레임을 매초 한 장씩, 또는 N번째 프레임마다 추출하려면 어떻게 하나요?

출력 레이트를 정하거나 필터로 프레임을 선택하세요. select를 쓸 때는 -fps_mode vfr을 더하세요. FFmpeg 문서에 따르면 이 모드는 프레임을 타임스탬프와 함께 그대로 통과시킵니다. cfr 모드에서는 일정한 레이트를 유지하려고 프레임을 복제하거나 버립니다.

ffmpeg, 필터, 포맷 문서 기준, 2026-09-28 확인.
얻을 것FFmpeg 옵션FFmpeg 문서의 설명
프레임 한 장-frames:v 1지정한 수만큼 프레임을 쓴 뒤 스트림 쓰기를 멈춤
초당 프레임 한 장-r 1 또는 -vf fps=1둘 다 일정한 출력 레이트에 맞추려고 프레임을 복제하거나 버림
100번째 프레임마다-vf select='not(mod(n\,100))'100프레임마다 한 장 선택
키프레임만-vf select='eq(pict_type\,I)'I-프레임만 선택
대표 프레임 한 장-vf thumbnail -frames:v 1프레임 묶음(기본 100장)마다 가장 대표적인 프레임을 고르므로, 이 명령은 첫 묶음에서 고른 프레임을 남김
모든 프레임-fps_mode passthrough각 프레임을 타임스탬프와 함께 디먹서에서 먹서로 그대로 전달
# One frame per second
ffmpeg -i input.mp4 -r 1 frame-%03d.jpeg

# Every 100th frame
ffmpeg -i input.mp4 -vf "select='not(mod(n\,100))'" -fps_mode vfr frame-%03d.png

모든 프레임을 이미지 시퀀스로 내보내려면 어떻게 하나요?

디코딩한 모든 프레임을 번호를 붙인 파일 패턴으로 그대로 넘기세요.

  • %05d는 각 번호를 다섯 자리로 채웁니다. -start_number를 지정하지 않으면 첫 파일은 1번입니다.
  • 실행하기 전에 이미지 수를 계산해 보세요. 저희 계산으로는 30 fps로 된 60초짜리 클립이면 이미지가 1,800장입니다.
  • PNG는 모든 픽셀을 그대로 보존하고, JPEG 파일은 더 작지만 손실 압축입니다. FFmpeg 문서의 예시처럼 -s WxH로 이미지 크기를 조정할 수 있습니다.
ffmpeg -i input.mp4 -fps_mode passthrough frame-%05d.png

Sume API로 프레임을 추출할 수 있나요?

네, 전체 시퀀스가 아니라 개별 스틸로는 가능합니다. POST /v1/video-frames는 최대 300초짜리 소스에서, at[]에 나열한 시각이나 최대 2인 fps로 샘플링한 시각의 내구성 스틸을 호출당 최대 24장 반환하며, 이 호출은 과금되지 않습니다. 모든 프레임을 내보내는 일은 여전히 FFmpeg의 몫입니다. 요청과 필드, 거부 사유는 Sume API로 영상에서 프레임을 추출하는 방법에서 다룹니다.

  • 이 API의 fps는 구간 중간(mid-bin)에서 샘플링합니다. fps: 1은 0.5초, 1.5초, … 지점에서 스틸을 뽑는 반면, FFmpeg의 -r 1은 영상의 초마다 프레임을 하나씩 씁니다.
  • video_url은 이전 Sume Job의 출력처럼 워크스페이스에 있는 media.sume.com 아티팩트나 에셋이어야 합니다. 이 규칙은 엔드포인트별로 받는 URL에서 설명합니다.

출처

관련 글

개발자 카테고리의 다른 글

개발자 글 전체 보기

작성자 Sume