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

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 옵션 | 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.pngSume 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에서 설명합니다.
출처
관련 글
개발자 카테고리의 다른 글
- FFmpeg height not divisible by 2 오류 원인과 해결
yuv420p 인코딩에 홀수 높이(또는 너비)가 들어갔다는 오류입니다. -2로 스케일하거나 trunc(ih/2)*2로 내림해 두 변을 짝수로 만드세요. Sume가 크기를 맞추는 방식도 다룹니다.
- FFmpeg로 오디오와 영상 합치기: -map, copy, -shortest
FFmpeg로 오디오와 영상을 합치려면 한 파일에서는 영상을, 다른 파일에서는 오디오를 매핑하고, 영상은 복사하고, -shortest로 길이를 맞추세요.
- FFmpeg 영상 자르기: 시간 지정과 재인코딩 여부
FFmpeg에서 영상을 자르려면 -i 앞의 -ss로 탐색하고 -t로 길이를 정하세요. -c copy를 쓰면 재인코딩을 건너뛰지만, 컷이 시작 지점 앞의 키프레임에서 시작합니다.
- HMAC과 디지털 서명의 차이: 웹훅에서 각각 무엇을 증명하나요?
HMAC은 송신자가 공유 시크릿을 가졌음을 증명합니다. 디지털 서명은 개인 키로 만들고 공개 키로 확인하며, 부인 방지까지 더합니다.
작성자 Sume