# 메타데이터 관리

FFmpeg에서 메타데이터 관리는 미디어 파일의 속성 정보를 처리하는 중요한 기능이다. 메타데이터는 비디오, 오디오, 자막 파일 등에 포함된 정보를 포함하며, 이 정보는 파일의 구조, 코덱, 시간, 트랙 등의 속성을 기술하는 데 사용된다.

#### 메타데이터란?

메타데이터(metadata)는 "데이터에 관한 데이터"를 의미하며, 미디어 파일의 내용이나 속성을 설명하는 정보를 제공한다. 일반적으로 다음과 같은 항목을 포함할 수 있다.

* 파일 제목
* 작가
* 앨범명
* 트랙 번호
* 코덱 정보
* 비트레이트
* 해상도

FFmpeg를 사용하면 이러한 메타데이터를 추가하거나 수정할 수 있다. FFmpeg는 다양한 포맷의 메타데이터를 처리할 수 있으며, 주로 `-metadata` 옵션을 통해 이를 설정할 수 있다.

#### 메타데이터 읽기

FFmpeg는 입력 파일의 메타데이터를 출력하는 기능을 제공한다. 이는 주로 `ffprobe` 명령을 통해 수행된다.

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

위 명령어는 `input.mp4` 파일의 메타데이터를 출력하며, 파일의 구조와 각 트랙의 세부 정보를 확인할 수 있다.

#### 메타데이터 설정

FFmpeg를 사용하여 출력 파일에 메타데이터를 추가하거나 수정할 수 있다. `-metadata` 옵션을 사용하여 다음과 같이 특정 메타데이터 항목을 설정할 수 있다.

```
ffmpeg -i input.mp4 -metadata title="My Video" -metadata artist="Author" output.mp4
```

위 명령어는 `input.mp4` 파일을 `output.mp4`로 변환하면서 파일의 제목을 "My Video", 작가를 "Author"로 설정한다.

메타데이터 항목은 다양하게 설정 가능하며, 각 포맷에 따라 지원하는 메타데이터가 다를 수 있다. FFmpeg는 포맷별로 사용 가능한 메타데이터 필드를 다르게 처리하므로 포맷에 맞는 항목을 설정해야 한다.

#### 메타데이터 제거

출력 파일에서 메타데이터를 제거하려면 `-map_metadata` 옵션을 사용할 수 있다.

```
ffmpeg -i input.mp4 -map_metadata -1 output.mp4
```

위 명령어는 `input.mp4`의 모든 메타데이터를 제거하고, 메타데이터 없는 `output.mp4` 파일을 생성한다.

#### 트랙별 메타데이터 관리

FFmpeg는 파일의 각 트랙(비디오, 오디오, 자막)에 대한 개별 메타데이터 관리도 지원한다. 이를 위해 `-metadata:s:<stream_specifier>` 옵션을 사용한다.

예를 들어, 특정 오디오 트랙에 대한 메타데이터를 설정할 수 있다.

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

위 명령어는 첫 번째 오디오 트랙에 대한 언어(language)를 영어로 설정한다.

#### 메타데이터 복사

메타데이터를 복사하려면 `-map_metadata` 옵션을 사용하여 입력 파일의 메타데이터를 그대로 유지할 수 있다.

```
ffmpeg -i input.mp4 -map_metadata 0 output.mp4
```

위 명령어는 `input.mp4`의 메타데이터를 모두 복사하여 `output.mp4`로 저장한다.

#### 타임스탬프 수정

FFmpeg에서는 비디오나 오디오 파일의 타임스탬프를 수정할 수 있는 옵션을 제공한다. 타임스탬프 수정은 주로 프레임 간 시간 차이나 음성 트랙의 시간적 정렬이 맞지 않을 때 사용된다. 이 과정은 메타데이터 관리를 통해 타임스탬프를 수정하거나 새롭게 설정할 수 있다.

* **비디오 타임스탬프 수정:**

  비디오의 타임스탬프를 수정하려면 `-vf setpts` 필터를 사용한다.

  ```
  ffmpeg -i input.mp4 -vf "setpts=PTS+2/TB" output.mp4
  ```

  위 명령어는 비디오의 타임스탬프를 2초 늦게 설정한다. `PTS`는 프레젠테이션 타임스탬프(presentation timestamp)를 의미하며, `TB`는 타임베이스(timebase)를 나타낸다. 이러한 방식으로 타임스탬프를 조정할 수 있다.
* **오디오 타임스탬프 수정:**

  오디오의 타임스탬프를 수정하려면 `-af asetpts` 필터를 사용한다.

  ```
  ffmpeg -i input.mp3 -af "asetpts=PTS+1/TB" output.mp3
  ```

  위 명령어는 오디오의 타임스탬프를 1초 늦게 설정한다. 이는 비디오 파일과 마찬가지로 `PTS`를 기준으로 하여 타임스탬프를 조정하는 방식이다.

#### 스트림 별 메타데이터 처리

FFmpeg는 파일 내에서 여러 스트림(비디오, 오디오, 자막 등)을 처리할 수 있으며, 각각의 스트림에 대해 개별적으로 메타데이터를 설정할 수 있다. 스트림 별 메타데이터 처리는 주로 파일 내 여러 언어의 자막 트랙이나 여러 오디오 트랙이 있을 때 유용하다.

* **비디오 스트림 메타데이터 설정:**

  특정 비디오 스트림에 메타데이터를 설정하려면 `-metadata:s:v:<stream_index>` 옵션을 사용한다.

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

  위 명령어는 첫 번째 비디오 스트림에 "Main Video"라는 제목 메타데이터를 설정한다.
* **오디오 스트림 메타데이터 설정:**

  특정 오디오 스트림에 대해 메타데이터를 설정하려면 `-metadata:s:a:<stream_index>` 옵션을 사용한다.

  ```
  ffmpeg -i input.mp4 -metadata:s:a:1 language=eng output.mp4
  ```

  위 명령어는 두 번째 오디오 스트림에 영어(`language=eng`)로 메타데이터를 설정한다. 이 방법을 통해 다국어 트랙이나 특정 오디오 트랙에 대한 정보를 사용자 지정할 수 있다.

#### 시간 코드(Timecode) 관리

FFmpeg는 비디오와 오디오 트랙에서 시간 코드를 설정할 수 있다. 시간 코드는 주로 방송이나 제작 과정에서 동기화를 위해 사용되며, 정확한 시작 시간과 각 프레임의 시간을 기록하는 데 사용된다.

* **비디오 시간 코드 설정:**

  시간 코드를 설정하려면 `-timecode` 옵션을 사용한다.

  ```
  ffmpeg -i input.mp4 -timecode 00:00:05:00 output.mp4
  ```

  이 명령어는 `input.mp4` 파일의 시작 시간 코드를 5초(00:00:05:00)로 설정한다.
* **오디오 시간 코드 설정:**

  오디오 파일의 경우 시간 코드 설정은 일반적으로 사용되지 않지만, 비디오와 함께 사용할 경우 동기화를 위해 오디오 트랙에 시간 코드를 설정할 수 있다.

```
ffmpeg -i input.wav -filter_complex "asetpts=PTS+5/TB" output.wav
```

위 명령어는 오디오의 타임스탬프를 비디오와 맞추기 위해 5초 늦게 설정한다.

#### 비디오 및 오디오 트랙간 동기화

FFmpeg에서 비디오와 오디오의 시간적 동기화는 중요한 작업 중 하나이다. 비디오와 오디오의 시작 타임이 일치하지 않으면 재생 시 오디오와 비디오가 맞지 않는 경우가 발생할 수 있다.

* **비디오/오디오 동기화:**

  동기화 문제를 해결하려면 `-itsoffset` 옵션을 사용하여 입력 파일의 시간 오프셋을 설정할 수 있다.

  ```
  ffmpeg -itsoffset 1 -i video.mp4 -i audio.wav -c copy output.mp4
  ```

  위 명령어는 비디오를 1초 먼저 재생하고, 오디오를 늦게 시작하도록 설정한다. 이를 통해 비디오와 오디오의 시간 동기화를 맞출 수 있다.

#### 메타데이터 업데이트

FFmpeg를 사용하면 이미 존재하는 파일의 메타데이터를 업데이트할 수 있다. 이는 파일을 새로 변환하지 않고 메타데이터만 수정할 수 있다는 점에서 효율적이다. 이를 위해 `-map_metadata` 옵션과 `-metadata` 옵션을 사용하여 필요한 부분만 업데이트할 수 있다.

* **전체 메타데이터 업데이트:**

  ```
  ffmpeg -i input.mp4 -metadata title="New Title" output.mp4
  ```

  이 명령어는 `input.mp4` 파일의 제목을 "New Title"로 수정한 뒤 `output.mp4`로 저장한다.
* **특정 메타데이터 필드 업데이트:**

  파일 내 특정 필드만 수정하고 싶다면 필요한 필드만 지정하여 수정할 수 있다. 예를 들어, 아티스트 정보만 수정하고 싶을 때는 다음과 같이 명령어를 사용한다.

  ```
  ffmpeg -i input.mp3 -metadata artist="New Artist" output.mp3
  ```

  위 명령어는 기존 파일의 아티스트 정보를 "New Artist"로 수정한다. 다른 메타데이터 필드는 수정되지 않고 그대로 유지된다.

#### 자막 파일 메타데이터 관리

FFmpeg는 자막 파일에 대한 메타데이터 관리도 지원한다. 자막 파일의 경우 비디오 파일과 달리 시간 정보와 트랙 정보 외에도 자막 언어, 형식, 코덱 등에 대한 정보를 설정할 수 있다.

* **자막 언어 설정:**

  자막 트랙의 언어를 설정하려면 `-metadata:s:s:<index>` 옵션을 사용한다.

  ```
  ffmpeg -i input.mkv -metadata:s:s:0 language=kor output.mkv
  ```

  위 명령어는 첫 번째 자막 트랙의 언어를 한국어(`kor`)로 설정한다. 이를 통해 다국어 자막을 포함한 파일에서 각 자막 트랙에 대한 언어 정보를 설정할 수 있다.
* **자막 코덱 설정:**

  자막 코덱을 변경하거나 설정할 때는 `-c:s` 옵션을 사용하여 원하는 코덱을 지정할 수 있다.

  ```
  ffmpeg -i input.mkv -c:s mov_text output.mp4
  ```

  이 명령어는 자막을 `mov_text` 코덱을 사용하여 MP4 파일로 인코딩한다.

#### 메타데이터를 포함한 파일 변환

파일을 변환할 때 메타데이터가 유지되도록 하거나 새로운 파일에 메타데이터를 추가할 수 있다. 이 과정에서 FFmpeg는 입력 파일의 메타데이터를 자동으로 가져오지만, 사용자가 명시적으로 메타데이터를 설정할 수도 있다.

* **메타데이터 유지하면서 파일 변환:**

  ```
  ffmpeg -i input.avi -map_metadata 0 output.mp4
  ```

  이 명령어는 AVI 파일을 MP4로 변환하면서 원본 파일의 메타데이터를 그대로 유지한다.
* **새로운 메타데이터 추가와 함께 파일 변환:**

  기존 메타데이터를 유지하면서 새로운 메타데이터를 추가할 수도 있다.

  ```
  ffmpeg -i input.avi -map_metadata 0 -metadata title="Converted Video" output.mp4
  ```

  이 명령어는 원본 파일의 메타데이터를 복사하면서 새로운 제목 "Converted Video"를 추가하여 파일을 변환한다.

#### 커스텀 태그 사용

일부 파일 포맷에서는 기본 메타데이터 외에도 사용자 정의 메타데이터 필드를 설정할 수 있다. 이는 특별한 목적의 데이터를 추가하고자 할 때 유용하다. 예를 들어, 특정 작업을 설명하는 주석이나 특수한 태그를 파일에 삽입할 수 있다.

```
ffmpeg -i input.mp4 -metadata comment="This is a custom tag" output.mp4
```

위 명령어는 `input.mp4` 파일에 사용자 정의 주석을 추가한다.

#### FFmpeg와 메타데이터 활용의 유용성

메타데이터 관리는 미디어 파일의 정보를 체계적으로 관리하고 파일의 특성이나 내용을 정확하게 표현하는 데 필수적이다. 특히, 대규모 미디어 파일이나 다양한 언어와 형식을 포함한 파일을 관리할 때 FFmpeg의 메타데이터 설정 기능은 효율적인 작업 흐름을 제공한다.

FFmpeg에서 메타데이터 설정 및 수정은 매우 유연하며, 다양한 포맷과 요구 사항에 맞춰 적용할 수 있다. 또한, FFmpeg의 강력한 스크립팅 기능을 사용하면 대량의 파일에 대해 메타데이터를 자동으로 처리할 수 있어 작업 시간을 크게 단축할 수 있다.
