FFmpeg 영상 자르기: 시간 지정과 재인코딩 여부
FFmpeg에서 영상을 자르려면 -i 앞의 -ss로 탐색하고 -t로 길이를 정하세요. -c copy를 쓰면 재인코딩을 건너뛰지만, 컷이 시작 지점 앞의 키프레임에서 시작합니다.

FFmpeg에서 영상을 자르려면 -i 앞에 -ss(시작 위치)를, 그 뒤에 -t(남길 길이)를 넣으세요. ffmpeg -ss 65 -i input.mp4 -t 30 output.mp4는 1:05부터 프레임 단위로 정확한 30초짜리 클립을 재인코딩해 만듭니다. 재인코딩 없이 자르려면 -c copy를 더하세요. 화질 손실은 없지만, 이때 클립은 1:05 앞의 키프레임에서 시작합니다.
아래 FFmpeg 동작은 ffmpeg 문서와 그 시간 길이 문법에서 인용했고, Sume 관련 내용은 영상 트림 문서를 바탕으로 하며, 모두 2026-09-28에 확인했습니다. Sume의 인코더 설정을 비롯해 현재 동작이라고 설명한 내용은 Sume의 코드에서 확인한 것입니다.
재인코딩 없이 영상을 자르려면 어떻게 하나요?
-c copy를 더하세요. 그러면 FFmpeg는 압축된 패킷을 그대로 복사합니다. FFmpeg 문서는 스트림 카피가 디코딩도 인코딩도 하지 않으므로("with no decoding or encoding") 화질 손실이 없다고("there is no quality loss") 설명합니다. 이 옵션을 빼면 ffmpeg가 모든 오디오, 영상, 자막 스트림을 트랜스코딩하므로("ffmpeg will transcode all audio, video, and subtitle streams"), 남기는 부분을 디코딩한 뒤 다시 인코딩합니다.
# Lossless: no re-encode; starts at the keyframe before 65 s
ffmpeg -ss 65 -i input.mp4 -t 30 -c copy output.mp4
# Frame-accurate: decodes and re-encodes the 30 s you keep
ffmpeg -ss 65 -i input.mp4 -t 30 output.mp4-c copy를 쓰면 왜 클립이 일찍 시작하나요?
-i 앞에 둔 -ss는 입력 파일 안에서 탐색하는데, FFmpeg 문서에 따르면 대부분의 포맷에서는 정확히 탐색할 수 없어 ffmpeg가 지정 위치 앞의 가장 가까운 탐색 지점으로 이동하기 때문입니다("in most formats it is not possible to seek exactly, so ffmpeg will seek to the closest seek point before position"). 트랜스코딩할 때는 -accurate_seek가 기본으로 켜져 있으므로, 그 지점과 시작 시간 사이의 프레임은 디코딩된 뒤 버려집니다("will be decoded and discarded"). 스트림 카피에서는 이 프레임이 보존되므로("will be preserved"), 클립은 시작 시간보다 앞선 키프레임에서 시작합니다.
스트림 카피는 키프레임에서 시작합니다. -copyinkf를 더하지 않으면 FFmpeg가 시작 부분의 키프레임이 아닌 프레임을 빼기 때문입니다. 그래서 무손실이면서 프레임 단위로 정확한 컷은 시작 시간이 키프레임에 걸릴 때만 가능합니다. 그렇지 않다면 둘 중 하나를 고르세요. 카피가 얼마나 일찍 시작될 수 있는지는 키프레임 간격에 달려 있으며, 키프레임 간격 설명에서 다룹니다.
시작·끝 시간이나 프레임 기준으로는 어떻게 자르나요?
-t는 길이를,-to는 위치를 받습니다. 둘은 함께 쓸 수 없으며,-t가 우선합니다.-i앞에 둔-to는 그 위치에서 입력 읽기를 멈추므로,ffmpeg -ss 65 -to 95 -i input.mp4 output.mp4는 1:05부터 1:35까지를 남깁니다.- FFmpeg의 시간 길이 문법에 따라, 시간은 초 단위 숫자(
65,23.189)나[HH:]MM:SS[.m](00:01:05) 형식으로 씁니다. -ss는 프레임 번호가 아니라 시간을 받습니다. 초당 F프레임에서 프레임 N은 N ÷ F를 쓰세요. 30 fps에서 프레임 1,950은 65초입니다(다른 프레임 레이트는 프레임을 초로 변환하기에서 다룹니다).-an을 출력 옵션으로 쓰면 오디오가 빠집니다.
FFmpeg 없이 같은 트림을 실행할 수 있나요?
앞서 실행한 Sume Job의 출력처럼 이미 워크스페이스에 있는 media.sume.com 파일이라면, Sume의 영상 트림이 두 가지 컷을 모두 서버에서 실행합니다. 명령어가 아니라 JSON을 보내며, vf, codec, crf 같은 필드는 ffmpeg_fields_rejected로 거부됩니다. 호출 방법 자체는 Sume API로 영상 트림, 필터, 오디오 분리하기에서 다룹니다.
- 기본값인
precision: "exact"는 프레임 단위로 정확한 재인코딩입니다. 현재 코드에서는 libx264(-preset veryfast -crf 18,yuv420p), 192 kbps AAC,+faststart로-ss <start> -i <input> -t <length>를 실행합니다. precision: "keyframe"은 스트림 카피입니다. 현재 코드에서는 같은 탐색에-c copy -avoid_negative_ts make_zero를 씁니다. 컷이 GOP 하나만큼 일찍 시작될 수 있으며, 결과는 실제 인포인트를actual_start_seconds로 알려 줍니다.
| FFmpeg | Sume 영상 트림 |
|---|---|
-i 앞의 -ss 65 | start: 65 |
-t 30 | duration: 30(0.2–900초) |
-i 앞의 -to 95 | end: 95. 소스를 넘으면 소스 끝으로 제한 |
-c copy 없음(재인코딩) | precision: "exact"(기본값) |
-c copy | precision: "keyframe" |
-an | audio: "drop" |
curl -X POST https://api.sume.com/v1/video-trim \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: clip-trim-001" \
-d '{
"video_url": "https://media.sume.com/artifacts/artf_demo/talk.mp4",
"start": 65,
"duration": 30,
"precision": "keyframe"
}'Sume 트림의 한도는 어떻게 되나요?
- 소스는 최대 1,800초, 컷 하나는 0.2초에서 900초까지입니다. 현재 코드에서는 300 MiB가 넘는 소스 파일이
source_too_large로 거부됩니다. output(width,height는 256에서 2160까지,fps는 24, 25, 30, 60 중 하나)은 출력 단계에서 크기나 프레임 레이트를 바꾸며,exact에서만 쓸 수 있습니다.- 트림 한 번은 Job 하나이며 요금은 Job당 $0.02이고, 기본적으로 5.5% 에이전트 수수료가 더해집니다.
출처
관련 글
개발자 카테고리의 다른 글
- HMAC과 디지털 서명의 차이: 웹훅에서 각각 무엇을 증명하나요?
HMAC은 송신자가 공유 시크릿을 가졌음을 증명합니다. 디지털 서명은 개인 키로 만들고 공개 키로 확인하며, 부인 방지까지 더합니다.
- AI 이미지 생성은 얼마나 걸리나요?
Sume에서는 대부분의 AI 이미지가 API가 요청을 열어 두는 30초 안에 완성됩니다. 무엇이 시간을 늘리는지, 느린 이미지와 멈춘 이미지를 어떻게 구분하는지 알아보세요.
- MCP 서버 테스트 방법: Inspector, Postman, curl
MCP 서버는 MCP Inspector로 테스트합니다. 연결하고, 로그인하거나 인증 헤더를 넣고, 도구 목록을 본 뒤 읽기 전용 도구를 호출하세요. Postman과 curl로도 됩니다.
- POST는 멱등한가요? 아니요, PUT과 DELETE는 멱등합니다
아니요, HTTP는 GET, HEAD, OPTIONS, TRACE, PUT, DELETE를 멱등하다고 정의하지만 POST와 PATCH는 아닙니다. 멱등성 키가 있으면 POST 재시도가 안전합니다.
작성자 Sume