# 자막 인코딩

### 자막 파일 포맷 이해

FFmpeg을 사용하여 자막을 인코딩하려면 먼저 자막 파일 포맷을 이해하는 것이 중요하다. 자막 파일은 여러 포맷으로 존재하며, 대표적으로 다음과 같은 포맷들이 자주 사용된다:

* **SRT (SubRip Subtitle)**: 가장 널리 사용되는 자막 파일 포맷이다. 시간이 텍스트 형태로 기록되어 있으며, 텍스트 편집기로 쉽게 수정이 가능한다.
* **ASS (Advanced SubStation Alpha)**: 스타일 정보 및 위치 조정 등 다양한 옵션을 제공하는 포맷이다.
* **VTT (WebVTT)**: 웹에서 자주 사용되는 자막 포맷으로, HTML5 표준에 맞춰 제작되었다.

이 외에도 SSA, STL 등 다양한 자막 포맷이 있지만, FFmpeg은 대부분의 포맷을 지원하므로 상황에 맞는 포맷을 선택하면 된다.

### 자막 파일 인코딩

자막을 비디오에 인코딩하기 위해서는 `-vf` 옵션을 사용하여 비디오 필터를 적용하고, 자막 파일을 비디오 스트림에 합칠 수 있다. FFmpeg에서는 다음 명령어로 자막을 비디오에 합칠 수 있다:

```bash
ffmpeg -i input.mp4 -vf subtitles=subtitle.srt output.mp4
```

위 명령어에서 `input.mp4`는 비디오 파일, `subtitle.srt`는 자막 파일, 그리고 `output.mp4`는 자막이 인코딩된 비디오 파일을 의미한다.

### 자막 포맷 변환

FFmpeg을 사용하여 자막 파일을 다른 포맷으로 변환할 수 있다. 다음은 SRT 파일을 ASS 포맷으로 변환하는 예이다:

```bash
ffmpeg -i subtitle.srt subtitle.ass
```

이 명령어는 SRT 자막을 ASS 포맷으로 변환하는 과정이다. 이때 자막 파일의 스타일이나 포맷이 크게 달라질 수 있으므로 변환 후 파일을 확인하는 것이 좋다.

### 자막 위치 및 스타일 조정

ASS 자막 파일을 사용하면 자막의 위치와 스타일을 조정할 수 있다. FFmpeg에서 ASS 파일을 사용하여 자막을 비디오에 인코딩할 때 자막의 스타일을 유지하려면 다음과 같이 명령어를 사용할 수 있다:

```bash
ffmpeg -i input.mp4 -vf "ass=subtitle.ass" output.mp4
```

ASS 파일 내에서 글꼴, 크기, 색상, 위치 등을 조정할 수 있으며, 이는 ASS 파일 자체에서 정의된다. FFmpeg은 이러한 스타일 정보를 그대로 적용하여 비디오에 자막을 인코딩한다.

### 자막 싱크 맞추기

자막이 비디오와 싱크가 맞지 않는 경우, FFmpeg을 사용하여 자막의 타이밍을 조정할 수 있다. `itsoffset` 옵션을 사용하면 자막의 시작 시간을 앞당기거나 늦출 수 있다:

```bash
ffmpeg -itsoffset 2 -i input.mp4 -vf subtitles=subtitle.srt output.mp4
```

위 명령어는 자막의 시작 시간을 2초 앞당기는 예시이다. `itsoffset` 값을 조정하여 자막의 싱크를 맞출 수 있다.

### 자막과 비디오 크기 비율 조정

자막을 비디오에 인코딩할 때, 비디오의 해상도가 자막의 위치와 크기에 영향을 미칠 수 있다. FFmpeg에서 `subtitles` 필터를 사용할 때, 자막의 비율이 비디오 해상도와 일치하지 않으면 자막이 비디오 화면에 어색하게 보일 수 있다. 이를 방지하기 위해 자막 크기 및 위치를 비디오 크기에 맞게 조정할 수 있다.

예를 들어, `force_style` 옵션을 사용하여 자막의 스타일을 명시적으로 지정할 수 있다:

```bash
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt:force_style='Fontsize=24,PrimaryColour=&HFFFFFF&'" output.mp4
```

이 명령어는 자막의 글꼴 크기를 24로, 자막의 색상을 흰색으로 지정한다. `PrimaryColour`는 자막의 텍스트 색상을 결정하며, `&HFFFFFF&`는 흰색을 의미한다.

### 자막과 비디오 파일 병합

FFmpeg은 자막을 기존 비디오 파일과 병합할 수 있다. 이를 위해 `-c:v copy` 옵션을 사용하여 비디오 스트림을 재인코딩하지 않고 그대로 유지하면서 자막을 추가할 수 있다.

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

위 명령어는 SRT 자막 파일을 비디오 파일과 병합하여 새로운 MP4 파일을 생성한다. 이때 `mov_text`는 MP4 포맷에서 자주 사용되는 자막 포맷이다.

### 자막 파일을 비디오에 직접 내장

때때로 자막을 비디오 파일에 직접 내장하고 싶을 수 있다. 이 경우 자막을 별도의 파일로 저장하는 대신, 비디오 스트림 내에 자막을 포함시킬 수 있다. 다음 명령어는 SRT 자막을 비디오 스트림에 내장하는 방법을 보여준다:

```bash
ffmpeg -i input.mp4 -vf subtitles=subtitle.srt -c:v libx264 -crf 23 -preset fast output.mp4
```

이 명령어는 자막을 인코딩하여 비디오 파일에 직접 내장한다. `libx264` 코덱을 사용하며, `crf 23`은 인코딩 품질을 설정한다. `preset fast`는 인코딩 속도를 조정한다.

### 여러 자막 트랙 추가

하나의 비디오 파일에 여러 자막 트랙을 추가하려면, 각 자막 파일을 비디오 파일에 추가하는 방법을 사용할 수 있다. 이를 위해 FFmpeg은 여러 자막 파일을 입력으로 받아들이고, 각각의 자막 트랙을 추가할 수 있다.

```bash
ffmpeg -i input.mp4 -i subtitle_english.srt -i subtitle_korean.srt -map 0 -map 1 -map 2 -c copy -c:s mov_text output.mp4
```

이 명령어는 영어 자막(`subtitle_english.srt`)과 한국어 자막(`subtitle_korean.srt`)을 비디오 파일에 추가한다. 각각의 자막은 별도의 트랙으로 저장되며, 사용자는 비디오 플레이어에서 자막을 선택할 수 있다.

### 자막 파일에 시간 조정 적용

자막의 시간 정보가 원본 비디오와 맞지 않는 경우, FFmpeg을 사용하여 자막의 시간을 조정할 수 있다. 이때 `subtitles` 필터 내에서 `start_time` 옵션을 사용하여 자막의 시작 시간을 조정할 수 있다:

```bash
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt:start_time=5" output.mp4
```

이 명령어는 자막의 시작 시간을 5초 지연시키는 역할을 한다. 자막 파일 자체를 수정하지 않고 FFmpeg 내에서 시간 조정을 할 수 있기 때문에 매우 유용하다.
