# 다중 트랙 지원

#### 1. 개요

FFmpeg는 다중 트랙을 지원하는 비디오, 오디오 파일을 처리할 수 있는 강력한 기능을 제공한다. 다중 트랙이란, 하나의 미디어 파일에 여러 개의 오디오, 비디오, 자막 트랙이 포함된 경우를 말한다. 예를 들어, 하나의 비디오 파일에 서로 다른 언어의 오디오 트랙이나 자막이 포함될 수 있다. 이러한 경우 FFmpeg를 통해 각각의 트랙을 선택, 병합, 제거하는 작업이 가능한다.

#### 2. 다중 트랙 선택

FFmpeg에서 특정 트랙을 선택하여 처리할 수 있다. 예를 들어, 두 개의 오디오 트랙이 있는 비디오 파일에서 특정 오디오 트랙만을 선택하려면 다음과 같은 명령어를 사용할 수 있다.

```bash
ffmpeg -i input.mp4 -map 0:v -map 0:a:1 -c copy output.mp4
```

위 명령어에서 `-map` 옵션을 사용하여 0번 비디오 트랙과 1번 오디오 트랙을 선택한 후 출력 파일에 복사(`-c copy`)한다.

**2.1 트랙 인덱스**

FFmpeg의 트랙 인덱스는 기본적으로 0부터 시작한다. `0:v`는 첫 번째 비디오 트랙을, `0:a:1`은 두 번째 오디오 트랙을 나타낸다. `0:s`는 자막 트랙을 나타내며, 마찬가지로 인덱스로 다중 자막 트랙을 선택할 수 있다.

$$
\mathbf{T}*{\text{selected}} = \begin{cases} \mathbf{V}*{0} & \text{비디오 트랙 0} \ \mathbf{A}\_{1} & \text{오디오 트랙 1} \end{cases}
$$

#### 3. 다중 트랙 병합

다중 트랙을 하나의 파일에 병합할 수도 있다. 예를 들어, 하나의 비디오 파일과 두 개의 오디오 트랙을 병합하는 경우 다음과 같은 명령어를 사용할 수 있다.

```bash
ffmpeg -i video.mp4 -i audio1.mp3 -i audio2.mp3 -map 0:v -map 1:a -map 2:a -c:v copy -c:a copy output.mp4
```

이 명령어는 `video.mp4` 파일과 두 개의 오디오 파일을 병합하여 각각의 트랙을 동일한 포맷으로 복사한다. 여기서 각 입력 파일의 트랙을 선택하여 `-map` 옵션을 사용해 병합한다.

**3.1 병합 시 트랙 매핑**

트랙 매핑 시 각 입력 파일의 트랙을 적절히 매핑하는 것이 중요하다. 이를 통해 출력 파일의 각 트랙을 명확히 지정할 수 있다.

#### 4. 다중 트랙 제거

다중 트랙 중 특정 트랙을 제거하고 싶을 때는 `-map` 옵션을 적절히 설정하여 원하는 트랙만 출력할 수 있다. 예를 들어, 오디오 트랙을 제거하고 비디오 트랙만 남기는 경우 다음과 같이 명령어를 작성할 수 있다.

```bash
ffmpeg -i input.mp4 -map 0:v -c copy output.mp4
```

위 명령어에서는 비디오 트랙만 선택하여 출력 파일에 저장하고, 오디오 트랙은 포함되지 않는다.

#### 5. 다중 트랙 재배열

여러 개의 트랙을 가진 파일에서 트랙의 순서를 변경하는 것도 가능한다. 트랙 순서를 변경하려면 `-map` 옵션을 적절하게 설정하여 트랙을 재배열할 수 있다.

예를 들어, 첫 번째 오디오 트랙과 두 번째 오디오 트랙의 순서를 변경하려면 다음과 같이 명령어를 작성할 수 있다.

```bash
ffmpeg -i input.mp4 -map 0:v -map 0:a:1 -map 0:a:0 -c copy output.mp4
```

이 명령어는 첫 번째 비디오 트랙과 두 번째 오디오 트랙, 그리고 첫 번째 오디오 트랙을 이 순서대로 출력 파일에 복사하여 저장한다.

**5.1 트랙 매핑의 원리**

트랙 매핑을 통해 입력 파일의 특정 트랙을 자유롭게 재배열할 수 있다. 다중 트랙의 처리에서는 입력 파일의 트랙 번호가 중요한 역할을 하며, 이 번호를 사용하여 각 트랙의 순서를 지정한다.

$$
\mathbf{T}*{\text{rearranged}} = \begin{cases} \mathbf{V}*{0}, & \text{첫 번째 비디오 트랙} \ \mathbf{A}*{1}, & \text{두 번째 오디오 트랙} \ \mathbf{A}*{0}, & \text{첫 번째 오디오 트랙} \end{cases}
$$

#### 6. 다중 자막 트랙 처리

비디오 파일에서 여러 개의 자막 트랙을 사용할 수 있으며, FFmpeg는 이러한 자막 트랙을 선택하거나 병합할 수 있다. 자막 파일을 추가하거나 삭제하는 방법도 있다.

**6.1 자막 트랙 추가**

다음 명령어를 사용하여 비디오 파일에 자막을 추가할 수 있다.

```bash
ffmpeg -i video.mp4 -i subtitle.srt -map 0:v -map 0:a -map 1:s -c:v copy -c:a copy -c:s mov_text output.mp4
```

이 명령어는 `video.mp4` 파일에 `subtitle.srt` 파일을 자막 트랙으로 추가한다. 자막 코덱은 `mov_text`를 사용하여 저장되며, 다른 포맷으로 변환이 필요하다면 해당 코덱을 지정할 수 있다.

**6.2 다중 자막 트랙 선택**

여러 개의 자막 트랙 중 하나를 선택하거나 두 개 이상의 자막 트랙을 모두 포함하려면 `-map` 옵션을 활용하여 트랙을 지정할 수 있다.

```bash
ffmpeg -i input.mp4 -map 0:v -map 0:a -map 0:s:1 -c copy output.mp4
```

위 명령어는 두 번째 자막 트랙만 선택하여 출력 파일에 포함한다.

#### 7. 다중 트랙에서 특정 트랙 추출

여러 개의 트랙이 포함된 파일에서 특정 트랙만을 추출할 수도 있다. 이를 통해 사용자는 필요에 따라 특정 오디오, 비디오, 자막 트랙을 별도로 저장할 수 있다.

**7.1 비디오 트랙만 추출**

비디오 트랙만을 추출하려면 다음 명령어를 사용할 수 있다.

```bash
ffmpeg -i input.mp4 -map 0:v -c copy video_only.mp4
```

이 명령어는 `input.mp4` 파일에서 비디오 트랙만을 추출하여 `video_only.mp4`로 저장한다.

**7.2 오디오 트랙만 추출**

오디오 트랙만 추출하려면 다음과 같이 명령어를 작성한다.

```bash
ffmpeg -i input.mp4 -map 0:a:0 -c copy audio_only.mp3
```

위 명령어는 첫 번째 오디오 트랙만 추출하여 `audio_only.mp3`로 저장한다. 이 경우 출력 파일 포맷에 따라 적절한 오디오 포맷을 지정해야 한다.

**7.3 자막 트랙만 추출**

자막 트랙을 추출하는 방법은 다음과 같다.

```bash
ffmpeg -i input.mp4 -map 0:s -c copy subtitle_only.srt
```

이 명령어는 `input.mp4` 파일에서 자막 트랙을 추출하여 SRT 포맷으로 저장한다.

#### 8. 다중 트랙에서 특정 트랙 제거

다중 트랙 파일에서 특정 트랙을 제거할 수도 있다. 예를 들어, 불필요한 오디오 트랙이나 자막 트랙을 삭제할 수 있다.

**8.1 오디오 트랙 제거**

불필요한 오디오 트랙을 제거하고 비디오 트랙만 남기려면 다음 명령어를 사용할 수 있다.

```bash
ffmpeg -i input.mp4 -map 0:v -c copy video_only.mp4
```

위 명령어는 오디오 트랙을 제거한 후 비디오 트랙만 포함된 파일로 저장한다.

**8.2 자막 트랙 제거**

자막 트랙을 제거하려면 아래와 같은 명령어를 사용할 수 있다.

```bash
ffmpeg -i input.mp4 -map 0:v -map 0:a -c copy no_subtitle.mp4
```

이 명령어는 비디오와 오디오 트랙만 포함한 파일을 생성하며, 자막 트랙은 제외된다.

#### 9. 다중 트랙 파일의 정보 확인

다중 트랙이 포함된 파일의 정보를 확인하려면 FFmpeg의 `ffprobe` 명령어를 사용할 수 있다. `ffprobe`는 파일의 각 트랙에 대한 정보를 제공하여 트랙 번호, 포맷, 코덱, 해상도 등의 세부 사항을 확인할 수 있다.

**9.1 ffprobe 사용 예시**

다음은 `ffprobe`를 사용하여 파일의 트랙 정보를 확인하는 방법이다.

```bash
ffprobe -i input.mp4
```

이 명령어는 `input.mp4` 파일에 대한 세부 정보를 출력하며, 각 트랙의 코덱 정보, 해상도, 프레임 레이트, 오디오 채널 수, 자막 언어 등을 보여준다.

**9.2 트랙 정보 출력 형식**

`ffprobe` 명령어로 얻을 수 있는 정보는 다음과 같은 형식으로 출력된다.

$$
\mathbf{Track\ Information} = \begin{pmatrix} \text{Stream\ #0:0} & \text{Video} & \text{h264} & \text{1920x1080} & \text{30 fps} \ \text{Stream\ #0:1} & \text{Audio} & \text{aac} & \text{Stereo} & \text{44.1 kHz} \ \text{Stream\ #0:2} & \text{Subtitle} & \text{srt} & \text{English} \end{pmatrix}
$$

#### 10. 다중 트랙 파일에서 특정 트랙에 메타데이터 추가

FFmpeg를 사용하여 다중 트랙 파일의 특정 트랙에 메타데이터를 추가할 수 있다. 메타데이터는 트랙 이름, 언어, 설명 등과 같은 추가 정보를 포함할 수 있다. 메타데이터를 추가하면 미디어 플레이어에서 해당 트랙에 대한 설명이나 언어가 표시된다.

**10.1 메타데이터 추가 예시**

특정 오디오 트랙에 메타데이터를 추가하려면 다음과 같이 명령어를 작성할 수 있다.

```bash
ffmpeg -i input.mp4 -map 0 -c copy -metadata:s:a:0 language=eng output.mp4
```

이 명령어는 첫 번째 오디오 트랙에 `language=eng` 메타데이터를 추가한다. 이를 통해 오디오 트랙의 언어를 영어로 지정할 수 있다.

**10.2 메타데이터의 구조**

FFmpeg에서는 `-metadata:s:TYPE:INDEX KEY=VALUE` 형식으로 메타데이터를 추가한다. `TYPE`은 트랙의 유형(예: `v` 비디오, `a` 오디오, `s` 자막 등)을 나타내며, `INDEX`는 트랙 인덱스 번호를 의미한다. `KEY`는 메타데이터 항목의 이름이고 `VALUE`는 그 항목의 값이다.

예를 들어, 특정 비디오 트랙에 제목을 추가하는 명령어는 다음과 같다.

```bash
ffmpeg -i input.mp4 -map 0 -c copy -metadata:s:v:0 title="Main Video" output.mp4
```

#### 11. 다중 트랙 파일에서 특정 트랙의 코덱 변경

다중 트랙 파일에서 특정 트랙의 코덱을 변경할 수 있다. 예를 들어, 비디오 트랙을 다른 코덱으로 변환하거나 오디오 트랙을 재인코딩할 수 있다.

**11.1 비디오 코덱 변경**

비디오 트랙의 코덱을 `h264`에서 `hevc`로 변경하는 예시 명령어는 다음과 같다.

```bash
ffmpeg -i input.mp4 -map 0:v -c:v hevc -map 0:a -c:a copy output.mp4
```

이 명령어는 비디오 트랙을 `hevc`로 변환하고, 오디오 트랙은 변경 없이 그대로 복사하여 출력한다.

**11.2 오디오 코덱 변경**

오디오 트랙의 코덱을 `aac`에서 `mp3`로 변경하는 명령어는 다음과 같다.

```bash
ffmpeg -i input.mp4 -map 0:v -c:v copy -map 0:a -c:a mp3 output.mp4
```

이 명령어는 비디오 트랙은 그대로 유지하고, 오디오 트랙만 `mp3` 코덱으로 변환하여 출력한다.

#### 12. 다중 트랙 파일의 동기화 문제 해결

다중 트랙을 처리할 때 오디오와 비디오 간의 동기화 문제가 발생할 수 있다. 이러한 문제는 파일을 병합하거나 트랙을 추가하는 동안 생길 수 있으며, FFmpeg의 다양한 옵션을 통해 동기화를 맞출 수 있다.

**12.1 타임스탬프 조정**

타임스탬프를 조정하여 동기화를 맞추기 위해서는 `itsoffset` 옵션을 사용할 수 있다. 예를 들어, 오디오 트랙을 2초 앞당기고 싶다면 다음 명령어를 사용할 수 있다.

```bash
ffmpeg -i video.mp4 -itsoffset 2 -i audio.mp3 -map 0:v -map 1:a -c:v copy -c:a copy output.mp4
```

이 명령어는 오디오 트랙을 2초 먼저 재생되도록 동기화하여 비디오와 일치시킨다.

**12.2 `async` 옵션을 사용한 자동 동기화**

FFmpeg의 `-async` 옵션을 사용하면 FFmpeg가 자동으로 오디오와 비디오의 동기화를 맞출 수 있다.

```bash
ffmpeg -i input.mp4 -async 1 output.mp4
```

이 명령어는 FFmpeg가 자동으로 타임스탬프를 조정하여 오디오와 비디오를 동기화한다.
