# 여러 입력 파일 병합

FFmpeg을 사용하여 여러 입력 파일을 병합하는 것은 다양한 방식으로 이루어질 수 있다. 일반적으로는 비디오 파일이나 오디오 파일을 연결하거나 특정 트랙들을 하나의 파일로 결합하는 방식이 사용된다. 여기서는 여러 가지 방법 중 가장 대표적인 방법들을 설명하겠다.

#### concat 프로토콜을 사용한 파일 병합

가장 기본적인 방법 중 하나는 `concat` 프로토콜을 사용하는 것이다. 이 방법은 파일들이 동일한 포맷을 가지고 있을 때 효과적이다.

**사용 방법**

FFmpeg에서 `concat` 프로토콜을 사용하여 여러 파일을 병합하려면 다음과 같은 형식의 명령어를 사용할 수 있다.

```bash
ffmpeg -f concat -safe 0 -i <input_file_list.txt> -c copy <output_file>
```

여기서 `input_file_list.txt`는 병합할 파일들의 리스트를 포함한 텍스트 파일이다. 이 텍스트 파일은 다음과 같은 형식을 따라야 한다.

```
file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'
```

이 방법은 파일들을 복사하여 연결하기 때문에, 코덱을 다시 인코딩할 필요가 없다.

#### concat 필터를 사용한 파일 병합

파일 포맷이 다르거나 더 복잡한 병합 작업이 필요할 때는 `concat` 필터를 사용할 수 있다. 이 방법은 서로 다른 포맷의 파일들도 병합할 수 있는 장점이 있다. 다만, 코덱을 다시 인코딩해야 하기 때문에 처리 시간이 오래 걸릴 수 있다.

**사용 방법**

다음은 두 개 이상의 파일을 병합할 때 사용하는 `concat` 필터의 예시이다.

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

이 명령어에서 `n=2`는 병합할 파일의 개수를 나타내고, `v=1`은 비디오 트랙이 하나 있다는 것을, `a=1`은 오디오 트랙이 하나 있다는 것을 의미한다. 이 필터는 각 입력 파일의 비디오 및 오디오 스트림을 가져와서 하나의 파일로 병합한다.

#### 수식으로 나타낸 데이터 병합 과정

병합 작업을 수학적으로 표현하면 다음과 같다. 각 입력 파일의 데이터를 **벡터**로 정의할 수 있다. 비디오 데이터와 오디오 데이터를 각각 $\mathbf{V}\_i$와 $\mathbf{A}\_i$로 표현하면, 병합 작업은 각 데이터 벡터의 연결(연속)을 의미한다.

$$
\mathbf{V}\_{\text{merged}} = \mathbf{V}\_1 \oplus \mathbf{V}\_2 \oplus \dots \oplus \mathbf{V}\_n
$$

$$
\mathbf{A}\_{\text{merged}} = \mathbf{A}\_1 \oplus \mathbf{A}\_2 \oplus \dots \oplus \mathbf{A}\_n
$$

여기서 $\oplus$는 병합 연산을 나타내며, 각 비디오와 오디오 스트림이 시간 축에서 연결되는 과정을 수학적으로 나타낸다.

#### `-f concat` 방식과 필터 방식의 차이점

`-f concat` 프로토콜은 파일을 단순히 시간 축에서 연결하는 방식이며, 코덱 재인코딩이 없기 때문에 속도가 빠르다. 그러나 이 방법은 파일 포맷이 동일한 경우에만 사용 가능한다.

반면, `concat` 필터를 사용하면 파일 포맷이 다르더라도 연결할 수 있으며, 더 복잡한 연결 작업(예: 여러 오디오 및 비디오 트랙 병합)도 가능한다. 하지만 이 경우에는 인코딩 과정을 거치므로 처리 시간이 더 오래 걸릴 수 있다.

#### ffmpeg concat 필터에서 n, v, a 매개변수의 의미

concat 필터에서 중요한 매개변수는 `n`, `v`, `a`이다.

* `n`: 병합할 입력 파일의 수를 의미한다. 이 값은 병합하려는 파일의 개수에 따라 결정된다.
* `v`: 병합할 비디오 트랙의 수를 의미한다. 예를 들어, 비디오가 하나씩 있는 경우 `v=1`로 설정한다.
* `a`: 병합할 오디오 트랙의 수를 의미한다. 오디오 트랙이 있다면 `a=1`로 설정하고, 오디오가 없으면 `a=0`으로 설정한다.

병합된 파일의 비디오와 오디오 트랙은 각각 다음과 같은 방식으로 매핑된다.

* `outv`: 병합된 비디오 트랙을 매핑하는 출력 변수.
* `outa`: 병합된 오디오 트랙을 매핑하는 출력 변수.

**예시**

세 개의 비디오 파일을 병합하려면 `n=3`으로 설정하고, 각 파일에 비디오와 오디오가 있을 경우 다음과 같이 명령어를 작성할 수 있다.

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

이 명령어는 세 개의 입력 파일을 병합하여 하나의 비디오 파일로 출력한다.

#### 다양한 트랙 병합

여러 개의 비디오 또는 오디오 트랙을 병합하는 경우 각 트랙을 명확하게 매핑해야 한다. 예를 들어, 다중 비디오 트랙과 다중 오디오 트랙이 있는 파일을 병합하려면 각 트랙을 적절히 처리해야 한다. 이 경우에는 `concat` 필터의 `v` 및 `a` 값을 여러 개의 트랙에 맞게 설정해야 한다.

#### 시간적 병합과 공간적 병합

FFmpeg에서 파일을 병합하는 방법은 시간적으로 병합하는 방식과 공간적으로 병합하는 방식으로 나뉜다.

**시간적 병합**

시간적 병합은 위에서 설명한 것처럼 비디오 파일들이 시간 축에서 순차적으로 연결되는 방식이다. 예를 들어, 두 개의 10초짜리 비디오 파일을 시간적으로 병합하면, 최종 출력 파일의 길이는 20초가 된다.

**공간적 병합**

공간적 병합은 여러 비디오 파일을 동시에 화면에 표시하는 방식이다. 이 경우에는 `concat` 필터 대신 `hstack` 또는 `vstack` 필터를 사용할 수 있다.

* `hstack`: 비디오 파일들을 가로로 나란히 병합.
* `vstack`: 비디오 파일들을 세로로 나란히 병합.

다음은 두 개의 비디오 파일을 가로로 병합하는 예시이다.

```bash
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "hstack=inputs=2" output.mp4
```

이 명령어는 두 개의 비디오 파일을 화면에서 가로로 나란히 배치하여 하나의 파일로 병합한다.

#### 시간축 병합과 공간축 병합의 수식적 표현

시간축 병합을 수식으로 나타내면 다음과 같다. 각 비디오 파일의 시간 길이를 $t\_i$라고 할 때, 병합된 비디오 파일의 시간 길이 $t\_{\text{merged}}$는 다음과 같다.

$$
t\_{\text{merged}} = \sum\_{i=1}^{n} t\_i
$$

즉, 각 비디오 파일의 시간 길이를 더하여 최종 파일의 시간 길이가 결정된다.

공간축 병합의 경우, 비디오 프레임의 가로 또는 세로 크기를 기준으로 병합된다. 가로로 병합할 경우 최종 비디오의 가로 크기 $w\_{\text{merged}}$는 각 비디오의 가로 크기 $w\_i$를 더한 값이 된다.

$$
w\_{\text{merged}} = \sum\_{i=1}^{n} w\_i
$$

세로로 병합할 경우 최종 비디오의 세로 크기 $h\_{\text{merged}}$는 각 비디오의 세로 크기 $h\_i$를 더한 값이 된다.

$$
h\_{\text{merged}} = \sum\_{i=1}^{n} h\_i
$$

이 수식은 병합된 비디오의 해상도가 어떻게 변화하는지를 수학적으로 나타낸다.

#### 파일 병합 시 고려해야 할 사항

여러 파일을 병합할 때는 다음과 같은 사항들을 고려해야 한다.

1. **파일 포맷 및 코덱**: 병합할 파일들이 동일한 포맷과 코덱을 사용하는 것이 이상적이다. 만약 다르다면 `concat` 필터를 사용하여 재인코딩해야 할 수 있다.
2. **비디오 해상도**: 해상도가 다른 파일을 병합할 때는 해상도를 일치시켜야 한다. 해상도가 다르면 병합 과정에서 오류가 발생할 수 있다.
3. **프레임 레이트**: 프레임 레이트가 다른 파일을 병합할 때는 프레임 레이트를 일치시키는 것이 중요하다. 그렇지 않으면 병합된 결과물이 부자연스러워질 수 있다.
4. **비트레이트**: 병합할 파일의 비트레이트도 동일하게 설정하는 것이 좋다. 비트레이트가 다르면 품질 저하가 발생할 수 있다.

#### 다양한 입력 파일의 병합

FFmpeg에서는 비디오와 오디오를 함께 병합하거나 서로 다른 형식의 입력 파일들을 병합할 수 있다. 이 경우에는 각 입력 파일의 스트림을 명확하게 지정하여 병합해야 한다.

**비디오 및 오디오 스트림을 병합하는 방법**

비디오 파일에 새로운 오디오 트랙을 추가하거나 비디오 파일과 오디오 파일을 병합하는 경우, 각 스트림을 개별적으로 지정하여 병합할 수 있다. 이를 위해서는 `-map` 옵션을 사용하여 각각의 입력 스트림을 명시적으로 선택한다.

예를 들어, 비디오 파일 `input_video.mp4`와 오디오 파일 `input_audio.mp3`를 병합하는 경우 다음과 같이 명령어를 사용할 수 있다.

```bash
ffmpeg -i input_video.mp4 -i input_audio.mp3 -c:v copy -c:a aac output.mp4
```

이 명령어는 비디오 코덱을 다시 인코딩하지 않고 그대로 복사(`-c:v copy`)하며, 오디오 파일을 AAC로 인코딩하여 병합한다. 이때 비디오 스트림은 `input_video.mp4`에서, 오디오 스트림은 `input_audio.mp3`에서 가져온다.

#### 비디오와 오디오가 따로 있는 입력 파일 병합

비디오와 오디오가 각각 별도로 존재하는 경우(예: `input1.mp4`에 비디오만 있고, `input2.mp4`에 오디오만 있는 경우), 이를 하나의 파일로 병합할 수 있다. 이 경우에도 `-map` 옵션을 사용하여 각각의 스트림을 지정해야 한다.

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

이 명령어에서 `-map 0:v`는 첫 번째 입력 파일(`input1.mp4`)의 비디오 스트림을 선택하고, `-map 1:a`는 두 번째 입력 파일(`input2.mp4`)의 오디오 스트림을 선택하여 병합한다.

#### 서로 다른 포맷의 파일 병합

서로 다른 포맷을 가진 파일을 병합할 때는 각각의 파일을 동일한 포맷으로 변환해야 한다. 예를 들어, 하나의 비디오 파일이 MP4 형식이고 다른 파일이 AVI 형식일 때, 두 파일을 병합하려면 둘 다 동일한 형식으로 인코딩한 후 병합하는 것이 일반적이다.

```bash
ffmpeg -i input1.mp4 -i input2.avi -c:v libx264 -c:a aac output.mp4
```

이 명령어는 `input1.mp4`와 `input2.avi` 파일을 H.264 비디오 코덱과 AAC 오디오 코덱으로 인코딩하여 하나의 파일로 병합한다.

#### 병합 전 프레임 레이트 일치

파일 병합 전, 두 파일의 프레임 레이트가 다를 경우 병합 과정에서 문제가 발생할 수 있다. 이때는 `-r` 옵션을 사용하여 프레임 레이트를 일치시켜야 한다.

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

이 명령어는 `input1.mp4`와 `input2.mp4`의 프레임 레이트를 30fps로 맞추고, 두 비디오 파일을 병합한다.

#### 여러 오디오 트랙 병합

하나의 비디오 파일에 여러 개의 오디오 트랙을 병합하는 경우, 각 오디오 트랙을 명확하게 지정하고 병합해야 한다. 다음은 두 개의 오디오 파일을 하나의 비디오 파일에 병합하는 예시이다.

```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 aac -shortest output.mp4
```

이 명령어에서 `-map 0:v`는 첫 번째 입력 파일인 비디오 스트림을 선택하고, `-map 1:a`와 `-map 2:a`는 각각 오디오 트랙을 선택한다. `-shortest` 옵션은 가장 짧은 트랙에 맞춰 출력 파일의 길이를 조정하는 옵션이다.

#### 비디오와 오디오의 비율 맞추기

병합할 비디오와 오디오의 길이가 다를 경우, 한쪽을 다른 쪽에 맞춰 늘리거나 줄일 수 있다. 예를 들어, 비디오가 오디오보다 길다면 `-t` 옵션을 사용하여 비디오의 길이를 오디오에 맞출 수 있다.

```bash
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -t 00:03:00 output.mp4
```

이 명령어는 비디오 파일의 길이를 3분으로 제한하여 오디오와 맞추는 방법이다.

#### 수학적 표현: 비디오와 오디오 병합 시 시간 길이 조정

병합 작업 시 비디오와 오디오의 시간 길이를 수학적으로 표현할 수 있다. 각 비디오와 오디오의 시간 길이를 $t\_{\text{video}}$와 $t\_{\text{audio}}$로 나타내면, 병합 후의 최종 파일의 시간 길이 $t\_{\text{output}}$는 다음과 같이 정의할 수 있다.

$$
t\_{\text{output}} = \min(t\_{\text{video}}, t\_{\text{audio}})
$$

이 수식은 비디오와 오디오 중 더 짧은 길이에 맞춰 병합할 때의 시간 길이를 나타낸다. 반대로, 길이를 동일하게 맞추기 위해서는 둘 중 더 긴 쪽에 맞춰야 한다.

#### 비디오 및 오디오의 비율 조정

비디오와 오디오의 비율을 맞출 때, 서로 다른 비율을 가진 두 파일을 병합하는 경우 비율을 일치시켜야 한다. FFmpeg에서는 다양한 비율 변환을 제공하는 필터를 사용할 수 있으며, 주로 비디오의 해상도나 프레임 비율을 맞추기 위해 사용된다.

**해상도 조정**

두 개의 비디오 파일의 해상도가 다를 경우 해상도를 일치시키는 것이 병합 작업에서 중요하다. 이를 위해 FFmpeg에서는 `scale` 필터를 사용할 수 있다. 예를 들어, 1080p 해상도의 비디오와 720p 해상도의 비디오를 병합할 때, 두 비디오의 해상도를 동일하게 맞추기 위해 다음과 같은 명령어를 사용할 수 있다.

```bash
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]scale=1280:720[v0];[1:v]scale=1280:720[v1];[v0][v1]concat=n=2:v=1[outv]" -map "[outv]" output.mp4
```

이 명령어는 각각 1080p와 720p 해상도의 비디오를 1280x720 해상도로 맞추어 병합한다.

**프레임 비율 조정**

비디오 파일의 프레임 비율이 다르면 병합 시 문제를 일으킬 수 있다. 프레임 비율을 일치시키기 위해서는 `fps` 필터를 사용할 수 있다. 예를 들어, 24fps 비디오와 30fps 비디오를 병합하려면 다음과 같은 명령어를 사용할 수 있다.

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

이 명령어는 두 비디오 파일의 프레임 비율을 30fps로 맞추어 병합한다.

#### 파일 길이 맞추기

비디오 파일과 오디오 파일을 병합할 때 파일의 길이가 서로 다르면, 병합 후의 파일 길이가 의도하지 않게 비정상적으로 길어지거나 짧아질 수 있다. 이를 방지하기 위해 비디오 파일 또는 오디오 파일의 길이를 맞추는 방법을 사용할 수 있다.

**가장 짧은 파일 길이에 맞추기**

두 파일 중 짧은 파일에 맞추어 병합하려면 `-shortest` 옵션을 사용한다. 예를 들어, 비디오 파일이 오디오 파일보다 길 경우, 비디오를 오디오 파일 길이에 맞춰 병합하는 방법은 다음과 같다.

```bash
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -shortest output.mp4
```

이 명령어는 오디오 파일의 길이에 맞춰 비디오 파일을 잘라서 병합한다.

#### 수학적 표현: 시간 비율 조정

비디오와 오디오의 시간 비율을 수식으로 나타내면, 비디오와 오디오의 실제 재생 시간이 다를 경우 두 파일의 비율을 조정하여 병합할 수 있다. 예를 들어, 비디오 파일의 길이를 $t\_{\text{video}}$, 오디오 파일의 길이를 $t\_{\text{audio}}$로 나타내면, 최종 출력 파일의 시간 비율은 다음과 같다.

$$
r\_{\text{output}} = \frac{t\_{\text{audio}}}{t\_{\text{video}}}
$$

이 수식은 비디오 파일의 길이를 오디오 파일에 맞춰 조정할 때의 비율을 나타낸다.

#### 여러 입력 파일의 동시 병합

여러 개의 입력 파일을 동시에 병합할 경우, 각 파일의 비디오 및 오디오 스트림을 분리하여 처리하는 것이 중요하다. 예를 들어, 두 개 이상의 파일을 병합할 때 각 입력 파일의 비디오와 오디오 트랙을 개별적으로 처리하는 방법은 다음과 같다.

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

이 명령어는 세 개의 입력 파일을 병합하여 하나의 비디오 및 오디오 트랙으로 출력한다. 여기서 `n=3`은 병합할 파일의 개수를 의미하고, 각각의 비디오 및 오디오 스트림을 개별적으로 병합하는 과정을 나타낸다.

#### 여러 입력 파일의 트랜지션 적용

병합 작업에서 각 비디오 파일 간에 트랜지션 효과를 적용할 수 있다. 트랜지션 효과를 사용하면 파일이 단순히 연결되는 대신, 시각적으로 부드럽게 전환되는 효과를 얻을 수 있다. FFmpeg에서는 `xfade` 필터를 사용하여 다양한 트랜지션 효과를 적용할 수 있다.

**트랜지션 적용 예시**

다음은 두 개의 비디오 파일을 병합하면서 `fade` 트랜지션을 적용하는 예시이다.

```bash
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]xfade=transition=fade:duration=2:offset=5" output.mp4
```

이 명령어는 첫 번째 비디오가 재생된 지 5초 후에 두 번째 비디오로 부드럽게 전환되며, 전환 효과는 2초 동안 지속된다.

#### 수식으로 나타낸 트랜지션 효과

트랜지션 효과를 수학적으로 표현하면, 각 비디오 파일의 재생 시간과 트랜지션 시간이 조합된 식으로 나타낼 수 있다. 예를 들어, 두 비디오 파일의 시간 길이를 각각 $t\_1$과 $t\_2$로 나타내고, 트랜지션 시간이 $t\_{\text{transition}}$일 때, 최종 출력 파일의 시간 길이 $t\_{\text{output}}$는 다음과 같이 표현된다.

$$
t\_{\text{output}} = t\_1 + t\_2 - t\_{\text{transition}}
$$

이는 트랜지션 시간 동안 두 비디오 파일이 겹쳐지기 때문에, 최종 파일의 시간 길이가 줄어드는 것을 나타낸다.

#### 다양한 입력 파일의 오디오 병합

여러 오디오 파일을 병합할 때, 각 오디오 트랙을 서로 다른 채널로 분리하여 병합하거나, 다중 채널 오디오를 하나의 파일로 합칠 수 있다. FFmpeg에서는 오디오 필터를 사용하여 이러한 작업을 수행할 수 있다.

**스테레오 파일로 변환하기**

서로 다른 오디오 파일을 좌우 스테레오 채널로 병합하려면 `amerge` 필터를 사용할 수 있다. 예를 들어, 두 개의 모노 오디오 파일을 스테레오 파일로 변환하려면 다음과 같이 명령어를 작성할 수 있다.

```bash
ffmpeg -i left_channel.mp3 -i right_channel.mp3 -filter_complex "[0:a][1:a]amerge=inputs=2" -ac 2 output.mp3
```

이 명령어는 두 개의 모노 파일을 하나의 스테레오 파일로 병합한다. `-ac 2` 옵션은 오디오를 스테레오로 출력하도록 지정하는 옵션이다.

**여러 개의 오디오 트랙 병합**

여러 개의 오디오 트랙을 하나의 파일로 병합할 때는 각 오디오 트랙을 개별적으로 처리해야 한다. 예를 들어, 다중 입력 파일을 사용하여 각 오디오 파일을 동시에 병합하는 방법은 다음과 같다.

```bash
ffmpeg -i audio1.mp3 -i audio2.mp3 -filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" output.mp3
```

이 명령어는 두 개의 오디오 파일을 믹싱하여 하나의 파일로 병합한다. `duration=longest` 옵션은 가장 긴 오디오 트랙에 맞춰 믹싱을 진행한다.

#### 오디오 병합 시 고려해야 할 사항

여러 개의 오디오 트랙을 병합할 때는 다음과 같은 사항들을 고려해야 한다.

1. **오디오 샘플링 레이트**: 병합할 오디오 파일들의 샘플링 레이트가 동일해야 한다. 만약 샘플링 레이트가 다르면, 병합 전에 샘플링 레이트를 일치시켜야 한다.
2. **오디오 채널**: 오디오 파일의 채널 수(예: 모노, 스테레오)가 다를 경우 병합 전에 각 파일의 채널 수를 동일하게 맞추는 것이 중요하다.
3. **오디오 비트레이트**: 병합할 파일들의 비트레이트가 다르면, 병합 후 품질에 영향을 미칠 수 있다. 이 경우 비트레이트를 일치시키는 것이 권장된다.

#### 오디오 샘플링 레이트 변환

서로 다른 샘플링 레이트를 가진 오디오 파일을 병합하려면, `aresample` 필터를 사용하여 샘플링 레이트를 일치시켜야 한다. 다음은 샘플링 레이트를 44.1kHz로 변환하여 두 개의 오디오 파일을 병합하는 예시이다.

```bash
ffmpeg -i audio1.mp3 -i audio2.mp3 -filter_complex "[0:a]aresample=44100[a0];[1:a]aresample=44100[a1];[a0][a1]amix=inputs=2" output.mp3
```

이 명령어는 두 개의 오디오 파일의 샘플링 레이트를 44.1kHz로 맞춘 후 병합한다.

#### 수학적 표현: 오디오 병합 시 샘플링 레이트 변환

오디오 파일의 샘플링 레이트를 수학적으로 표현하면, 오디오 파일의 샘플링 주파수 $f\_s$와 각 오디오 파일의 시간 길이 $t$를 이용하여 다음과 같이 표현할 수 있다.

$$
N = f\_s \times t
$$

여기서 $N$은 샘플의 총 개수이다. 서로 다른 샘플링 레이트를 가진 두 파일을 병합할 때는 두 파일의 샘플 개수를 동일하게 맞춰야 한다. 예를 들어, 샘플링 레이트가 $f\_{s1}$인 첫 번째 파일과 $f\_{s2}$인 두 번째 파일을 병합할 때, 최종 샘플링 레이트 $f\_{\text{merged}}$는 다음과 같이 정의할 수 있다.

$$
f\_{\text{merged}} = \text{gcd}(f\_{s1}, f\_{s2})
$$

이 수식은 두 파일의 샘플링 레이트를 최소 공배수로 맞춰서 병합하는 경우에 적용된다.

#### 여러 입력 파일의 자막 병합

FFmpeg에서는 여러 개의 자막 파일을 병합하거나 자막을 비디오 파일에 삽입할 수 있다. 자막 파일을 비디오에 병합하는 경우, 자막 파일의 포맷에 따라 다르게 처리해야 한다.

**SRT 자막 파일 병합**

SRT 자막 파일을 비디오 파일에 병합하려면 `-c:s mov_text` 옵션을 사용하여 자막을 인코딩할 수 있다. 예를 들어, 비디오 파일과 SRT 자막 파일을 병합하려면 다음과 같은 명령어를 사용할 수 있다.

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

이 명령어는 비디오 파일에 SRT 자막을 삽입하여 최종 출력 파일로 병합한다.

#### 수학적 표현: 비디오와 자막의 시간 동기화

비디오와 자막의 시간 동기화를 수식으로 나타내면, 비디오 파일의 프레임 수 $N\_{\text{video}}$와 자막 파일의 자막 개수 $N\_{\text{subtitles}}$가 동일한 비율로 동기화되어야 한다. 이를 수식으로 표현하면 다음과 같다.

$$
\frac{N\_{\text{video}}}{t\_{\text{video}}} = \frac{N\_{\text{subtitles}}}{t\_{\text{subtitles}}}
$$

여기서 $t\_{\text{video}}$는 비디오의 총 재생 시간, $t\_{\text{subtitles}}$는 자막이 표시되는 총 시간을 나타낸다. 두 값이 동일해야 비디오와 자막이 정상적으로 동기화된다.

#### 여러 입력 파일의 시간 동기화

여러 비디오 파일을 병합할 때, 각 파일의 시간 동기화는 매우 중요하다. 특히 비디오와 오디오 파일이 별도로 존재하는 경우, 시간 동기화를 제대로 설정하지 않으면 비디오와 오디오가 어긋나는 문제가 발생할 수 있다.

**`-itsoffset` 옵션을 사용한 시간 오프셋 조정**

FFmpeg에서는 `-itsoffset` 옵션을 사용하여 입력 파일의 시간 오프셋을 조정할 수 있다. 이 옵션을 사용하면 특정 파일이 시작되는 시간을 조정할 수 있으며, 이를 통해 비디오와 오디오의 동기화를 맞출 수 있다.

예를 들어, 오디오 파일이 비디오보다 2초 늦게 시작해야 하는 경우, 다음과 같이 명령어를 작성할 수 있다.

```bash
ffmpeg -i video.mp4 -itsoffset 00:00:02 -i audio.mp3 -c:v copy -c:a copy output.mp4
```

이 명령어는 오디오 파일의 시작 시간을 2초 늦추어 비디오 파일과 동기화한다.

#### 수학적 표현: 시간 오프셋 조정

시간 오프셋 조정을 수학적으로 표현하면, 비디오 파일과 오디오 파일의 시간 축이 맞지 않을 경우 이를 맞추기 위해 시간 오프셋을 적용할 수 있다. 비디오 파일의 시간 시작점을 $t\_{\text{video}}$, 오디오 파일의 시간 시작점을 $t\_{\text{audio}}$라고 할 때, 오디오 파일에 적용할 오프셋 시간 $\Delta t$는 다음과 같이 정의된다.

$$
\Delta t = t\_{\text{audio}} - t\_{\text{video}}
$$

따라서 오디오 파일의 시작 시간을 $\Delta t$만큼 조정하여 비디오와 동기화할 수 있다.

**예시: 여러 입력 파일의 시간 동기화**

여러 개의 비디오 파일을 병합할 때, 각각의 파일이 시작하는 시간을 조정하여 동기화할 수 있다. 예를 들어, 세 개의 비디오 파일이 각각 0초, 5초, 10초에 시작하도록 설정하려면 다음과 같은 명령어를 사용할 수 있다.

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

이 명령어는 첫 번째 파일은 바로 시작하고, 두 번째 파일은 5초 후에, 세 번째 파일은 10초 후에 시작되도록 시간 동기화를 맞추어 병합한다.

#### 다중 자막 파일의 병합

비디오에 여러 개의 자막 파일을 삽입할 수 있으며, 각 자막 파일을 개별 트랙으로 추가하여 다중 자막을 지원하는 파일을 만들 수 있다. 예를 들어, 두 개의 SRT 자막 파일을 하나의 비디오에 병합하는 방법은 다음과 같다.

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

이 명령어는 첫 번째 자막을 트랙 1로, 두 번째 자막을 트랙 2로 병합한다. `-map` 옵션을 사용하여 각 자막 파일을 개별적으로 지정한다.

#### 자막 병합 시 고려할 사항

여러 자막 파일을 병합할 때는 자막의 시간 정보가 정확히 일치해야 한다. 자막의 시간 정보가 어긋나면 자막이 비디오와 동기화되지 않거나 잘못된 시간에 표시될 수 있다. 자막 파일이 여러 언어로 제공되는 경우, 각 자막 트랙에 대한 명확한 언어 설정이 필요할 수 있다.

#### 자막 파일의 시간 조정

FFmpeg에서는 자막 파일의 시간 정보를 조정할 수 있는 옵션을 제공하며, 이를 통해 자막 파일의 시작 시간을 맞출 수 있다. 예를 들어, 자막 파일의 시작 시간을 2초 늦추려면 다음과 같이 명령어를 작성할 수 있다.

```bash
ffmpeg -itsoffset 00:00:02 -i subtitle.srt -c copy output.srt
```

이 명령어는 자막 파일의 시작 시간을 2초 늦춰서 동기화된 자막 파일을 생성한다.

#### 자막과 비디오의 동기화 수식

자막 파일과 비디오 파일의 동기화를 수학적으로 표현하면, 자막의 시작 시간 $t\_{\text{subtitles}}$과 비디오의 시작 시간 $t\_{\text{video}}$가 일치해야 한다. 자막이 비디오보다 늦게 시작할 경우, 시간 차이를 $\Delta t$로 나타낼 수 있으며, 이때 자막의 시작 시간을 다음과 같이 조정할 수 있다.

$$
t\_{\text{subtitles}}' = t\_{\text{subtitles}} + \Delta t
$$

이 수식은 자막 파일의 시작 시간을 조정하여 비디오와 동기화하는 과정을 나타낸다.

#### 여러 자막 파일의 병합 수식

여러 개의 자막 파일을 병합할 때, 각 자막 파일의 시간 정보를 일치시키는 것이 중요하다. 각 자막 파일의 시작 시간과 끝 시간을 $t\_{\text{sub1-start}}, t\_{\text{sub1-end}}$로, 두 번째 자막 파일의 시작 시간과 끝 시간을 $t\_{\text{sub2-start}}, t\_{\text{sub2-end}}$로 정의할 수 있다. 두 자막 파일을 병합하는 경우, 병합된 자막의 시간 정보는 다음과 같이 나타낼 수 있다.

$$
t\_{\text{merged}} = \min(t\_{\text{sub1-start}}, t\_{\text{sub2-start}}) \quad \text{에서} \quad \max(t\_{\text{sub1-end}}, t\_{\text{sub2-end}})
$$

이 수식은 두 자막 파일을 병합할 때 자막의 시간 동기화를 어떻게 처리하는지를 나타낸다.

#### 여러 입력 파일의 비디오 및 오디오 동기화

비디오와 오디오 파일을 병합할 때, 동기화를 맞추는 것은 중요한 과정이다. FFmpeg에서는 각 파일의 시간 정보를 분석하여 비디오와 오디오의 동기화를 조정할 수 있으며, 이는 비디오의 정확한 재생과 오디오의 자연스러운 흐름을 보장한다.

**`-af aresample` 옵션을 사용한 오디오 시간 조정**

비디오와 오디오의 길이가 다를 경우, 오디오 파일의 샘플링 레이트를 조정하여 동기화할 수 있다. `aresample` 필터는 오디오의 시간 길이를 조정하거나 샘플링 레이트를 변경하는 데 사용된다.

다음은 비디오 파일의 길이에 맞춰 오디오 파일의 시간을 조정하는 예시이다.

```bash
ffmpeg -i video.mp4 -i audio.mp3 -filter_complex "[1:a]aresample=async=1" -c:v copy -c:a aac output.mp4
```

이 명령어는 비디오 파일과 오디오 파일을 병합하면서, 오디오 파일의 샘플링 레이트를 비디오 길이에 맞춰 조정한다.

**비디오 및 오디오의 샘플링 레이트 변환**

비디오 파일의 프레임 레이트와 오디오 파일의 샘플링 레이트가 일치하지 않을 경우, 비디오 및 오디오의 샘플링 레이트를 변환하여 일치시켜야 한다. FFmpeg에서는 `-r` 옵션을 사용하여 프레임 레이트를 조정하고, `-af aresample` 필터를 사용하여 오디오의 샘플링 레이트를 변환할 수 있다.

```bash
ffmpeg -i video.mp4 -i audio.mp3 -r 30 -filter_complex "[1:a]aresample=48000" -c:v copy -c:a aac output.mp4
```

이 명령어는 비디오 파일의 프레임 레이트를 30fps로 조정하고, 오디오 파일의 샘플링 레이트를 48kHz로 변환하여 동기화한다.

#### 비디오와 오디오의 비율 동기화

비디오 파일과 오디오 파일의 길이가 다를 때, 비디오와 오디오의 비율을 맞추는 작업이 필요하다. 이를 위해 FFmpeg에서는 비디오와 오디오의 재생 속도를 조정할 수 있는 다양한 옵션을 제공한다. 예를 들어, 비디오 파일이 오디오 파일보다 빠르게 재생되도록 하거나, 반대로 오디오 파일의 속도를 조정하여 비디오와 맞출 수 있다.

**`-filter_complex atempo`를 사용한 오디오 속도 조정**

오디오 파일의 속도를 조정하여 비디오 파일과 일치시키려면 `atempo` 필터를 사용할 수 있다. `atempo` 필터는 오디오의 재생 속도를 빠르게 또는 느리게 조정하는 역할을 한다.

```bash
ffmpeg -i video.mp4 -i audio.mp3 -filter_complex "[1:a]atempo=1.5" -c:v copy -c:a aac output.mp4
```

이 명령어는 오디오 파일의 속도를 1.5배 빠르게 조정하여 비디오와 동기화한다.

**`-filter_complex setpts`를 사용한 비디오 속도 조정**

비디오 파일의 재생 속도를 조정하려면 `setpts` 필터를 사용할 수 있다. 이 필터는 비디오 프레임의 시간 정보를 조정하여 재생 속도를 변경하는 역할을 한다.

```bash
ffmpeg -i video.mp4 -i audio.mp3 -filter_complex "[0:v]setpts=0.5*PTS" -c:v libx264 -c:a aac output.mp4
```

이 명령어는 비디오 파일의 재생 속도를 2배 빠르게 조정하여 오디오와 동기화한다.

#### 수학적 표현: 비디오와 오디오의 시간 및 속도 조정

비디오와 오디오의 재생 속도를 수학적으로 표현하면, 각 파일의 재생 시간을 $t\_{\text{video}}$와 $t\_{\text{audio}}$로 나타낼 수 있다. 두 파일을 동일한 비율로 재생시키기 위해서는, 비디오 파일의 재생 시간 $t\_{\text{video}}$를 오디오 파일의 재생 시간 $t\_{\text{audio}}$에 맞춰야 한다. 이를 수식으로 나타내면 다음과 같다.

$$
r\_{\text{video}} = \frac{t\_{\text{audio}}}{t\_{\text{video}}}
$$

여기서 $r\_{\text{video}}$는 비디오의 속도 조정 비율을 의미한다. 마찬가지로, 오디오 파일의 재생 속도를 비디오 파일에 맞추려면 다음과 같은 수식을 사용할 수 있다.

$$
r\_{\text{audio}} = \frac{t\_{\text{video}}}{t\_{\text{audio}}}
$$

이 수식들은 비디오와 오디오의 재생 속도를 맞추기 위해 각각의 속도를 조정할 때 사용된다.

#### 여러 입력 파일의 비디오 및 오디오 비율 조정 예시

비디오와 오디오 파일을 병합할 때, 두 파일의 길이가 다르면 비율을 맞춰야 한다. 예를 들어, 비디오 파일이 10초이고 오디오 파일이 5초일 때, 오디오 파일의 속도를 2배로 조정하여 비디오와 일치시키는 방법은 다음과 같다.

```bash
ffmpeg -i video.mp4 -i audio.mp3 -filter_complex "[1:a]atempo=2.0" -c:v copy -c:a aac output.mp4
```

이 명령어는 오디오 파일의 재생 속도를 2배 빠르게 조정하여 비디오 파일과 동일한 길이로 병합한다.

#### 다양한 비디오 및 오디오 트랙의 병합

하나의 비디오 파일에 여러 개의 오디오 트랙을 병합할 수 있으며, 각 오디오 트랙을 개별적으로 처리하여 다양한 언어 트랙을 포함한 비디오 파일을 만들 수 있다. 다음은 두 개의 오디오 트랙을 비디오 파일에 병합하는 예시이다.

```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 aac -shortest output.mp4
```

이 명령어는 비디오 파일에 두 개의 오디오 트랙을 병합하여, 다중 오디오 트랙을 지원하는 출력 파일을 생성한다.
