FFmpeg 사용 가이드
webm 이미지 파일을 mp4 파일로 변경
$ffmpeg -i flutter-dbus.webm -vf "scale=534:776" -sws_flags lanczos+accurate_rnd -c:v libx264 -c:a aac flutter-dbus.mp4
1. FFmpeg, 무엇인가요?
FFmpeg의 역할과 기본 개념
FFmpeg는 미디어 처리 분야에서 독보적인 위치를 차지하는 범용 미디어 변환기입니다. 이 도구는 단순히 파일 형식을 바꾸는 것을 넘어, 방대한 종류의 입력 소스를 처리하고 이를 다양한 출력 형식으로 트랜스코딩하는 포괄적인 기능을 제공합니다. FFmpeg는 일반 파일, 파이프, 네트워크 스트림, 심지어 라이브 녹화/캡처 장치에 이르기까지 어떠한 형태의 입력이라도 읽어들일 수 있으며, 이를 필터링하고 수많은 출력 형식으로 변환할 수 있습니다.
FFmpeg 명령을 구성할 때, 입력 소스는 -i
옵션을 통해 명시적으로 지정됩니다. 반면, 출력 파일은 단순히 명령줄에 일반 URL 형태로 지정됩니다. FFmpeg는 명령줄에서 옵션으로 해석할 수 없는 모든 것을 출력 URL로 간주합니다.
각 입력 또는 출력은 본질적으로 여러 종류의 기본 스트림(예: 비디오, 오디오, 자막, 첨부 파일, 데이터)을 포함할 수 있습니다. 어떤 입력의 어떤 스트림이 어떤 출력으로 연결될지는 FFmpeg가 자동으로 선택하거나, 사용자가 -map
옵션을 사용하여 수동으로 정교하게 제어할 수 있습니다.
FFmpeg의 이러한 범용성은 단순히 지원하는 코덱이나 컨테이너 형식의 다양성에만 국한되지 않습니다. 이 도구의 진정한 강점은 그 기반에 깔린 모듈형 아키텍처에서 비롯됩니다. 파일, 네트워크 스트림, 라이브 장치 등 다양한 입력 소스를 유연하게 처리하고, 동시에 비디오, 오디오, 자막, 데이터 등 여러 스트림 유형을 독립적으로 조작할 수 있는 능력은 FFmpeg를 단순한 변환기를 넘어 복잡한 미디어 파이프라인을 단일 명령으로 구축할 수 있는 강력한 도구로 만듭니다. 이러한 설계는 사용자가 매우 다양한 미디어 처리 요구사항에 대응할 수 있도록 하는 근본적인 유연성을 제공합니다.
모든 FFmpeg 작업의 시작점은 입력 파일(또는 스트림)을 -i
옵션으로 지정하고, 그 결과물을 저장할 출력 URL을 명시하는 것입니다. 입력이 없으면 처리할 데이터가 존재하지 않고, 출력이 정의되지 않으면 결과물을 저장할 수 없습니다. 이는 사용자가 어떤 미디어를 변환하고 어떤 형태의 결과물을 원하는지를 명확히 정의하는 첫 단계이며, 모든 후속 옵션 적용의 전제 조건이 됩니다.
FFmpeg의 자동 스트림 선택 기능은 편리함을 제공하지만, 때로는 사용자가 의도하지 않은 결과로 이어질 수 있습니다. 예를 들어, 여러 오디오 트랙이 포함된 파일에서 FFmpeg는 채널 수가 가장 많은 트랙을 자동으로 선택할 수 있습니다. 이는 사용자가 원하는 언어의 오디오 트랙이 아닐 수 있습니다. 이러한 잠재적인 불일치를 피하고 원하는 스트림을 정확히 포함하거나 제외하려면, -map
옵션을 통한 수동 스트림 제어가 필수적입니다. 특히 여러 스트림이 복잡하게 얽힌 시나리오에서는 이 수동 제어 기능의 중요성이 더욱 부각됩니다.
명령어 구조 및 옵션 적용 원칙
FFmpeg 명령줄에서 옵션이 적용되는 방식은 매우 중요하며, 그 순서에 따라 결과가 달라질 수 있습니다. 일반적인 규칙은 옵션이 바로 다음에 오는 파일에 적용된다는 것입니다. 이러한 특성 때문에 동일한 옵션을 명령줄에 여러 번 지정할 수 있으며, 각 옵션은 그 다음에 오는 입력 또는 출력 파일에 개별적으로 적용됩니다.
그러나 verbosity level
과 같은 일부 전역 옵션은 이 규칙의 예외입니다. 이러한 전역 옵션은 명령줄의 가장 앞에 지정되어야 하며, 전체 FFmpeg 세션에 영향을 미칩니다.
명령어를 구성할 때 가장 중요한 원칙 중 하나는 입력 파일과 출력 파일을 혼합하지 않는 것입니다. 모든 입력 파일은 먼저 지정되어야 하며, 그 다음에 모든 출력 파일이 지정되어야 합니다. 마찬가지로, 서로 다른 파일에 속하는 옵션들을 혼합해서는 안 됩니다. 각 옵션은 오직 바로 다음에 오는 입력 또는 출력 파일에만 적용되며, 파일이 바뀔 때마다 옵션의 적용 컨텍스트는 재설정됩니다.
"옵션은 다음에 오는 파일에 적용된다"는 규칙은 FFmpeg의 모듈성을 보여주는 중요한 특성입니다. FFmpeg는 각 입력 또는 출력 파일을 독립적인 처리 컨텍스트로 간주하고, 해당 컨텍스트 내에서 옵션을 재설정합니다. 이러한 설계 덕분에 사용자는 단일 명령 내에서 여러 입력 파일과 여러 출력 파일에 대해 완전히 다른 인코딩, 필터링, 스트림 선택 규칙을 유연하게 적용할 수 있습니다. 이는 FFmpeg가 단일 명령으로도 매우 복잡하고 다양한 미디어 변환 작업을 처리할 수 있는 핵심적인 유연성을 제공합니다.
옵션 순서의 중요성과 파일별 재설정 규칙은 FFmpeg를 처음 사용하는 사용자들이 가장 흔히 겪는 오류의 원인이 되기도 합니다. 예를 들어, -c:v libx264
와 같은 코덱 옵션을 잘못된 위치에 두면, 입력 디코더에 적용되거나 의도하지 않은 출력 파일에 적용될 수 있습니다. 의도한 스트림에 올바른 옵션을 적용하려면 이 규칙을 정확히 이해하고 명령을 구성하는 것이 필수적입니다. 이 점은 사용자가 FFmpeg를 효과적으로 활용하기 위해 반드시 숙지해야 할 부분입니다.
간단한 변환 예제
FFmpeg의 기본적인 사용법을 이해하는 데 도움이 되는 몇 가지 간단한 변환 예제를 살펴보겠습니다. 이 예제들은 -i
, -b:v
, -r
과 같은 핵심 옵션의 역할을 명확히 보여줍니다.
-
기본 파일 형식 변환:
ffmpeg -i input.avi output.mp4 1
이 명령은 input.avi를 입력으로 받아 output.mp4로 변환합니다. FFmpeg는 자동으로 input.avi의 스트림을 디코딩하고 mp4 형식으로 재인코딩하여 output.mp4 파일을 생성합니다.
-
비디오 비트레이트 설정:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4 1
이 명령은 출력 파일 output.mp4의 비디오 비트레이트를 64 kbit/s로 설정합니다. -b:v는 비디오 스트림(v)의 비트레이트(b)를 지정하며, -bufsize는 버퍼 크기를 설정합니다. 이 버퍼 크기 설정은 스트리밍이나 특정 인코딩 프로파일에서 중요한 역할을 합니다.
-
출력 프레임 레이트 강제 설정:
ffmpeg -i input.avi -r 24 output.mp4 1
이 명령은 output.mp4 파일의 프레임 레이트를 초당 24프레임(fps)으로 강제 설정합니다. FFmpeg는 이 목표를 달성하기 위해 필요한 경우 프레임을 복제하거나 삭제하여 일정한 출력 프레임 레이트를 유지합니다.
-
입력/출력 프레임 레이트 강제 설정 (RAW 형식 전용):
ffmpeg -r 1 -i input.m2v -r 24 output.mp4 1
이 예제는 RAW 형식 파일에만 유효합니다. 첫 번째 -r 1은 입력 옵션으로, input.m2v가 1 fps라고 가정하도록 FFmpeg에 지시합니다. 이는 파일에 저장된 타임스탬프를 무시합니다. 두 번째 -r 24는 출력 옵션으로, 출력 파일의 프레임 레이트를 24 fps로 강제 설정합니다. RAW 입력 파일의 경우, -f format 옵션을 사용하여 입력 형식을 명시적으로 지정해야 할 수도 있습니다.
2. 스트림 선택 및 조작의 핵심: -map
옵션
FFmpeg의 강력함은 단순히 전체 파일을 변환하는 것을 넘어, 파일 내의 개별 스트림을 정교하게 제어할 수 있는 능력에서 나옵니다. 이러한 정교한 제어를 가능하게 하는 핵심 요소가 바로 스트림 지정자와 -map
옵션입니다.
스트림 지정자 이해하기
스트림 지정자는 비트레이트
나 코덱
과 같이 특정 스트림에만 적용되는 옵션에 대해, 어떤 스트림에 해당 옵션을 적용할지 정확히 지정하는 데 사용됩니다.
일반적으로 스트림 지정자는 옵션 이름 뒤에 콜론으로 구분하여 추가됩니다. 예를 들어, -codec:a:1 ac3
명령에서 a:1
은 스트림 지정자입니다. 이는 두 번째 오디오 스트림(오디오 스트림 중 인덱스 1)에 ac3
코덱을 선택하도록 지시합니다.
하나의 스트림 지정자가 여러 스트림과 일치할 수도 있습니다. 이 경우 해당 옵션은 일치하는 모든 스트림에 적용됩니다. 예를 들어, -b:a 128k
명령의 스트림 지정자 a
는 모든 오디오 스트림과 일치하므로, 모든 오디오 스트림에 128k 비트레이트를 적용합니다.-codec copy
또는 -codec: copy
)는 모든 스트림과 일치하며, 재인코딩 없이 모든 스트림을 복사하도록 지시합니다.
스트림 지정자의 존재는 FFmpeg가 단순히 파일을 변환하는 것이 아니라, 파일 내의 개별 구성 요소(스트림)를 독립적으로 인식하고 조작할 수 있는 능력을 가지고 있음을 명확히 보여줍니다. 이러한 능력은 사용자가 특정 오디오 트랙만 변경하거나, 특정 자막 스트림만 복사하는 등 매우 세밀한 작업을 수행할 수 있게 하여 미디어 처리의 유연성을 극대화합니다. 이는 FFmpeg가 단일 파일 변환을 넘어선 복합적인 미디어 조작 도구로서의 가치를 높이는 핵심적인 기반입니다.
명령어 작성 시 스트림 지정자를 명확하게 사용하면 복잡한 명령에서 어떤 옵션이 어떤 스트림에 적용되는지 쉽게 파악할 수 있어, 디버깅 및 명령 가독성이 크게 향상됩니다. 특히 여러 입력 파일과 여러 출력 스트림을 동시에 다루는 복잡한 시나리오에서 오류를 줄이고, 나중에 스크립트를 검토하거나 수정할 때 유지보수를 용이하게 하는 실용적인 이점을 제공합니다.
주요 스트림 지정자 유형
FFmpeg는 사용자가 원하는 스트림을 매우 정밀하게 타겟팅할 수 있도록 다양한 형태의 스트림 지정자를 제공합니다.
stream_index
: 해당 인덱스의 스트림과 일치합니다. 예를 들어,-threads:1 4
는 두 번째 스트림(인덱스 1)의 스레드 수를 4로 설정합니다. 스트림 번호는 0부터 시작하며,libavformat
이 감지한 순서를 따릅니다.1 stream_type[:additional_stream_specifier]
:stream_type
은v
또는V
(비디오),a
(오디오),s
(자막),d
(데이터),t
(첨부 파일) 중 하나입니다.v
는 모든 비디오 스트림과 일치하고,V
는 첨부된 사진, 비디오 썸네일 또는 커버 아트가 아닌 비디오 스트림만 일치합니다.additional_stream_specifier
가 사용되면, 해당 유형과 추가 지정자에 모두 일치하는 스트림을 선택합니다.1 g:group_specifier[:additional_stream_specifier]
:group_specifier
로 지정된 그룹 내의 스트림과 일치합니다.group_specifier
는group_index
또는#group_id
,i:group_id
형태를 가질 수 있습니다.1 p:program_id[:additional_stream_specifier]
:program_id
로 지정된 프로그램 내의 스트림과 일치합니다.1 #stream_id
또는i:stream_id
: 스트림 ID(예: MPEG-TS 컨테이너의 PID)로 스트림과 일치합니다.1 m:key[:value]
: 지정된value
를 가진 메타데이터 태그key
가 있는 스트림과 일치합니다.value
가 주어지지 않으면 해당 태그를 가진 모든 스트림과 일치합니다.1 disp:dispositions[:additional_stream_specifier]
: 지정된 disposition 플래그를 가진 스트림과 일치합니다.1 u
: 사용 가능한 구성(코덱이 정의되어 있고 비디오 해상도 또는 오디오 샘플 레이트와 같은 필수 정보가 존재하는)의 스트림과 일치합니다.1
이러한 다양한 지정자들은 사용자가 원하는 스트림을 매우 정밀하게 타겟팅할 수 있도록 합니다. 특히 stream_type
과 stream_index
는 가장 흔히 사용되는 형태이며, m:key
와 같은 고급 지정자는 특정 메타데이터를 기준으로 스트림을 선택할 때 유용합니다.
표 1: 주요 스트림 지정자 요약
지정자 형식 (Specifier Format) | 설명 (Description) | 예시 (Example) | 적용 범위 (Scope) |
stream_index | 해당 인덱스의 스트림 선택 (0-기반) | -map 0:1 (첫 번째 입력의 두 번째 스트림) | 입력/출력 |
stream_type | 특정 유형의 모든 스트림 선택 (v , a , s , d , t ) | -map 0:v (첫 번째 입력의 모든 비디오 스트림) | 입력/출력 |
stream_type:stream_index | 특정 유형 내의 인덱스 스트림 선택 | -map 0:a:0 (첫 번째 입력의 첫 번째 오디오 스트림) | 입력/출력 |
V | 첨부된 사진/썸네일이 아닌 비디오 스트림 | -map 0:V (첫 번째 입력의 순수 비디오 스트림) | 입력/출력 |
g:group_specifier | 특정 그룹 내의 스트림 선택 | -map 0:g:0 (첫 번째 입력의 첫 번째 그룹 스트림) | 입력/출력 |
p:program_id | 특정 프로그램 ID 내의 스트림 선택 | -map 0:p:123 (첫 번째 입력의 프로그램 123 스트림) | 입력/출력 |
#stream_id 또는 i:stream_id | 스트림 ID(PID)로 스트림 선택 | -map 0:#256 (첫 번째 입력의 PID 256 스트림) | 입력/출력 |
m:key[:value] | 메타데이터 태그 key 와 value 로 스트림 선택 | -map 0:m:language:eng (첫 번째 입력의 언어가 'eng'인 스트림) | 입력 (주로) |
disp:dispositions | 특정 disposition 플래그로 스트림 선택 | -map 0:disp:default (첫 번째 입력의 기본 disposition 스트림) | 입력/출력 |
u | 사용 가능한 구성의 스트림 선택 | -map 0:u (첫 번째 입력의 사용 가능한 구성 스트림) | 입력/출력 |
(빈 지정자) | 모든 스트림 선택 | -c copy (모든 스트림 복사) | 출력 |
단일 스트림 복사
FFmpeg에서 가장 간단한 파이프라인은 단일 스트림 복사(streamcopy)입니다. 이 과정은 입력 스트림의 패킷을 디코딩, 필터링 또는 인코딩 없이 그대로 복사하는 것을 의미합니다.
- 예시:
INPUT.mkv
에서 두 번째 스트림(인덱스 1)을OUTPUT.mp4
로 복사합니다.ffmpeg -i INPUT.mkv -map 0:1 -c copy OUTPUT.mp4
1 이 명령에서-i INPUT.mkv
는 입력 파일을 지정합니다.-map 0:1
은 첫 번째 입력 파일(인덱스 0)에서 두 번째 스트림(인덱스 1)을 선택합니다.-c copy
는 "copy" 인코더를 선택하여 재인코딩 없이 스트림을 복사하도록 지시합니다. 마지막으로OUTPUT.mp4
는 결과물을 저장할 출력 파일입니다.
스트림 복사는 스트림 수를 변경하거나, 컨테이너 형식을 변경하거나, 컨테이너 레벨 메타데이터를 수정하는 데 매우 유용합니다.
-c copy
옵션은 "매우 빠르고 품질 손실이 없다"는 명확한 이점을 제공하지만, "필터 적용 불가"라는 제약이 있습니다. 이는 FFmpeg 사용 시 성능과 기능성 사이의 핵심적인 트레이드오프를 보여줍니다. 사용자는 작업의 요구사항(빠른 속도와 원본 품질 보존 vs. 내용 변환 및 필터링)에 따라 이 옵션을 선택해야 합니다. 이는 작업 효율성과 최종 결과물의 품질 간의 균형점을 찾는 데 중요한 고려 사항이 됩니다.
여러 입력 스트림 병합
FFmpeg는 여러 입력 파일에서 스트림을 가져와 하나의 출력 파일로 결합하는 기능도 제공합니다.
- 예시:
INPUT0.mkv
의 첫 번째 스트림(인덱스 0)과INPUT1.aac
의 첫 번째 스트림(인덱스 0)을OUTPUT.mp4
로 복사합니다.ffmpeg -i INPUT0.mkv -i INPUT1.aac -map 0:0 -map 1:0 -c copy OUTPUT.mp4
1 이 명령은-i INPUT0.mkv
와-i INPUT1.aac
로 두 개의 입력 파일을 지정합니다.-map 0:0
은 첫 번째 입력 파일의 첫 번째 스트림을,-map 1:0
은 두 번째 입력 파일의 첫 번째 스트림을 선택합니다.-c copy
는 선택된 두 스트림 모두에 스트림 복사를 적용하여OUTPUT.mp4
에 병합합니다.
이 기능은 비디오 파일에 별도의 오디오 트랙을 추가하거나, 분리된 비디오 및 오디오 소스를 하나의 파일로 결합하는 등 다양한 멀티미디어 편집 시나리오에서 매우 유용하게 활용될 수 있습니다.
단일 입력에서 여러 출력 스트림 분리
하나의 입력 파일에서 여러 스트림을 추출하여 각각 다른 출력 파일로 저장하는 것도 가능합니다.
- 예시:
INPUT.mkv
의 첫 번째 스트림(인덱스 0)을OUTPUT0.mp4
로, 두 번째 스트림(인덱스 1)을OUTPUT1.mp4
로 복사합니다.ffmpeg -i INPUT.mkv -map 0:0 -c copy OUTPUT0.mp4 -map 0:1 -c copy OUTPUT1.mp4
1 여기서-i INPUT.mkv
는 입력 파일을 지정합니다.-map 0:0 -c copy OUTPUT0.mp4
는 입력 스트림 0을 선택하여OUTPUT0.mp4
로 복사합니다. 이어서-map 0:1 -c copy OUTPUT1.mp4
는 입력 스트림 1을 선택하여OUTPUT1.mp4
로 복사합니다.
이 예제에서 주목할 점은 각 출력 파일마다 별도의 -c copy
옵션이 필요하다는 것입니다. 이는 FFmpeg의 옵션 적용 원칙에 따라 비-전역 옵션이 바로 앞에 오는 파일에만 적용되기 때문입니다.
3. 필수 메인 옵션 상세 가이드
FFmpeg의 메인 옵션들은 기본적인 파일 처리 방식과 스트림 제어에 필수적인 기능들을 제공합니다. 이러한 옵션들을 이해하고 활용하는 것은 FFmpeg를 효과적으로 사용하는 데 중요합니다.
입출력 파일 형식 강제 지정 (-f
, -i
)
-f fmt (input/output)
: 이 옵션은 입력 또는 출력 파일 형식을 강제로 지정할 때 사용됩니다. FFmpeg는 대부분의 경우 입력 파일의 형식을 자동으로 감지하고, 출력 파일의 형식은 파일 확장자로부터 추정합니다. 따라서 일반적으로 이 옵션이 필수적이지는 않습니다.1 그러나 확장자가 없거나 불분명한 파일, 또는 특정 장치(예: 웹캠, 마이크)에서 직접 데이터를 읽어올 때 이 옵션은 매우 유용하게 활용됩니다. 예를 들어,-f video4linux2
는 리눅스 비디오 장치에서 입력을 받을 때 사용됩니다.-i url (input)
: 이 옵션은 입력 파일의 URL을 지정합니다. 모든 FFmpeg 명령은 처리할 소스를 지정하는 이-i
옵션으로부터 시작됩니다.1 파일 경로뿐만 아니라 네트워크 스트림(예:rtsp://server/stream
)이나 장치 경로(예:/dev/video0
)도url
로 지정될 수 있습니다.
덮어쓰기 제어 (-y
, -n
)
출력 파일이 이미 존재할 경우 FFmpeg의 동작을 제어하는 두 가지 중요한 전역 옵션입니다.
-y (global)
: 이 옵션을 사용하면 FFmpeg는 출력 파일이 이미 존재할 경우 사용자에게 확인을 묻지 않고 해당 파일을 자동으로 덮어씁니다.1 이는 스크립트나 자동화된 배치 작업에서 편리하지만, 중요한 데이터를 실수로 잃을 수 있는 위험이 있으므로 주의해서 사용해야 합니다.-n (global)
: 반대로, 이 옵션은 출력 파일이 이미 존재할 경우 파일을 덮어쓰지 않고 즉시 FFmpeg 프로세스를 종료시킵니다.1 데이터 손실을 방지하는 데 매우 유용하며, 특히 중요한 원본 파일이 있는 경우 안전한 작업 환경을 제공합니다. 그러나 자동화된 환경에서는 파일 존재 여부를 미리 확인하지 않으면 작업이 중단될 수 있습니다.
이 두 옵션은 스크립트나 자동화된 작업에서 파일 관리의 안정성을 높이는 데 필수적입니다. -y
는 편리함을 제공하지만 데이터 손실의 잠재적 위험을 수반하며, -n
은 안전성을 보장하지만 작업 중단을 초래할 수 있습니다. 사용자는 자신의 작업 환경과 데이터의 중요성에 따라 적절한 옵션을 선택해야 합니다.
재생 및 출력 시간 제어 (-t
, -to
, -ss
, -sseof
)
미디어 파일의 특정 구간만 처리하거나, 출력의 지속 시간을 제어하는 데 사용되는 옵션들입니다.
-t duration (input/output)
:- 입력 옵션으로 사용 시 (
-i
앞): 입력 파일에서 읽을 데이터의 총 지속 시간을duration
으로 제한합니다.1 예를 들어, 비디오의 처음 30초만 처리하고 싶을 때 유용합니다. - 출력 옵션으로 사용 시 (출력 URL 앞): 출력 파일의 지속 시간이
duration
에 도달하면 쓰기를 중지합니다.1 duration
은 시간 지속 시간 형식(예:HH:MM:SS.ms
또는초
)으로 지정되어야 합니다. 이 옵션은-to
와 상호 배타적이며,-t
가 우선권을 가집니다.1
- 입력 옵션으로 사용 시 (
-to position (input/output)
: 출력 쓰기 또는 입력 읽기를position
에서 중지합니다.1 position
은 시간 지속 시간 형식으로 지정되어야 합니다.-to
와-t
는 상호 배타적이며,-t
가 우선권을 가집니다.-ss position (input/output)
:- 입력 옵션으로 사용 시 (
-i
앞): 입력 파일의position
으로 탐색(seek)합니다.1 대부분의 미디어 형식에서 정확한 탐색은 어렵기 때문에, FFmpeg는position
이전의 가장 가까운 키프레임(탐색 지점)으로 이동합니다. 트랜스코딩 시-accurate_seek
옵션(기본값)이 활성화되어 있으면, 탐색 지점과position
사이의 불필요한 세그먼트는 디코딩되어 버려집니다. 그러나 스트림 복사 시 또는-noaccurate_seek
옵션을 사용할 경우, 이 추가 세그먼트는 보존됩니다.1 - 출력 옵션으로 사용 시 (출력 URL 앞): 타임스탬프가
position
에 도달할 때까지 입력을 디코딩하지만, 해당 데이터를 출력에 포함시키지 않고 버립니다.1 position
은 시간 지속 시간 형식으로 지정되어야 합니다.-ss
옵션이 입력 옵션으로 사용될 때,-accurate_seek
의 기본 활성화는 탐색의 정확성을 보장합니다. 그러나 이는 불필요한 디코딩 및 폐기 작업을 수반하여 성능 오버헤드를 발생시킬 수 있습니다. 반대로, 스트림 복사 시 또는-noaccurate_seek
옵션을 사용할 경우, 해당 세그먼트가 보존되어 처리 속도는 빨라지지만, 원하는 시작점보다 약간 일찍 시작될 수 있어 정확성이 떨어질 수 있습니다. 이처럼 사용자는 특정 작업에서 "정확한 시작점"과 "빠른 처리 속도" 중 무엇을 우선할 것인지 결정해야 합니다.
- 입력 옵션으로 사용 시 (
-sseof position (input)
:-ss
옵션과 유사하지만, "파일의 끝(EOF)"을 기준으로 탐색합니다.1 음수 값은 파일의 끝에서 앞쪽으로 이동하는 것을 의미하며,0
은 파일의 끝을 의미합니다. 예를 들어,-sseof -30
은 파일 끝에서 30초 전으로 탐색합니다.
인코더/디코더 선택 (-c
, -codec
, copy
)
FFmpeg의 핵심 기능인 트랜스코딩(Transcoding)을 제어하는 가장 중요한 옵션입니다.
-c[:stream_specifier] codec (input/output, per-stream)
또는-codec[:stream_specifier] codec (input/output, per-stream)
: 이 옵션은 하나 이상의 스트림에 대해 인코더(출력 파일 앞에 사용 시) 또는 디코더(입력 파일 앞에 사용 시)를 선택합니다.1 codec
은 사용할 디코더 또는 인코더의 이름(예:libx264
,aac
,mp3
)입니다.- 특별한 값인
copy
(출력 전용)는 해당 스트림을 재인코딩하지 않고 원본 그대로 복사하라는 의미입니다.1 이는 품질 손실 없이 빠른 처리를 가능하게 합니다.
- 예시:
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
1 이 명령은INPUT
파일의 모든 비디오 스트림을libx264
코덱으로 인코딩하고, 모든 오디오 스트림은copy
옵션을 사용하여 재인코딩 없이 원본 그대로 복사합니다.
각 스트림에 대해, 명령줄에서 마지막으로 일치하는 -c
옵션이 적용됩니다.copy
하고 나머지는 인코딩할 때 유연성을 제공합니다.
메타데이터 및 스트림 속성 설정 (-metadata
, -disposition
)
이 옵션들은 출력 파일의 메타데이터와 스트림 속성을 세밀하게 제어하여, 미디어 플레이어에서의 동작 방식이나 파일 정보 표시를 사용자 정의할 수 있도록 합니다.
-metadata[:metadata_specifier] key=value (output, per-metadata)
: 이 옵션은 출력 파일에 메타데이터 키/값 쌍을 설정합니다.1 선택적으로metadata_specifier
를 사용하여 스트림, 챕터 또는 프로그램에 메타데이터를 설정할 수 있습니다. 이 옵션은-map_metadata
로 이전에 설정된 메타데이터를 재정의하는 우선권을 가집니다. 또한, 빈 값을 사용하여 기존 메타데이터를 삭제할 수도 있습니다.- 예시 (제목 설정):
ffmpeg -i in.avi -metadata title="my title" out.flv
1 - 예시 (첫 번째 오디오 스트림 언어 설정):
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
1
- 예시 (제목 설정):
-disposition[:stream_specifier] value (output, per-stream)
: 이 옵션은 스트림의 disposition 플래그를 설정합니다.1 기본적으로 disposition 플래그는 입력 스트림에서 복사되지만, 복합 필터그래프에서 공급되는 출력 스트림에는 기본적으로 어떤 플래그도 설정되지 않습니다.value
는+
또는-
로 구분된 disposition 플래그 시퀀스입니다.+
는 주어진 disposition을 추가하고,-
는 제거합니다.0
으로 설정하면 모든 disposition 플래그를 지울 수 있습니다.- 예시 (두 번째 오디오 스트림을 기본값으로 설정):
ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv
1 - 예시 (두 번째 자막 스트림을 기본값으로, 첫 번째 자막 스트림의 기본값 제거):
ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv
1 - 예시 (내장 커버/썸네일 추가):
ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out
1 -metadata
와-disposition
옵션은 미디어 파일의 기술적 변환을 넘어, 최종 사용자 경험(UX)을 직접적으로 향상시키는 중요한 역할을 합니다. 예를 들어, 올바른 언어 메타데이터나 기본 트랙 설정은 사용자가 미디어 플레이어에서 콘텐츠를 더 쉽게 소비할 수 있도록 돕습니다. 내장된 썸네일은 파일 탐색기에서 시각적 정보를 제공하여 파일의 내용을 빠르게 파악할 수 있게 합니다. 이는 FFmpeg가 단순히 인코딩 도구가 아닌, 미디어 콘텐츠 관리 도구로서의 가치를 높이는 요소입니다.
4. 비디오 옵션: 영상 변환 및 제어
비디오 옵션은 FFmpeg를 사용하여 영상 스트림의 프레임 레이트, 크기, 화면 비율, 회전 등 다양한 시각적 특성을 제어하는 데 사용됩니다.
프레임 레이트 및 크기 조절 (-r
, -s
, -fpsmax
)
-r[:stream_specifier] fps (input/output, per-stream)
: 이 옵션은 프레임 레이트(fps
)를 설정합니다.fps
는 Hz 값, 분수 또는 약어(예:24
,30000/1001
,ntsc
)로 지정될 수 있습니다.1 - 입력 옵션으로 사용 시: 파일에 저장된 타임스탬프를 무시하고
fps
의 상수 프레임 레이트를 가정하여 새로운 타임스탬프를 생성합니다. 이는image2
나v4l2
와 같은 일부 입력 형식에서 사용되는-framerate
옵션과는 다릅니다. - 출력 옵션으로 사용 시:
- 비디오 인코딩: 지정된 상수 출력 프레임 레이트(
fps
)를 달성하기 위해 인코딩 직전에 프레임을 복제하거나 삭제합니다. - 비디오 스트림 복사:
fps
가 스트림의 실제 프레임 레이트임을 muxer에 알립니다. 이 경우 데이터가 삭제되거나 복제되지 않지만,fps
가 실제 패킷 타임스탬프에 의해 결정된 스트림 프레임 레이트와 일치하지 않으면 유효하지 않은 파일을 생성할 수 있습니다.setts
비트스트림 필터를 사용하여 타임스탬프를 조절할 수도 있습니다.
- 비디오 인코딩: 지정된 상수 출력 프레임 레이트(
- 입력 옵션으로 사용 시: 파일에 저장된 타임스탬프를 무시하고
-fpsmax[:stream_specifier] fps (output, per-stream)
: 이 옵션은 최대 프레임 레이트를 설정합니다.1 출력 프레임 레이트가 자동으로 설정되고 이 값보다 높을 경우, 이 옵션은 프레임 레이트를 지정된fps
로 제한합니다. 이는 배치 처리에서 입력 프레임 레이트가 잘못 감지되어 매우 높게 설정될 때 유용합니다.-r
옵션과 함께 설정할 수 없으며, 스트림 복사 중에는 무시됩니다.-s[:stream_specifier] size (input/output, per-stream)
: 이 옵션은 프레임 크기(wxh
형식, 예:1280x720
)를 설정합니다. 기본값은 소스 파일의 크기와 동일합니다.1 - 입력 옵션으로 사용 시: 일부 demuxer(예: RAW 비디오 또는 비디오 캡처 장치)가 인식하는
video_size
개인 옵션의 단축키로 사용됩니다. 이는 파일에 프레임 크기가 저장되어 있지 않거나 구성 가능한 경우에 유용합니다. - 출력 옵션으로 사용 시: 해당 출력 스트림의 필터그래프 끝에
scale
비디오 필터를 자동으로 삽입합니다. 필터그래프의 시작이나 다른 위치에scale
필터를 삽입하려면-filter:v
또는-vf
옵션을 사용하여scale
필터를 직접 명시하는 것이 좋습니다.
- 입력 옵션으로 사용 시: 일부 demuxer(예: RAW 비디오 또는 비디오 캡처 장치)가 인식하는
화면 비율 및 회전 (-aspect
, -display_rotation
, -display_hflip
, -display_vflip
, -autorotate
, -autoscale
)
-aspect[:stream_specifier] aspect (output, per-stream)
: 비디오 디스플레이 화면 비율을 설정합니다.1 aspect
는 부동 소수점 숫자 문자열(예:"1.3333"
) 또는num:den
형식의 문자열(예:"4:3"
,"16:9"
)로 지정될 수 있습니다.-vcodec copy
와 함께 사용될 경우, 컨테이너 레벨에 저장된 화면 비율에 영향을 미치지만, 인코딩된 프레임 내에 저장된 화면 비율에는 영향을 주지 않습니다.-display_rotation[:stream_specifier] rotation (input, per-stream)
: 비디오 회전 메타데이터를 설정합니다.1 rotation
은 비디오가 디스플레이되기 전에 시계 반대 방향으로 회전해야 하는 정도를 나타내는 십진수입니다. 이 옵션은 파일에 저장된 기존 회전/디스플레이 변환 메타데이터를 재정의합니다. 트랜스코딩 중이고-autorotate
가 활성화되어 있으면, 비디오는 필터링 단계에서 회전됩니다. 그렇지 않으면, muxer가 지원하는 경우 메타데이터가 출력 파일에 기록됩니다.-display_hflip
및/또는-display_vflip
옵션이 주어지면, 이 회전 후에 적용됩니다.-display_hflip[:stream_specifier] (input, per-stream)
: 디스플레이 시 이미지를 수평으로 뒤집을지 여부를 설정합니다.1 자세한 내용은-display_rotation
옵션 설명을 참조하십시오.-display_vflip[:stream_specifier] (input, per-stream)
: 디스플레이 시 이미지를 수직으로 뒤집을지 여부를 설정합니다.1 자세한 내용은-display_rotation
옵션 설명을 참조하십시오.-autorotate
: 파일 메타데이터에 따라 비디오를 자동으로 회전시킵니다.1 이 옵션은 기본적으로 활성화되어 있으며,-noautorotate
를 사용하여 비활성화할 수 있습니다.-autoscale
: 첫 번째 프레임의 해상도에 따라 비디오를 자동으로 스케일링합니다.1 이 옵션은 기본적으로 활성화되어 있으며,-noautoscale
을 사용하여 비활성화할 수 있습니다.-autoscale
을 비활성화하면 필터 그래프의 모든 출력 프레임이 동일한 해상도를 가지지 않을 수 있으며, 이는 일부 인코더/muxer에 부적합할 수 있습니다. 따라서 이 옵션은 사용자가 그 의미를 정확히 이해하지 않는 한 비활성화하지 않는 것이 좋습니다.
비디오 스트림 비활성화 및 코덱 설정 (-vn
, -vcodec
)
-vn (input/output)
:- 입력 옵션으로 사용 시: 파일의 모든 비디오 스트림이 필터링되거나, 어떤 출력에 대해서도 자동으로 선택되거나 맵핑되는 것을 차단합니다.
1 개별 스트림을 비활성화하려면-discard
옵션을 사용할 수 있습니다. - 출력 옵션으로 사용 시: 비디오 녹화를 비활성화합니다. 즉, 어떤 비디오 스트림도 자동으로 선택되거나 맵핑되지 않습니다.
1 완전한 수동 제어를 위해서는-map
옵션을 사용해야 합니다.
- 입력 옵션으로 사용 시: 파일의 모든 비디오 스트림이 필터링되거나, 어떤 출력에 대해서도 자동으로 선택되거나 맵핑되는 것을 차단합니다.
-vcodec codec (output)
: 비디오 코덱을 설정합니다.1 이 옵션은-codec:v
의 별칭입니다.
두-패스 인코딩 (-pass
, -passlogfile
)
두-패스(two-pass) 비디오 인코딩은 비디오 품질을 최적화하고 특정 비트레이트를 정확히 맞추는 데 사용됩니다.
-pass[:stream_specifier] n (output, per-stream)
: 패스 번호(1 또는 2)를 선택합니다.1 첫 번째 패스에서는 비디오 통계가 로그 파일에 기록되고(자세한 내용은-passlogfile
참조), 두 번째 패스에서는 이 로그 파일을 사용하여 정확히 요청된 비트레이트로 비디오를 생성합니다.- 패스 1 예시 (Windows 및 Unix):
- Windows:
ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
- Unix:
ffmpeg -i foo.mov -c:v libxxvid -pass 1 -an -f rawvideo -y /dev/null
패스 1에서는 오디오를 비활성화하고 출력을 null로 설정하여 통계만 기록할 수 있습니다.
- Windows:
- 패스 1 예시 (Windows 및 Unix):
-passlogfile[:stream_specifier] prefix (output, per-stream)
: 두-패스 로그 파일 이름 접두사를prefix
로 설정합니다.1 기본 파일 이름 접두사는 "ffmpeg2pass"입니다. 전체 파일 이름은PREFIX-N.log
형식이 되며,N
은 출력 스트림에 특정한 숫자입니다.
비디오 필터 적용 (-vf
)
-vf filtergraph (output)
:filtergraph
로 지정된 필터그래프를 생성하고 이를 사용하여 스트림을 필터링합니다.1 이 옵션은-filter:v
의 별칭입니다.filtergraph
는 스트림에 적용할 필터그래프의 설명을 나타내며, 단일 입력과 동일한 유형의 단일 출력을 가져야 합니다. 여러 입력 및/또는 출력을 가진 복잡한 필터그래프를 생성하려면-filter_complex
옵션을 사용해야 합니다.
5. 오디오 옵션: 음성 변환 및 제어
오디오 옵션은 FFmpeg를 사용하여 오디오 스트림의 샘플링 주파수, 채널 수, 품질 등 다양한 음성 특성을 제어하는 데 사용됩니다.
오디오 프레임 수, 샘플링 주파수, 채널 수 조절 (-aframes
, -ar
, -ac
)
-aframes number (output)
: 출력할 오디오 프레임 수를 설정합니다.1 이 옵션은-frames:a
의 오래된 별칭이며,-frames:a
를 사용하는 것이 권장됩니다.-ar[:stream_specifier] freq (input/output, per-stream)
: 오디오 샘플링 주파수(freq
)를 설정합니다.1 - 출력 스트림의 경우: 기본적으로 해당 입력 스트림의 주파수로 설정됩니다.
- 입력 스트림의 경우: 오디오 캡처 장치 및 RAW demuxer에만 의미가 있으며, 해당 demuxer 옵션에 매핑됩니다.
-ac[:stream_specifier] channels (input/output, per-stream)
: 오디오 채널 수(channels
)를 설정합니다.1 - 출력 스트림의 경우: 기본적으로 입력 오디오 채널 수로 설정됩니다.
- 입력 스트림의 경우: 오디오 캡처 장치 및 RAW demuxer에만 의미가 있으며, 해당 demuxer 옵션에 매핑됩니다.
오디오 품질 및 코덱 설정 (-aq
, -acodec
, -sample_fmt
)
-aq q (output)
: 오디오 품질을 설정합니다.1 이 값은 코덱에 따라 다르며, 가변 비트레이트(VBR)에 사용됩니다. 이 옵션은-q:a
의 별칭입니다.-acodec codec (input/output)
: 오디오 코덱을 설정합니다.1 이 옵션은-codec:a
의 별칭입니다.-sample_fmt[:stream_specifier] sample_fmt (output, per-stream)
: 오디오 샘플 형식을 설정합니다.1 지원되는 샘플 형식 목록을 보려면-sample_fmts
옵션을 사용하십시오.
오디오 스트림 비활성화 및 필터 적용 (-an
, -af
)
-an (input/output)
:- 입력 옵션으로 사용 시: 파일의 모든 오디오 스트림이 필터링되거나, 어떤 출력에 대해서도 자동으로 선택되거나 맵핑되는 것을 차단합니다.
1 개별 스트림을 비활성화하려면-discard
옵션을 사용할 수 있습니다. - 출력 옵션으로 사용 시: 오디오 녹화를 비활성화합니다. 즉, 어떤 오디오 스트림도 자동으로 선택되거나 맵핑되지 않습니다.
1 완전한 수동 제어를 위해서는-map
옵션을 사용해야 합니다.
- 입력 옵션으로 사용 시: 파일의 모든 오디오 스트림이 필터링되거나, 어떤 출력에 대해서도 자동으로 선택되거나 맵핑되는 것을 차단합니다.
-af filtergraph (output)
:filtergraph
로 지정된 필터그래프를 생성하고 이를 사용하여 스트림을 필터링합니다.1 이 옵션은-filter:a
의 별칭입니다.
6. 자막 옵션: 자막 처리
자막 옵션은 FFmpeg를 사용하여 자막 스트림을 제어하고 수정하는 데 사용됩니다.
자막 코덱 설정 및 스트림 비활성화 (-scodec
, -sn
)
-scodec codec (input/output)
: 자막 코덱을 설정합니다.1 이 옵션은-codec:s
의 별칭입니다.-sn (input/output)
:- 입력 옵션으로 사용 시: 파일의 모든 자막 스트림이 필터링되거나, 어떤 출력에 대해서도 자동으로 선택되거나 맵핑되는 것을 차단합니다.
1 개별 스트림을 비활성화하려면-discard
옵션을 사용할 수 있습니다. - 출력 옵션으로 사용 시: 자막 녹화를 비활성화합니다. 즉, 어떤 자막 스트림도 자동으로 선택되거나 맵핑되지 않습니다.
1 완전한 수동 제어를 위해서는-map
옵션을 사용해야 합니다.
- 입력 옵션으로 사용 시: 파일의 모든 자막 스트림이 필터링되거나, 어떤 출력에 대해서도 자동으로 선택되거나 맵핑되는 것을 차단합니다.
자막 지속 시간 수정 (-fix_sub_duration
, -canvas_size
)
-fix_sub_duration
: 자막 지속 시간을 수정합니다.1 각 자막에 대해 동일한 스트림의 다음 패킷을 기다린 후, 첫 번째 자막의 지속 시간을 조정하여 중첩을 방지합니다. 이는 DVB 자막과 같이 원본 패킷의 지속 시간이 대략적인 추정치이고 끝이 빈 자막 프레임으로 표시되는 일부 자막 코덱에 필수적입니다. 이 옵션을 사용하지 않으면 과장된 지속 시간이나 비단조로운 타임스탬프로 인한 muxing 실패가 발생할 수 있습니다. 이 옵션은 다음 자막 패킷이 디코딩될 때까지 모든 데이터의 출력을 지연시킬 수 있으므로, 메모리 소비와 지연 시간이 크게 증가할 수 있습니다.-canvas_size size
: 자막 렌더링에 사용되는 캔버스 크기를 설정합니다.
7. 고급 옵션: 복합 필터그래프 및 기타 기능
FFmpeg의 고급 옵션들은 기본적인 변환을 넘어, 복잡한 미디어 처리 파이프라인을 구축하고 세밀한 제어를 가능하게 합니다.
맵핑 옵션 (-map
)의 고급 활용
-map
옵션은 출력 파일에 하나 이상의 스트림을 생성하는 데 사용됩니다.
- 입력 파일에서 스트림 선택:
-i
로 지정된 입력 파일의input_file_id
(0-기반 인덱스)에서 스트림을 선택합니다.stream_specifier
가 제공되면, 해당 지정자와 일치하는 스트림만 사용됩니다.- 스트림 식별자 앞에
-
문자를 붙이면 "음수 맵핑"이 생성되어, 이미 생성된 맵핑에서 일치하는 스트림을 비활성화합니다. - 멀티뷰 비디오의 경우,
view_specifier
를 선택적으로 지정하여 사용할 뷰를 지정할 수 있습니다.view:view_id
(ID로 선택),vidx:view_idx
(인덱스로 선택),vpos:position
(디스플레이 위치로 선택) 형식을 가집니다. 트랜스코딩의 기본값은 기본 뷰(vidx:0
)이며, 스트림 복사 시에는 뷰 지정자가 지원되지 않고 모든 뷰가 복사됩니다.1 - 스트림 인덱스 뒤에
?
를 붙이면 맵핑이 선택 사항이 됩니다. 일치하는 스트림이 없으면 맵핑은 실패하는 대신 무시됩니다.
- 복합 필터그래프의 출력 맵핑:
[linklabel]
형식을 사용하여 복합 필터그래프(-filter_complex
로 지정)의 출력을 출력 파일에 맵핑합니다.linklabel
은 그래프 내에서 정의된 출력 링크 레이블과 일치해야 합니다.1
이 옵션은 여러 번 지정하여 출력 파일에 더 많은 스트림을 추가할 수 있습니다. 주어진 입력 스트림은 다른 인코딩 옵션 및/또는 필터를 사용하기 위해 여러 번 맵핑될 수도 있습니다. 스트림은 명령줄에 -map
옵션이 주어진 순서대로 출력에 생성됩니다. 이 옵션을 사용하면 해당 출력 파일에 대한 기본 맵핑이 비활성화됩니다.
- 예시 (모든 스트림 맵핑):
ffmpeg -i INPUT -map 0 output
(첫 번째 입력 파일의 모든 스트림을 출력으로 맵핑)1 - 예시 (특정 스트림 선택):
ffmpeg -i INPUT -map 0:1 out.wav
(INPUT의 두 번째 입력 스트림을 out.wav의 단일 출력 스트림으로 맵핑)1 - 예시 (여러 스트림 생성):
ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov
(a.mov의 스트림 2와 b.mov의 스트림 6을 out.mov로 복사)1 - 예시 (음수 맵핑):
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
(두 번째 오디오를 제외한 모든 스트림 맵핑)1 - 예시 (선택적 맵핑):
ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT
(첫 번째 입력의 비디오 및 오디오 스트림 맵핑, 오디오 스트림이 없으면 오디오 맵핑 무시)1 - 예시 (언어로 맵핑):
ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
(영어 오디오 스트림 선택)1
비트스트림 필터 적용 (-bsf
)
-bsf[:stream_specifier] bitstream_filters (input/output, per-stream)
: 이 옵션은 일치하는 스트림에 비트스트림 필터를 적용합니다.1 필터는 demuxer로부터 패킷을 받을 때(입력 옵션으로 사용 시) 또는 muxer로 보내기 전에(출력 옵션으로 사용 시) 각 패킷에 적용됩니다.bitstream_filters
는filter[=optname0=optval0:optname1=optval1:...]
형식의 쉼표로 구분된 비트스트림 필터 사양 목록입니다. 옵션 값에 포함될 수 있는,=:
문자는 백슬래시로 이스케이프해야 합니다. 사용 가능한 비트스트림 필터 목록은-bsfs
옵션을 통해 확인할 수 있습니다.1 - 예시:
ffmpeg -bsf:v h264_mp4toannexb -i h264.mp4 -c:v copy -an out.h264
1 이 명령은h264_mp4toannexb
비트스트림 필터(MP4 캡슐화된 H.264 스트림을 Annex B로 변환)를 입력 비디오 스트림에 적용합니다.
복합 필터그래프 (-filter_complex
, -lavfi
)
-filter_complex filtergraph (global)
: 이 옵션은 임의의 수의 입력 및/또는 출력을 가질 수 있는 복합 필터그래프를 정의합니다.1 단일 입력과 동일한 유형의 단일 출력을 가진 간단한 그래프의 경우-filter
옵션을 사용해야 합니다.filtergraph
는 필터그래프 구문을 설명하는 문자열입니다. 이 옵션은 여러 번 지정될 수 있으며, 각 사용은 새로운 복합 필터그래프를 생성합니다. 복합 필터그래프의 입력은 다양한 소스 유형에서 올 수 있으며, 해당하는 링크 레이블의 형식으로 구분됩니다:- 입력 스트림 연결:
[file_index:stream_specifier]
(-map
과 동일한 구문).1 - 루프백 디코더 연결:
[dec:dec_idx]
.1 - 다른 복합 필터그래프의 출력 연결: 해당 링크 레이블을 사용합니다.
1 레이블이 없는 입력은 일치하는 유형의 첫 번째 사용되지 않는 입력 스트림에 연결됩니다. 출력 링크 레이블은-map
으로 참조됩니다. 레이블이 없는 출력은 첫 번째 출력 파일에 추가됩니다. 이 옵션을 사용하면 일반 입력 파일 없이lavfi
소스만 사용하는 것도 가능합니다.1
- 입력 스트림 연결:
- 예시 (이미지 오버레이):
ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map '[out]' out.mkv
1 여기서[0:v]
는 첫 번째 입력 파일의 첫 번째 비디오 스트림을,[1:v]
는 두 번째 입력 파일의 첫 번째 비디오 스트림을 참조하여overlay
필터의 입력으로 연결합니다. - 예시 (순수 빨간색 비디오 생성):
ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
1 이 명령은lavfi
의color
소스를 사용하여 5초 동안 순수 빨간색 비디오를 생성합니다. -lavfi filtergraph (global)
: 이 옵션은-filter_complex
와 동일하며, 임의의 수의 입력 및/또는 출력을 가진 복합 필터그래프를 정의합니다.1
정확한 탐색 및 타임스탬프 제어 (-accurate_seek
, -seek_timestamp
, -copyts
, -start_at_zero
)
-accurate_seek (input)
: 이 옵션은-ss
옵션을 사용하여 입력 파일에서 정확한 탐색을 활성화하거나 비활성화합니다.1 기본적으로 활성화되어 있어 트랜스코딩 시 탐색이 정확합니다.-noaccurate_seek
를 사용하여 비활성화할 수 있으며, 이는 일부 스트림을 복사하고 다른 스트림을 트랜스코딩할 때 유용할 수 있습니다.-seek_timestamp (input)
: 이 옵션은-ss
옵션을 사용하여 입력 파일에서 타임스탬프 기준으로 탐색을 활성화하거나 비활성화합니다.1 기본적으로 비활성화되어 있습니다. 활성화되면-ss
옵션의 인수는 실제 타임스탬프로 간주되며, 파일의 시작 시간 오프셋에 의해 상쇄되지 않습니다. 이는 전송 스트림과 같이 타임스탬프 0부터 시작하지 않는 파일에만 중요합니다.-copyts
: 입력 타임스탬프를 처리하지 않고, 초기 시작 시간 오프셋 값을 제거하지 않고 그 값을 유지합니다.1 vsync
옵션이나 특정 muxer 처리(예:avoid_negative_ts
옵션이 활성화된 경우)에 따라 출력 타임스탬프가 이 옵션이 선택된 경우에도 입력 타임스탬프와 일치하지 않을 수 있습니다.-start_at_zero
:copyts
와 함께 사용될 때, 입력 타임스탬프를 0부터 시작하도록 이동시킵니다.1 예를 들어,-ss 50
을 사용하면 입력 파일의 시작 타임스탬프와 관계없이 출력 타임스탬프가 50초부터 시작됩니다.
하드웨어 가속 (-hwaccel
, -hwaccel_device
, -init_hw_device
)
하드웨어 가속은 특정 작업을 CPU 대신 GPU와 같은 전용 하드웨어에서 처리하여 성능을 향상시키는 기술입니다.
-hwaccel[:stream_specifier] hwaccel (input, per-stream)
: 일치하는 스트림을 디코딩하는 데 하드웨어 가속을 사용하도록 지시합니다.1 hwaccel
에 허용되는 값은none
(기본값),auto
,vdpau
,dxva2
,d3d11va
,vaapi
,qsv
,videotoolbox
등입니다. 대부분의 가속 방법은 재생을 위한 것이며, 최신 CPU의 소프트웨어 디코딩보다 빠르지 않을 수 있습니다. 또한, FFmpeg는 디코딩된 프레임을 GPU 메모리에서 시스템 메모리로 복사해야 하는 경우가 많아 추가적인 성능 손실이 발생할 수 있습니다. 따라서 이 옵션은 주로 테스트 목적으로 유용합니다.1 qsv
(Intel QuickSync Video): 다른 값들과 달리, 이 옵션은 가속 디코딩을 활성화하는 것이 아니라(QSV 디코더가 선택되면 자동으로 사용됨), 프레임을 시스템 메모리로 복사하지 않고 가속 트랜스코딩을 가능하게 합니다. 이를 위해서는 디코더와 인코더 모두 QSV 가속을 지원해야 하며, 필터가 사용되지 않아야 합니다.
-hwaccel_device[:stream_specifier] hwaccel_device (input, per-stream)
: 하드웨어 가속에 사용할 장치를 선택합니다.1 이 옵션은-hwaccel
옵션이 지정된 경우에만 의미가 있습니다. 이름으로 기존 장치를 참조하거나,-init_hw_device type:hwaccel_device
가 바로 이전에 호출된 것처럼 새 장치를 생성할 수 있습니다.-init_hw_device type[=name][:device[,key=value...]]
:type
유형의 새 하드웨어 장치를name
이라는 이름으로 초기화하고, 주어진 장치 매개변수를 사용합니다.1 name
이 지정되지 않으면 "type%d" 형식의 기본 이름을 받습니다.device
및 다음 인수의 의미는 장치 유형에 따라 다릅니다 (예:cuda
,dxva2
,d3d11va
,vaapi
,vdpau
,qsv
,opencl
,vulkan
).- 예시 (CUDA 장치 초기화):
ffmpeg -init_hw_device cuda:1
(시스템의 두 번째 CUDA 장치 선택)1 - 예시 (VAAPI 장치 초기화):
ffmpeg -init_hw_device vaapi:/dev/dri/renderD129
(/dev/dri/renderD129
에 VAAPI 장치 생성)1 - 예시 (QSV를 사용한 하드웨어 가속 트랜스코딩):
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv output.mp4
(QSV를 사용하여 H.264 비디오를 하드웨어 가속으로 인코딩)
결론
FFmpeg는 단순한 미디어 변환기를 넘어, 매우 강력하고 유연한 미디어 처리 도구입니다. 이 보고서에서 살펴본 바와 같이, FFmpeg는 다양한 입력 소스를 처리하고, 개별 스트림을 정교하게 제어하며, 복잡한 변환 및 필터링 작업을 수행할 수 있는 광범위한 옵션을 제공합니다.
FFmpeg의 핵심적인 강점은 그 모듈형 아키텍처와 스트림 기반 처리 능력에 있습니다. 이는 사용자가 단일 명령으로도 여러 입력에서 스트림을 병합하거나, 하나의 입력에서 여러 출력 스트림을 분리하는 등 복잡한 시나리오를 구현할 수 있도록 합니다. 특히 -map
옵션과 다양한 스트림 지정자는 이러한 정교한 제어의 중심에 있으며, 사용자가 원하는 비디오, 오디오, 자막 스트림을 정확히 타겟팅하여 변환하거나 복사할 수 있게 합니다.
옵션이 명령줄에서 다음에 오는 파일에 적용되는 방식과 같은 FFmpeg의 특정 규칙을 이해하는 것은 매우 중요합니다. 이러한 규칙을 숙지하면 예상치 못한 결과를 피하고, 명령의 가독성과 유지보수성을 높일 수 있습니다. 또한, -c copy
와 같은 옵션을 통해 성능과 품질 보존이라는 이점을 얻는 동시에, 필터링과 같은 고급 기능이 제한될 수 있다는 점을 인지하는 것이 중요합니다. 이는 작업의 요구사항에 따라 적절한 옵션을 선택하는 데 필요한 판단 기준을 제공합니다.
메타데이터 및 스트림 속성을 제어하는 -metadata
및 -disposition
과 같은 옵션은 기술적인 변환을 넘어 최종 사용자 경험을 향상시키는 데 기여합니다. 올바른 메타데이터는 미디어 플레이어에서의 콘텐츠 인식 및 재생을 최적화하며, 이는 FFmpeg가 단순한 인코딩 도구가 아닌 포괄적인 미디어 관리 도구로서의 가치를 높이는 요소입니다.
이 보고서에서 제시된 다양한 예제들은 FFmpeg의 실용적인 활용 가능성을 보여줍니다. 비디오 및 오디오 캡처, X11 화면 녹화, 다양한 파일 형식 변환, 이미지 추출 및 비디오 생성, 심지어 두-패스 인코딩과 하드웨어 가속에 이르기까지, FFmpeg는 거의 모든 미디어 처리 요구사항에 대응할 수 있는 도구입니다.
FFmpeg의 잠재력을 최대한 활용하려면, 제시된 예제들을 직접 실행해보고 각 옵션이 결과에 미치는 영향을 실험해보는 것이 가장 효과적인 학습 방법입니다. 특정 필터나 코덱에 대한 더 깊은 정보가 필요할 경우, FFmpeg 공식 문서를 참조하는 것이 좋습니다. 꾸준한 실습을 통해 FFmpeg는 미디어 처리 작업을 자동화하고 최적화하는 데 필수적인 도구가 될 것입니다.
0 댓글