홈 › 4장 FFmpeg 실전 변환

4.1 FFmpeg 명령 구조 - 입력, 필터, 출력, 옵션 위치

FFmpeg 명령의 입력·필터·출력 파이프라인, -ss 옵션 위치에 따른 차이, 스트림 자동 선택 규칙과 -map, -c copy의 한계를 실제 실행 결과로 설명합니다.

최종 수정 2026-10-28 · 읽는 시간 약 3분 · 운영 프리즘(Prism) · 편집 원칙

#기본 구조

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에 열람이 되는 것을 확인했습니다. 규격과 도구 문서는 개정될 수 있으므로 적용하기 전에 최신 판을 확인하세요.