# 다중 파일 변환

다중 파일 변환은 FFMPEG를 사용하여 여러 개의 입력 파일을 한 번에 처리하거나, 여러 출력 파일을 동시에 생성하는 작업을 의미한다. 이 기능은 여러 파일을 개별적으로 처리하는 것보다 효율성을 높이며, 배치 처리나 파일 병합과 같은 작업에서 매우 유용하다.

#### 기본 명령어 구조

FFMPEG에서 다중 파일을 변환할 때는 일반적으로 여러 개의 입력 파일을 명시하거나, 여러 개의 출력 파일을 설정한다. 각 파일에 대해 다른 인코딩 옵션을 적용할 수도 있으며, 파일 형식이나 비트레이트, 프레임 레이트 등의 세부적인 설정도 개별적으로 지정할 수 있다.

기본 명령어 구조는 다음과 같다:

```bash
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]concat=n=2:v=1:a=0[outv]" -map "[outv]" output.mp4
```

위 명령은 두 개의 비디오 파일을 하나로 합쳐서 하나의 출력 파일을 생성하는 예이다. 여기서 `-i`는 입력 파일을 나타내며, `filter_complex` 옵션은 두 파일을 합치는 필터를 설정하는 부분이다.

#### 다중 입력 파일 처리

FFMPEG는 여러 개의 입력 파일을 동시에 처리할 수 있다. 예를 들어, 여러 비디오 파일을 입력받아 하나의 비디오 파일로 합치는 작업을 할 수 있다. 이때, 각 입력 파일에 대해 고유한 옵션을 적용할 수 있다.

```bash
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mp4
```

여기서 `concat` 필터는 두 개의 비디오 스트림을 결합하여 하나의 출력 파일을 생성하는 필터이다. `n=2`는 결합할 입력 파일의 수를 나타내며, `v=1`은 비디오 스트림의 출력, `a=1`은 오디오 스트림의 출력을 의미한다.

**수식 예시**

다중 파일 변환에서 입력과 출력의 비율을 수식으로 나타내면 다음과 같다. 각 입력 파일 $\mathbf{x}\_i$를 개별적으로 처리한 후, 출력 파일 $\mathbf{y}$로 변환하는 과정은 다음과 같이 모델링할 수 있다.

$$
\mathbf{y} = \sum\_{i=1}^{n} \mathbf{f}(\mathbf{x}\_i)
$$

여기서 $\mathbf{f}$는 FFMPEG의 필터나 변환 함수이며, $n$은 입력 파일의 개수이다. 이 수식은 다중 파일을 입력받아 각 파일에 대해 동일한 처리를 한 후, 최종적으로 출력 파일을 생성하는 과정을 나타낸다.

#### 다중 출력 파일 생성

다중 파일 변환의 또 다른 중요한 기능은 하나의 입력 파일로부터 여러 개의 출력 파일을 생성하는 것이다. 예를 들어, 서로 다른 비트레이트나 해상도를 가진 여러 개의 파일을 동시에 생성할 수 있다.

```bash
ffmpeg -i input.mp4 -map 0 -b:v:0 500k -s:v:0 640x360 -b:v:1 1000k -s:v:1 1280x720 -f tee "[f=mp4]output_360p.mp4|[f=mp4]output_720p.mp4"
```

위 명령에서 `-map 0`은 첫 번째 입력 파일을 모든 출력에 적용하는 옵션이고, `-b:v:0`와 `-b:v:1`은 각각 비디오의 비트레이트를 설정하는 옵션이다. `-s:v:0`와 `-s:v:1`은 각각 출력 파일의 해상도를 설정한다. `tee` 옵션을 사용하여 여러 출력 파일을 동시에 생성할 수 있다.

**비트레이트와 해상도 관계**

다중 출력 파일 생성에서 주로 조정되는 비트레이트와 해상도는 출력 품질과 파일 크기에 큰 영향을 미친다. 이를 수식으로 나타내면 다음과 같다:

$$
\text{파일 크기} \approx \frac{\mathbf{B} \times \text{시간}}{8}
$$

여기서 $\mathbf{B}$는 비트레이트 $(bps)$, 파일 크기는 바이트 단위이다. 따라서 비트레이트가 높을수록 파일 크기가 커지고, 해상도가 높을수록 비트레이트의 요구량이 증가한다.

#### 비디오 파일 병합

비디오 파일을 병합하는 것은 다중 파일 변환에서 자주 사용되는 기능이다. 이를 위해 `concat` 필터를 많이 사용한다. 여러 비디오 파일을 병합하려면 다음과 같은 명령을 사용할 수 있다.

```bash
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex "[0:v][1:v][2:v]concat=n=3:v=1[outv]" -map "[outv]" output.mp4
```

이 명령은 세 개의 입력 비디오 파일을 하나로 병합하여 하나의 출력 파일을 생성하는 예이다. `concat` 필터에서 `n=3`은 병합할 파일의 수를 나타내고, `v=1`은 비디오 스트림만을 병합하는 것을 의미한다.

**병합 수식**

파일 병합을 수식으로 나타내면, 각 입력 파일 $\mathbf{x}\_i$를 시간에 따라 결합하는 형태로 표현할 수 있다.

$$
\mathbf{y}(t) = \mathbf{x}\_1(t) + \mathbf{x}\_2(t + T\_1) + \mathbf{x}\_3(t + T\_1 + T\_2)
$$

여기서 $T\_1$과 $T\_2$는 각각 파일 1과 파일 2의 길이이다. 이 수식은 각 비디오 파일이 연속적으로 결합되는 시간을 나타낸다.

#### 오디오 파일 병합

오디오 파일 병합 역시 다중 파일 변환에서 자주 사용되는 기능 중 하나이다. 오디오 파일을 병합하려면 비디오와 비슷한 방법으로 `concat` 필터를 사용할 수 있다. 하지만, 오디오와 비디오 스트림을 함께 병합할 때는 동기화 문제가 발생할 수 있으므로 주의가 필요하다.

```bash
ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1[outa]" -map "[outa]" output.mp3
```

위 명령은 두 개의 오디오 파일을 하나로 병합하는 예이다. `v=0`은 비디오 스트림을 포함하지 않고, `a=1`은 오디오 스트림만 병합한다는 것을 의미한다.

**오디오 병합 수식**

오디오 병합을 수식으로 나타내면, 각 오디오 스트림 $\mathbf{a}\_i$를 결합하는 과정은 다음과 같다.

$$
\mathbf{y}\_a(t) = \mathbf{a}\_1(t) + \mathbf{a}\_2(t + T\_a)
$$

여기서 $T\_a$는 첫 번째 오디오 파일의 길이를 나타내며, 두 번째 오디오 파일은 첫 번째 파일이 끝난 후에 재생된다.

#### 다중 트랙 지원

FFMPEG는 여러 트랙을 가진 파일을 다룰 수 있다. 예를 들어, 하나의 비디오 파일에 여러 개의 오디오 트랙을 포함하거나, 여러 자막 트랙을 추가하는 것이 가능한다. 이때 각 트랙을 별도로 처리하고 관리할 수 있다.

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

위 명령은 하나의 비디오 파일과 두 개의 오디오 트랙을 결합하여 출력 파일에 포함시키는 예이다. `-map` 옵션은 입력 파일의 특정 트랙을 출력 파일로 매핑하는데 사용된다. `-c:v copy`는 비디오 트랙을 그대로 복사하며, 각 오디오 트랙은 다른 코덱으로 인코딩된다.

**멀티트랙 처리 수식**

멀티트랙 처리는 여러 입력 신호 $\mathbf{s}\_i$를 결합하여 하나의 출력 신호 $\mathbf{y}$로 통합하는 과정으로 수식화할 수 있다.

$$
\mathbf{y}(t) = \sum\_{i=1}^{n} \mathbf{s}\_i(t)
$$

여기서 $n$은 트랙의 개수를 나타내며, 각 트랙은 독립적인 신호로 입력된다. 이러한 트랙들이 모두 동일한 시간 축을 공유하며, 동기화가 중요하다.

#### 파일 분할

다중 파일 변환에서 자주 사용되는 또 다른 기능은 파일 분할이다. FFMPEG는 큰 파일을 여러 개의 작은 파일로 나눌 수 있다. 이는 비디오나 오디오 파일을 일정한 시간 단위나 크기 단위로 나누는 경우에 유용하다.

파일을 시간 단위로 분할할 때는 `-ss`와 `-t` 옵션을 사용하여 특정 시간대의 파일을 추출할 수 있다.

```bash
ffmpeg -i input.mp4 -ss 00:00:00 -t 00:05:00 -c copy output_part1.mp4
ffmpeg -i input.mp4 -ss 00:05:00 -t 00:05:00 -c copy output_part2.mp4
```

위 명령은 `input.mp4` 파일을 5분 간격으로 나누어 두 개의 파일을 생성하는 예이다. `-ss`는 시작 시간을 의미하고, `-t`는 길이를 나타낸다.

**시간 기반 파일 분할 수식**

파일을 시간에 따라 나누는 과정을 수식으로 표현하면, 각 구간은 다음과 같이 나눌 수 있다:

$$
\mathbf{y}\_i(t) = \mathbf{x}(t), \quad t \in \[T\_i, T\_i + \Delta T]
$$

여기서 $T\_i$는 각 분할 구간의 시작 시간을 나타내고, $\Delta T$는 각 구간의 길이를 의미한다. 이 수식은 비디오 또는 오디오 파일을 일정한 시간 구간으로 나누는 과정을 설명한다.

#### 다중 트랙 지원

FFMPEG는 비디오, 오디오, 자막 등의 여러 트랙을 가진 멀티미디어 파일을 다룰 수 있다. 여러 트랙을 지원하는 파일에서는 비디오 트랙뿐만 아니라, 여러 개의 오디오 트랙과 자막 트랙을 추가하거나, 특정 트랙만 추출하는 작업도 가능한다.

**다중 트랙 비디오 파일 생성**

여러 개의 오디오 트랙을 가진 비디오 파일을 생성하려면 다음과 같은 명령어를 사용할 수 있다.

```bash
ffmpeg -i input_video.mp4 -i audio_track1.mp3 -i audio_track2.mp3 -map 0:v -map 1:a -map 2:a -c:v copy -c:a copy -f mp4 output_multi_track.mp4
```

이 명령은 `input_video.mp4` 비디오 파일과 두 개의 오디오 트랙을 하나의 멀티 트랙 비디오 파일로 병합하는 예이다. `-map` 옵션을 사용하여 특정 비디오와 오디오 트랙을 매핑할 수 있다.

**다중 트랙 관리**

다중 트랙 파일에서 특정 트랙만 추출하거나 제거할 수도 있다. 예를 들어, 특정 오디오 트랙만 추출하고 싶다면 다음과 같은 명령을 사용할 수 있다.

```bash
ffmpeg -i input_multi_track.mp4 -map 0:a:1 -c copy output_audio_only.mp3
```

위 명령은 `input_multi_track.mp4` 파일에서 두 번째 오디오 트랙만 추출하여 `output_audio_only.mp3` 파일을 생성한다.

**멀티트랙 수식**

여러 트랙을 가진 멀티미디어 파일을 수식으로 나타내면, 각 트랙을 개별적으로 처리하는 과정을 다음과 같이 표현할 수 있다:

$$
\mathbf{y}*i(t) = \mathbf{x}*{i}(t) \quad \text{for each track } i
$$

여기서 $\mathbf{x}\_i(t)$는 각 트랙에서의 입력 신호이고, $\mathbf{y}\_i(t)$는 출력 신호를 나타낸다. 이 수식은 각 트랙이 독립적으로 처리되는 멀티트랙 시스템을 설명한다.

#### 다중 코덱 사용

FFMPEG는 다중 코덱을 지원하여, 하나의 비디오 파일에서 여러 비디오 및 오디오 코덱을 사용할 수 있다. 이는 각각의 코덱이 가진 장점을 활용하여 효율적인 파일 변환을 가능하게 한다.

**다중 코덱 인코딩**

하나의 비디오 파일에서 비디오와 오디오에 각각 다른 코덱을 적용하려면 다음과 같은 명령어를 사용할 수 있다.

```bash
ffmpeg -i input.mp4 -c:v libx265 -c:a aac output_multi_codec.mp4
```

이 명령은 `input.mp4` 파일에서 비디오는 `libx265` 코덱을, 오디오는 `aac` 코덱을 사용하여 인코딩하는 예이다. 서로 다른 코덱을 결합하여 파일을 변환할 수 있다.

**다중 코덱 수식**

다중 코덱을 사용하는 경우, 각 트랙 $i$에 대해 서로 다른 인코딩 함수 $\mathbf{f}\_i$를 적용하여 인코딩하는 과정을 다음과 같이 표현할 수 있다:

$$
\mathbf{y}\_i(t) = \mathbf{f}\_i(\mathbf{x}(t))
$$

여기서 $\mathbf{f}\_i$는 각 트랙에 사용된 서로 다른 코덱을 나타낸다. 이 수식은 다중 코덱이 적용된 파일 변환 과정을 설명한다.

#### 다중 파일 변환

FFMPEG는 여러 파일을 동시에 변환할 수 있는 기능을 제공하여, 다수의 입력 파일을 하나의 명령으로 처리할 수 있다. 이를 통해 작업 시간을 절약하고, 여러 파일을 일관되게 관리할 수 있다.

**다중 입력 파일 변환**

여러 입력 파일을 한 번에 변환하려면 다음과 같은 명령을 사용할 수 있다.

```bash
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex "[0:v][1:v][2:v]concat=n=3:v=1:a=0[outv]" -map "[outv]" output.mp4
```

이 명령은 세 개의 비디오 파일을 하나로 병합하여 `output.mp4` 파일을 생성하는 예이다. `filter_complex` 옵션은 여러 파일을 결합하는 필터를 설정하는 부분으로, `concat` 필터는 비디오 파일을 시간 순서대로 결합한다.

**다중 출력 파일 변환**

하나의 입력 파일에서 여러 출력 파일을 생성할 수 있다. 서로 다른 비트레이트, 해상도 또는 코덱을 가진 여러 파일을 동시에 출력하려면 `tee` 옵션을 사용할 수 있다.

```bash
ffmpeg -i input.mp4 -map 0:v -b:v:0 500k -s:v:0 640x360 -b:v:1 1000k -s:v:1 1280x720 -f tee "[f=mp4]output_360p.mp4|[f=mp4]output_720p.mp4"
```

이 명령은 `input.mp4` 파일을 두 가지 해상도와 비트레이트로 변환하여 각각 360p와 720p 해상도의 파일을 동시에 생성한다.

**다중 파일 변환 수식**

다중 파일 변환을 수식으로 표현하면, 여러 개의 입력 파일 $\mathbf{x}\_i(t)$를 결합하여 하나의 출력 파일 $\mathbf{y}(t)$로 변환하는 과정은 다음과 같다:

$$
\mathbf{y}(t) = \sum\_{i=1}^{n} \mathbf{f}\_i(\mathbf{x}\_i(t))
$$

여기서 $\mathbf{f}\_i$는 각 입력 파일에 대해 적용된 변환 함수이고, $n$은 입력 파일의 개수를 나타낸다. 이 수식은 다중 파일을 처리하여 하나의 결과를 도출하는 과정을 설명한다.
