# 비디오 자르기 및 병합

### 비디오 자르기

비디오를 자르는 작업은 주로 특정 구간을 추출하거나 불필요한 부분을 제거할 때 사용된다. FFmpeg에서 비디오를 자르는 명령어는 다양한 옵션을 통해 설정할 수 있으며, `-ss`와 `-t` 또는 `-to` 옵션을 자주 사용한다.

#### `-ss` 옵션

`-ss` 옵션은 비디오에서 시작할 시간을 설정하는 옵션이다. 시작 시간을 초 단위로 입력하여 특정 지점부터 비디오를 시작할 수 있다. 이 옵션을 사용하는 예시는 다음과 같다.

```bash
ffmpeg -ss 00:01:00 -i input.mp4 -c copy output.mp4
```

위 명령어는 `input.mp4` 파일에서 1분 지점부터 비디오를 시작하여 새로운 `output.mp4` 파일을 생성한다.

#### `-t` 옵션

`-t` 옵션은 비디오의 길이를 설정하는 옵션이다. 특정 시간만큼의 길이를 출력 비디오에서 가져오고 싶을 때 유용하다. `-ss` 옵션과 함께 사용할 수 있다.

```bash
ffmpeg -ss 00:01:00 -t 00:00:30 -i input.mp4 -c copy output.mp4
```

위 명령어는 1분부터 시작하여 30초 동안의 비디오를 추출한다.

#### `-to` 옵션

`-to` 옵션은 특정 종료 시간을 설정할 수 있다. 이 옵션을 사용하면 시작 시간과 종료 시간을 설정하여 원하는 구간을 자를 수 있다.

```bash
ffmpeg -ss 00:01:00 -to 00:01:30 -i input.mp4 -c copy output.mp4
```

위 명령어는 1분부터 1분 30초까지의 비디오를 자릅니다.

### 프레임 정확도 설정

FFmpeg는 기본적으로 `-ss` 옵션을 사용하여 입력 파일에서 자를 때 프레임 정확도를 잃을 수 있다. 이를 방지하려면 `-ss` 옵션을 입력 파일에 사용하지 않고 출력 파일에 사용하는 방법이 있다. 즉, 입력 파일에서 처리한 후 원하는 시간 구간을 설정하는 방식이다.

```bash
ffmpeg -i input.mp4 -ss 00:01:00 -c copy output.mp4
```

이 방식은 더욱 정확한 프레임 처리를 보장한다. 하지만 속도는 더 느릴 수 있다. 여기서, 비디오의 정확한 자르기는 키프레임(keyframe)과 관련이 있으며, FFmpeg는 기본적으로 키프레임 단위로 자르기 때문에 모든 프레임에 대해 자르기 위해서는 디코딩이 필요하다.

### 비디오 병합

비디오 병합은 여러 비디오 파일을 하나의 파일로 결합하는 작업이다. FFmpeg에서는 여러 파일을 병합하는 다양한 방법을 제공한다. 주로 사용하는 방식은 `concat` 명령어를 사용하는 것이다.

#### `concat` 데마클러로 병합

비디오 파일을 결합할 때 가장 일반적으로 사용하는 방법은 `concat` 명령어를 통해 비디오 파일을 병합하는 것이다. 먼저 비디오 파일 목록을 텍스트 파일에 작성해야 한다.

다음은 `concat` 방식으로 비디오 파일을 병합하는 예이다.

```bash
echo "file 'input1.mp4'" > file_list.txt
echo "file 'input2.mp4'" >> file_list.txt
ffmpeg -f concat -safe 0 -i file_list.txt -c copy output.mp4
```

위 명령어는 `input1.mp4`와 `input2.mp4`를 병합하여 `output.mp4` 파일을 생성한다. `file_list.txt` 파일에는 병합할 비디오 파일들의 경로가 작성되어 있다.

### 동일한 코덱으로 병합

병합하려는 비디오 파일들이 동일한 코덱과 포맷을 사용할 때는 `-c copy` 옵션을 사용할 수 있다. 이 옵션은 비디오 파일을 다시 인코딩하지 않고 직접 복사하여 병합할 수 있도록 도와준다.

### 서로 다른 코덱의 비디오 병합

비디오 파일들이 서로 다른 코덱이나 해상도를 가지고 있을 경우에는, 병합 전에 동일한 코덱으로 변환하는 작업이 필요하다. 이를 위해서는 각 비디오 파일을 동일한 코덱과 해상도로 변환한 뒤 병합할 수 있다. 아래 예시는 비디오 파일들을 H.264 코덱으로 변환한 후 병합하는 방법을 보여준다.

```bash
ffmpeg -i input1.mp4 -c:v libx264 -c:a aac -strict experimental -b:a 192k temp1.mp4
ffmpeg -i input2.mp4 -c:v libx264 -c:a aac -strict experimental -b:a 192k temp2.mp4
```

위 명령어들은 `input1.mp4`와 `input2.mp4`를 각각 H.264와 AAC 코덱으로 변환한 후 `temp1.mp4`와 `temp2.mp4`를 생성한다. 이제 변환된 파일을 병합할 수 있다.

```bash
echo "file 'temp1.mp4'" > file_list.txt
echo "file 'temp2.mp4'" >> file_list.txt
ffmpeg -f concat -safe 0 -i file_list.txt -c copy output.mp4
```

이 명령어는 두 개의 변환된 비디오 파일을 병합하여 최종 출력 파일인 `output.mp4`를 생성한다.

### 다양한 포맷 병합

여러 포맷의 비디오 파일을 병합할 때는 FFmpeg에서 각 파일을 동일한 포맷으로 변환한 후 병합 작업을 수행해야 한다. 이를 위해 FFmpeg의 포맷 변환 옵션을 사용하여 모든 파일을 동일한 비디오 및 오디오 포맷으로 변경할 수 있다. 예를 들어, MOV, AVI, MP4와 같은 포맷을 하나의 MP4 파일로 병합하려면 다음과 같이 처리할 수 있다.

```bash
ffmpeg -i input1.mov -c:v libx264 -c:a aac -strict experimental temp1.mp4
ffmpeg -i input2.avi -c:v libx264 -c:a aac -strict experimental temp2.mp4
ffmpeg -i input3.mp4 -c:v libx264 -c:a aac -strict experimental temp3.mp4
```

세 파일을 모두 MP4 포맷으로 변환한 후에, 병합 명령을 수행한다.

```bash
echo "file 'temp1.mp4'" > file_list.txt
echo "file 'temp2.mp4'" >> file_list.txt
echo "file 'temp3.mp4'" >> file_list.txt
ffmpeg -f concat -safe 0 -i file_list.txt -c copy output.mp4
```

### 오디오와 비디오 병합

오디오와 비디오가 별도로 존재할 때, 두 파일을 병합하여 하나의 파일로 만들 수 있다. 예를 들어, 비디오 파일 `input.mp4`와 오디오 파일 `input.mp3`가 있을 때, 두 파일을 다음과 같이 병합할 수 있다.

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

이 명령어는 비디오 파일의 영상과 오디오 파일의 소리를 결합하여 새로운 `output.mp4` 파일을 생성한다.

### 비디오 병합 시 싱크 문제 해결

비디오를 병합할 때 오디오와 비디오 간의 싱크 문제가 발생할 수 있다. 이런 경우 FFmpeg에서 제공하는 `-async` 옵션을 사용하여 오디오 트랙의 싱크를 자동으로 맞출 수 있다.

```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 [v] [a]" -map "[v]" -map "[a]" output.mp4
```

이 명령어는 두 개의 비디오 파일을 병합하면서 오디오와 비디오 트랙을 동시에 결합하고 싱크를 맞춘다.

### 시간 동기화 문제

병합하려는 비디오의 길이나 프레임 속도가 서로 다를 때, 동기화 문제가 발생할 수 있다. FFmpeg에서 제공하는 `-itsoffset` 옵션을 사용하여 특정 비디오 파일의 시작 시간을 조정할 수 있다.

```bash
ffmpeg -itsoffset 00:00:05 -i input1.mp4 -i input2.mp4 -c copy output.mp4
```

이 명령어는 `input1.mp4`의 시작 시간을 5초 뒤로 밀어 두 비디오 파일을 병합할 때 타임라인을 맞춘다.
