# 오디오 포맷 변환

오디오 포맷 변환은 FFMPEG에서 가장 기본적인 기능 중 하나로, 다양한 입력 포맷을 원하는 출력 포맷으로 변환할 수 있다. 여기에서는 오디오 포맷 변환의 기본 개념부터 FFMPEG 명령어를 사용한 실제 변환 과정까지 설명한다.

#### 오디오 포맷 개요

오디오 포맷은 음성 데이터를 어떻게 저장하고 처리하는지에 대한 규칙을 정의한다. 오디오 파일은 보통 컨테이너 포맷과 코덱을 결합하여 이루어지며, 대표적인 컨테이너 포맷으로는 MP3, WAV, AAC 등이 있다. 각 포맷은 고유의 압축 방식과 인코딩 방식을 가지며, 이를 변환할 때 적절한 코덱 설정이 필요하다.

오디오 변환에서 중요한 변수는 다음과 같다.

1. **샘플링 레이트 ($f\_s$)**: 1초당 수집되는 오디오 샘플 수로, 단위는 Hz이다.
2. **비트레이트 ($b\_r$)**: 초당 전달되는 데이터양으로, 주로 kbps로 표기된다.
3. **채널 수 ($C$)**: 오디오의 채널 수로, 모노(1채널), 스테레오(2채널), 서라운드(다채널) 등으로 나뉜다.
4. **코덱**: 오디오 데이터를 압축 및 해제하는 방법으로, 각 포맷마다 다르다.

#### FFMPEG를 이용한 오디오 포맷 변환 기본 명령어

FFMPEG에서 오디오 파일의 포맷을 변환하기 위해서는 다음과 같은 기본 명령어를 사용한다.

```
ffmpeg -i input_file output_file
```

이 명령어는 입력 파일을 지정된 출력 파일로 변환한다. 여기서 `input_file`과 `output_file`은 각각 변환하고자 하는 오디오 파일의 경로와 변환된 파일의 경로를 나타낸다.

예시:

```
ffmpeg -i input.wav output.mp3
```

위 명령어는 `input.wav` 파일을 `output.mp3` 파일로 변환한다. 이때 자동으로 적절한 코덱이 선택되지만, 수동으로 코덱을 지정할 수도 있다.

#### 코덱 설정

FFMPEG에서 오디오 포맷을 변환할 때, 특정 코덱을 지정하려면 `-acodec` 옵션을 사용할 수 있다. 예를 들어, MP3로 변환할 때는 다음과 같이 코덱을 명시적으로 지정할 수 있다.

```
ffmpeg -i input.wav -acodec libmp3lame output.mp3
```

여기서 `libmp3lame`은 MP3 인코딩을 위한 코덱이다. 비슷하게 AAC, OGG 등 다양한 코덱을 사용할 수 있다.

#### 샘플링 레이트 변경

오디오 포맷을 변환하면서 샘플링 레이트 ($f\_s$)도 변경할 수 있다. 샘플링 레이트는 `-ar` 옵션을 사용하여 설정한다.

```
ffmpeg -i input.wav -ar 44100 output.mp3
```

이 명령어는 입력 파일을 44.1kHz의 샘플링 레이트로 MP3 포맷으로 변환한다.

수학적으로, 샘플링 레이트의 개념은 다음과 같이 정의된다.

$$
f\_s = \frac{N\_s}{T}
$$

여기서 $N\_s$는 1초 동안 샘플링된 데이터의 수, $T$는 시간(초)이다. 샘플링 레이트가 높을수록 더 많은 데이터가 수집되어 음질이 좋아지지만, 파일 크기도 커진다.

#### 비트레이트 설정

오디오 포맷을 변환할 때, 비트레이트 ($b\_r$)는 오디오 파일의 품질과 크기에 큰 영향을 미친다. FFMPEG에서는 `-b:a` 옵션을 사용하여 오디오의 비트레이트를 설정할 수 있다. 단위는 보통 kbps로 지정한다.

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

위 명령어는 입력 파일을 192kbps 비트레이트로 MP3 포맷으로 변환한다. 비트레이트가 높을수록 음질이 향상되지만, 파일 크기가 커진다.

비트레이트는 다음 수식으로 나타낼 수 있다.

$$
b\_r = \frac{S}{T}
$$

여기서 $S$는 초당 전송되는 데이터 양(비트)이고, $T$는 전송 시간(초)이다. 비트레이트가 높을수록 더 많은 데이터가 전송되며, 이는 더 좋은 품질의 오디오로 이어진다.

#### 채널 수 변경

오디오 포맷 변환 중 채널 수 ($C$)도 변경할 수 있다. 모노에서 스테레오로, 혹은 스테레오에서 모노로 변환하는 것이 대표적인 예이다. 이때 `-ac` 옵션을 사용한다.

```
ffmpeg -i input.wav -ac 1 output.mp3
```

위 명령어는 스테레오 오디오 파일을 모노로 변환한다. `-ac 2`로 설정하면 스테레오로 변환할 수 있다.

#### 오디오 포맷 간 변환 예시

여러 포맷 간의 변환 예시는 아래와 같다.

1. **WAV에서 MP3로 변환**:

```
ffmpeg -i input.wav -acodec libmp3lame output.mp3
```

2. **MP3에서 AAC로 변환**:

```
ffmpeg -i input.mp3 -acodec aac output.aac
```

3. **FLAC에서 OGG로 변환**:

```
ffmpeg -i input.flac -acodec libvorbis output.ogg
```

위 예시들은 FFMPEG을 사용하여 다양한 오디오 포맷 간에 변환하는 방법을 보여준다.

#### 오디오 포맷 변환 시 고려 사항

1. **파일 크기**: 포맷과 코덱에 따라 파일 크기가 달라진다. 비손실 압축(예: FLAC)은 음질 손상이 없지만 파일 크기가 크며, 손실 압축(예: MP3, AAC)은 음질 손실이 있지만 파일 크기가 작다.
2. **호환성**: 특정 디바이스나 애플리케이션이 지원하는 포맷과 코덱을 고려해야 한다. 예를 들어, 일부 오디오 플레이어는 특정 포맷을 지원하지 않을 수 있다.
3. **음질**: 비트레이트와 샘플링 레이트는 음질에 직접적인 영향을 미친다. 음질을 유지하면서 파일 크기를 줄이는 것이 목표일 수 있다.

#### 주파수 응답과 포맷 변환

주파수 응답은 오디오 데이터의 품질을 결정하는 또 하나의 중요한 요소이다. 샘플링 레이트와 비트레이트가 주파수 응답에 영향을 미치며, 이를 수식으로 나타낼 수 있다.

$$
f\_{\text{max}} = \frac{f\_s}{2}
$$

여기서 $f\_{\text{max}}$는 샘플링 레이트에서 표현할 수 있는 최대 주파수이다. 이 이론은 나이퀴스트 정리에 근거하며, $f\_s$가 높을수록 더 넓은 주파수 대역을 표현할 수 있다.

#### 오디오 필터 적용

오디오 포맷 변환 중 오디오 필터를 적용하여 음질을 개선하거나 특정 효과를 추가할 수 있다. FFMPEG에서는 `-af` 옵션을 사용하여 다양한 오디오 필터를 적용할 수 있다.

**볼륨 조정**

오디오 볼륨을 조정하려면 `volume` 필터를 사용할 수 있다. 예를 들어, 오디오 볼륨을 50%로 줄이려면 다음 명령어를 사용한다.

```
ffmpeg -i input.wav -af "volume=0.5" output.mp3
```

볼륨 필터는 오디오 신호의 진폭을 변경하여 적용되며, 수식으로는 다음과 같이 표현된다.

$$
\mathbf{y}(t) = a \cdot \mathbf{x}(t)
$$

여기서 $\mathbf{x}(t)$는 입력 오디오 신호, $\mathbf{y}(t)$는 필터 적용 후 출력 신호, $a$는 볼륨 조정 계수이다.

**고역 통과 필터**

고역 통과 필터는 특정 주파수 이상의 신호만 통과시키는 필터로, `highpass` 필터를 사용하여 적용할 수 있다. 예를 들어, 300Hz 이상의 주파수만 통과시키려면 다음과 같이 설정한다.

```
ffmpeg -i input.wav -af "highpass=f=300" output.mp3
```

고역 통과 필터는 다음과 같은 수식으로 표현된다.

$$
H(f) = \begin{cases} 1 & \text{if } f > f\_c \ 0 & \text{if } f \leq f\_c \end{cases}
$$

여기서 $f\_c$는 컷오프 주파수이다.

**저역 통과 필터**

반대로, 저역 통과 필터는 특정 주파수 이하의 신호만 통과시킨다. `lowpass` 필터를 사용하여 적용할 수 있으며, 예를 들어 500Hz 이하의 주파수만 통과시키려면 다음과 같은 명령어를 사용한다.

```
ffmpeg -i input.wav -af "lowpass=f=500" output.mp3
```

저역 통과 필터의 수식은 다음과 같다.

$$
H(f) = \begin{cases} 1 & \text{if } f \leq f\_c \ 0 & \text{if } f > f\_c \end{cases}
$$

**리버브 효과**

FFMPEG을 사용하여 리버브(잔향) 효과를 추가할 수 있다. 리버브 효과는 `aecho` 필터를 사용하여 적용되며, 예를 들어 0.8초 간격으로 0.5의 감쇠율을 가진 리버브를 추가하려면 다음과 같이 설정한다.

```
ffmpeg -i input.wav -af "aecho=0.8:0.9:0.5:0.3" output.mp3
```

리버브는 다음과 같은 수식으로 표현할 수 있다.

$$
\mathbf{y}(t) = \mathbf{x}(t) + \alpha \mathbf{x}(t - \tau)
$$

여기서 $\mathbf{x}(t)$는 입력 신호, $\mathbf{y}(t)$는 출력 신호, $\alpha$는 감쇠율, $\tau$는 리버브 지연 시간이다.

#### 채널 매핑

FFMPEG에서는 오디오 포맷 변환 중 채널 매핑을 변경할 수 있다. 예를 들어, 스테레오 입력 파일에서 좌우 채널을 서로 바꾸려면 `-map_channel` 옵션을 사용한다.

```
ffmpeg -i input.wav -map_channel 0.0.1 0.0.0 output.wav
```

이 명령어는 입력 파일의 오른쪽 채널을 왼쪽 채널로, 왼쪽 채널을 오른쪽 채널로 변환한다.

#### 다중 오디오 트랙 처리

FFMPEG을 사용하면 다중 오디오 트랙이 있는 파일에서 특정 트랙만 추출하거나 변환할 수 있다. `-map` 옵션을 사용하여 원하는 트랙을 지정할 수 있다.

예를 들어, 두 개의 오디오 트랙이 있는 파일에서 첫 번째 트랙만 변환하려면 다음 명령어를 사용한다.

```
ffmpeg -i input.mkv -map 0:a:0 output.mp3
```

이 명령어는 첫 번째 오디오 트랙을 MP3 포맷으로 변환한다.
