4.1 FFmpeg 명령 구조 - 입력, 필터, 출력, 옵션 위치
FFmpeg 명령의 입력·필터·출력 파이프라인, -ss 옵션 위치에 따른 차이, 스트림 자동 선택 규칙과 -map, -c copy의 한계를 실제 실행 결과로 설명합니다.
#기본 구조
FFmpeg 명령은 "입력 → (디코딩) → 필터 → (인코딩) → 출력"이라는 파이프라인을 한 줄로 쓴 것입니다.
ffmpeg [전역 옵션] [입력 옵션] -i 입력파일 [출력 옵션] 출력파일
옵션은 바로 뒤에 오는 파일에 적용됩니다. 이것이 FFmpeg를 이해하는 가장 중요한 규칙입니다.
# -ss 2 가 입력 앞에 있음 → 입력 파일에 적용 (입력 옵션)
ffmpeg -ss 2 -i in.mp4 -t 1 out.mp4
# -ss 2 가 입력 뒤에 있음 → 출력에 적용 (출력 옵션)
ffmpeg -i in.mp4 -ss 2 -t 1 out.mp4
| 구분 | 예 | 적용 대상 |
|---|---|---|
| 전역 옵션 | -y, -hide_banner, -v error |
명령 전체 |
| 입력 옵션 | -ss, -t, -f, -r (입력 앞) |
바로 뒤의 -i 파일 |
| 출력 옵션 | -c:v, -b:v, -vf, -map, -ss(입력 뒤) |
바로 뒤의 출력 파일 |
#-ss의 위치가 바꾸는 것
구간을 자를 때 가장 많이 쓰는 옵션이 -ss(시작 위치)와 -t(길이)입니다.
| 위치 | 동작 | 속도 | 정확도 |
|---|---|---|---|
입력 앞 (-ss 8 -i) |
키프레임으로 먼저 점프한 뒤 디코딩 | 빠름 | 최신 FFmpeg에서는 재인코딩할 때 프레임 정확 |
입력 뒤 (-i -ss 8) |
처음부터 디코딩하며 버림 | 느림(위치가 멀수록) | 정확 |
10초짜리 합성 영상에서 8초 지점을 1초 잘라 인코딩해 비교했습니다.
입력 앞 -ss : 0.13초
입력 뒤 -ss : 0.23초
짧은 영상이라 차이가 작지만, 1시간짜리 영상의 50분 지점을 자르면 입력 뒤 방식은 50분치를 모두 디코딩해야 하므로 크게 느려집니다. 재인코딩해서 자를 때는 입력 앞 -ss가 기본 선택입니다.
# 재인코딩으로 정확하게 3초 지점부터 2초 자르기
ffmpeg -ss 3 -i g50.mp4 -t 2 -c:v libx264 -pix_fmt yuv420p cut_re.mp4
결과 길이는 정확히 2.000000초였습니다.
#-c copy 컷의 한계
코덱을 그대로 복사(-c copy)하면 매우 빠르고 화질 손실이 없지만, 프레임 단위 정확도를 포기해야 합니다. P/B프레임은 앞의 I프레임이 있어야 디코딩되므로, 복사 방식으로는 키프레임에서만 자를 수 있기 때문입니다(2장 GOP 참고).
2초마다 키프레임이 있는 영상(-g 50, 25fps)에서 3초 지점부터 2초를 복사로 잘랐습니다.
ffmpeg -ss 3 -i g50.mp4 -t 2 -c copy cut_copy.mp4
재인코딩 컷 : 길이 2.000초
복사 컷 : 길이 2.080초, 52프레임, 앞쪽 패킷의 타임스탬프가 음수(-1.0초 등)
복사 컷은 3초 직전의 키프레임(2초)에서 데이터를 가져오고, 컷 지점보다 앞선 프레임을 음수 타임스탬프로 표시해 두었습니다. 플레이어에 따라 이 앞부분이 보이거나 안 보이고, 길이도 요청한 2초와 달라집니다. 정리하면 다음과 같습니다.
| 방식 | 정확도 | 속도 | 화질 | 쓰는 경우 |
|---|---|---|---|---|
| 재인코딩 컷 | 프레임 정확 | 느림 | 재압축 손실 | 정확한 구간이 필요할 때 |
-c copy 컷 |
키프레임 단위 | 매우 빠름 | 무손실 | 대략적인 분할, 아카이브 구간 추출 |
#스트림 자동 선택과 -map
FFmpeg는 -map을 쓰지 않으면 비디오 1개, 오디오 1개를 자동으로 고릅니다. 모노 오디오 8트랙이 든 MXF를 그냥 변환하면 어떻게 될까요?
ffmpeg -i mono8.mxf -c:v libx264 -c:a aac def.mp4
결과 스트림: video 1개 + audio 1개(모노) + data 1개(타임코드)
오디오 7개가 조용히 사라졌습니다. 오류도 경고도 없습니다. 모든 스트림을 가져오려면 -map 0을 씁니다.
ffmpeg -i mono8.mxf -map 0 -c:v libx264 -c:a aac all.mp4
# → video 1 + audio 8 + data 1
필요한 것만 고르려면 스트림 지정자를 씁니다.
| 지정자 | 의미 |
|---|---|
-map 0 |
입력 0의 모든 스트림 |
-map 0:v:0 |
입력 0의 첫 번째 비디오 |
-map 0:a:2 |
입력 0의 세 번째 오디오 |
-map 0:a? |
오디오가 있으면 매핑(없어도 오류 아님) |
-map -0:d |
데이터 스트림 제외 (-map 0과 함께 사용) |
#로그 수준
운영 스크립트에서는 로그를 통제해야 합니다.
| 옵션 | 효과 |
|---|---|
-hide_banner |
버전·빌드 정보 숨김 |
-v error |
오류만 출력 |
-nostats |
진행 상황 줄 숨김 |
-y / -n |
출력 파일 덮어쓰기 / 덮어쓰지 않고 중단 |
운영 환경에서는 -n(덮어쓰지 않기) 을 기본으로 하는 것이 안전합니다. 같은 이름의 결과 파일이 있으면 실수로 원본이나 이전 결과를 덮어쓰는 사고를 막아 줍니다.
#정리
- 옵션은 바로 뒤에 오는 파일에 적용되며,
-ss의 위치에 따라 속도와 동작이 달라집니다. - 재인코딩 컷은 프레임 정확,
-c copy컷은 키프레임 단위입니다. -map을 쓰지 않으면 오디오가 조용히 사라질 수 있으므로 방송 소재에는 항상 명시합니다.
#참고 자료
링크는 2026-10-28에 열람이 되는 것을 확인했습니다. 규격과 도구 문서는 개정될 수 있으므로 적용하기 전에 최신 판을 확인하세요.