FFmpeg에서 출력 파일의 포맷을 설정하는 것은 매우 중요한 작업이다. 다양한 미디어 파일을 처리하는 FFmpeg는 여러 포맷을 지원하며, 이를 정확히 설정함으로써 원하는 결과물을 얻을 수 있다.

1. 파일 포맷이란

파일 포맷(file format)은 미디어 파일의 구조를 정의하는 규격을 말한다. 비디오, 오디오, 자막 등의 데이터를 어떻게 저장하고 읽어올지 결정하는 역할을 한다. 예를 들어, .mp4, .avi, .mkv, .mp3 등이 흔히 사용되는 포맷이다.

2. FFmpeg에서 지원하는 주요 파일 포맷

FFmpeg은 다양한 파일 포맷을 지원한다. 그 중에서 가장 흔히 사용되는 포맷은 다음과 같다.

3. 출력 포맷 설정하기

FFmpeg에서 출력 파일의 포맷을 설정하는 방법은 매우 간단한다. 출력 파일의 확장자에 따라 자동으로 포맷이 설정되기도 하지만, 명시적으로 포맷을 설정하려면 -f 옵션을 사용한다.

예를 들어, MP4 포맷으로 변환하려면 다음과 같이 명령을 실행할 수 있다.

ffmpeg -i input.avi -f mp4 output.mp4

여기서 -f mp4는 출력 파일을 MP4 포맷으로 설정하는 부분이다. 만약 확장자와 다르게 포맷을 지정하고자 한다면 이 옵션이 필요하다.

4. 포맷 선택 기준

출력 포맷을 선택할 때 고려해야 할 주요 요소는 다음과 같다.

5. 포맷에 따른 코덱 자동 설정

FFmpeg에서 파일 포맷을 설정하면, 자동으로 그에 맞는 기본 코덱이 선택된다. 예를 들어, -f mp4로 설정하면 기본적으로 H.264 비디오 코덱과 AAC 오디오 코덱이 선택된다.

ffmpeg -i input.avi -f mp4 -vcodec libx264 -acodec aac output.mp4

이 명령은 명시적으로 비디오 코덱을 libx264로, 오디오 코덱을 aac로 설정하는 방법을 보여준다. 만약 자동 설정된 코덱을 변경하고 싶다면 이렇게 명시적으로 코덱을 지정해야 한다.

6. 컨테이너 포맷과 코덱의 차이

컨테이너 포맷(container format)과 코덱(codec)은 서로 다른 개념이다. 컨테이너 포맷은 파일의 구조를 정의하는 반면, 코덱은 데이터의 압축 및 인코딩 방법을 결정한다. 같은 컨테이너 포맷이라도 서로 다른 코덱을 사용할 수 있다.

예를 들어, MP4 파일은 H.264, H.265 등 다양한 비디오 코덱을 사용할 수 있으며, 오디오 코덱으로는 AAC, MP3 등이 가능한다. 다음 표는 일부 컨테이너 포맷과 지원되는 주요 코덱들을 나타낸다.

컨테이너 포맷 비디오 코덱 오디오 코덱
MP4 H.264, H.265, MPEG-4 AAC, MP3
MKV H.264, H.265, VP8, VP9 AAC, MP3, Opus
AVI H.264, MPEG-4 MP3, PCM
MOV H.264, ProRes AAC, ALAC

컨테이너 포맷에 적합한 코덱을 선택하지 않으면 파일이 제대로 재생되지 않을 수 있다. FFmpeg에서 이를 제어할 수 있는 옵션은 -vcodec(비디오 코덱), -acodec(오디오 코덱)이다.

7. 특정 포맷에 맞는 옵션

특정 포맷을 사용할 때는 그 포맷에 맞는 세부 옵션들을 설정해야 할 수 있다. 예를 들어, MKV 포맷에서는 자막 트랙을 추가하거나, MP4 포맷에서는 특정 스트림을 준비하는 등의 작업이 필요할 수 있다.

ffmpeg -i input.mp4 -f matroska -c:v copy -c:a copy -c:s mov_text output.mkv

이 명령은 자막을 포함한 MP4 파일을 MKV 포맷으로 변환하는 예시이다. 여기서 -c:v copy, -c:a copy는 비디오와 오디오 스트림을 그대로 복사하는 것을 의미하며, -c:s mov_text는 자막을 변환하는 방법을 지정한다.

ffmpeg -i input.mkv -f mp4 -c:v libx264 -movflags faststart output.mp4

-movflags faststart 옵션은 MP4 파일의 헤더를 파일의 시작 부분에 위치시키는 역할을 한다. 이 옵션은 스트리밍 환경에서 파일을 빠르게 시작할 수 있게 도와준다.

8. 멀티플렉싱(Muxing)과 디멀티플렉싱(Demuxing)

멀티플렉싱(muxing)은 여러 미디어 스트림(비디오, 오디오, 자막 등)을 하나의 파일에 결합하는 과정이다. 반대로 디멀티플렉싱(demuxing)은 이러한 스트림을 분리하는 작업이다. FFmpeg에서는 -f 옵션으로 파일 포맷을 설정하여 멀티플렉싱을 제어할 수 있다.

ffmpeg -i video.mp4 -i audio.mp3 -f mp4 output.mp4

이 명령은 video.mp4 파일의 비디오 스트림과 audio.mp3 파일의 오디오 스트림을 결합하여 output.mp4 파일을 생성하는 예시이다.

ffmpeg -i input.mp4 -vn -acodec copy output.aac

여기서 -vn 옵션은 비디오를 제외하고 오디오만 추출하는 옵션이다. 이 명령은 input.mp4 파일에서 오디오 스트림만 추출하여 output.aac 파일로 저장한다.

9. 커스텀 포맷 설정

FFmpeg은 기존에 정의된 포맷 외에도 사용자가 커스텀 포맷을 정의하여 사용할 수 있다. 이를 위해서는 각 스트림의 코덱을 명확히 설정하고, 포맷이 요구하는 세부 사항들을 맞춰야 한다.

예를 들어, 오디오 스트림을 특정 비트레이트로 인코딩하면서 특정 파일 포맷을 지정할 수 있다.

ffmpeg -i input.wav -f mp3 -b:a 192k output.mp3

이 명령에서 -b:a 192k는 오디오 스트림을 192kbps의 비트레이트로 설정하여 MP3 파일을 생성하는 방법을 보여준다.

10. 자막 스트림 처리

출력 파일에 자막 스트림을 추가하거나 변환하는 것도 FFmpeg에서 가능하며, 자막 파일을 별도로 인코딩하거나 비디오 파일에 직접 병합할 수 있다. FFmpeg는 여러 자막 포맷을 지원하며, 자막을 비디오와 함께 컨테이너에 포함시키거나, 비디오에 하드코딩할 수 있다.

ffmpeg -i input.mp4 -i subtitles.srt -c:v copy -c:a copy -c:s mov_text output.mp4

여기서 -c:s mov_text 옵션은 자막을 MP4 포맷에 맞는 텍스트 자막 포맷으로 변환하는 옵션이다.

ffmpeg -i input.mp4 -vf subtitles=subtitles.srt output.mp4

위 명령은 자막을 비디오 스트림에 직접 하드코딩하여 자막이 비디오의 일부로 변환되도록 설정한다. 자막이 하드코딩되면, 비디오 재생 중 자막을 끄거나 켜는 것이 불가능한다.

11. 스트리밍을 위한 포맷 설정

FFmpeg은 라이브 스트리밍을 위한 다양한 포맷도 지원한다. 스트리밍은 일반 파일 포맷과는 달리, 실시간으로 데이터를 전송하는 것이 중요하다. 흔히 사용되는 스트리밍 포맷으로는 RTMP, HTTP, HLS, MPEG-DASH 등이 있다.

ffmpeg -i input.mp4 -f flv rtmp://streaming-server/app/stream_key

이 명령은 RTMP 서버로 비디오를 실시간 전송하기 위해 사용된다. -f flv는 스트리밍용으로 사용되는 포맷 중 하나인 FLV 포맷을 설정하는 부분이다. FLV는 스트리밍에 적합한 포맷 중 하나로, RTMP 서버와 자주 사용된다.

ffmpeg -i input.mp4 -f mpegts http://localhost:8080

HTTP 스트리밍을 위해 FFmpeg에서는 mpegts 포맷을 사용할 수 있다. 이 명령은 로컬 서버에서 HTTP 스트리밍을 수행하는 예시이다.

12. 포맷별 특수 옵션

일부 포맷은 고유의 특수 옵션을 가지고 있으며, 이를 활용하면 보다 정교하게 출력 파일을 설정할 수 있다.

ffmpeg -i input.mp4 -f matroska -compression_level 6 output.mkv

여기서 압축 레벨은 0에서 9까지 설정할 수 있으며, 숫자가 클수록 더 높은 압축을 의미한다.

13. 포맷 자동 감지

FFmpeg은 입력 파일의 확장자나 내부 메타데이터를 분석하여 자동으로 파일 포맷을 감지할 수 있다. 그러나 때때로 이러한 자동 감지가 잘못될 수 있으며, 이 경우 명시적으로 포맷을 지정하는 것이 필요하다.

ffmpeg -i input.unknown -f mp4 output.mp4

여기서 input.unknown은 확장자가 없는 파일로, FFmpeg이 자동으로 파일 포맷을 감지할 수 없는 경우이다. 이때 -f mp4를 사용하여 FFmpeg에 포맷을 명시적으로 지정한다.