# 입력 파일 처리

FFmpeg에서 입력 파일을 처리하는 방식은 매우 유연하며 다양한 형식의 파일을 지원한다. 입력 파일을 지정할 때는 주로 명령어에 `-i` 옵션을 사용하여 파일 경로를 입력한다. 이 옵션을 통해 비디오, 오디오, 이미지 시퀀스 등 다양한 형식의 입력 파일을 처리할 수 있다. 이제 입력 파일 처리에 대한 세부적인 내용을 살펴보겠다.

#### 1. 기본 입력 파일 구조

입력 파일을 지정하는 기본 구조는 다음과 같다:

```
ffmpeg -i input_file [output_options] output_file
```

여기서 `input_file`은 FFmpeg이 처리할 입력 파일을 의미한다. 입력 파일은 로컬에 저장된 파일일 수도 있고, 네트워크 스트림, HTTP, RTMP, RTP, 또는 다른 스트리밍 프로토콜을 통해 전달되는 데이터일 수도 있다.

#### 2. 여러 개의 입력 파일 처리

FFmpeg는 한 번의 명령으로 여러 개의 입력 파일을 처리할 수 있다. 각 입력 파일마다 `-i` 옵션을 사용하여 여러 파일을 동시에 지정할 수 있다. 예를 들어, 두 개의 입력 파일을 처리하는 구조는 다음과 같다:

```
ffmpeg -i input1.mp4 -i input2.mp4 [output_options] output_file
```

이 경우, 두 개의 비디오를 하나의 파일로 합치거나 병합하는 등의 작업이 가능한다. 여러 입력 파일을 처리할 때에는 각 입력 파일에 대한 정보가 명확히 정의되어야 한다.

#### 3. 이미지 시퀀스 입력

FFmpeg는 연속된 이미지 파일을 하나의 비디오 파일로 변환할 수 있다. 이미지 시퀀스를 입력으로 사용할 때에는 이미지 파일이 일관된 파일명 형식을 가져야 한다. 예를 들어, `image_%03d.png`와 같이 정의하면, `image_001.png`, `image_002.png` 등의 파일을 FFmpeg이 자동으로 읽어들이다.

```
ffmpeg -i image_%03d.png -r 30 output.mp4
```

여기서 `-r 30`은 초당 30 프레임의 비디오 파일로 변환하는 것을 의미한다.

#### 4. 네트워크 스트림 입력

FFmpeg는 네트워크 스트림을 입력으로 받을 수 있다. HTTP, RTSP, RTP와 같은 프로토콜을 통해 데이터를 스트리밍하는 경우, 이를 입력으로 지정할 수 있다. 예를 들어, HTTP 스트림을 입력으로 받는 경우는 다음과 같다:

```
ffmpeg -i http://example.com/stream.m3u8 -c copy output.mp4
```

이 경우, 스트림을 변환하지 않고 그대로 복사(`-c copy`)하여 저장하는 방법을 사용한다.

#### 5. 다양한 입력 형식 지원

FFmpeg는 다양한 형식의 입력 파일을 지원한다. 오디오, 비디오, 이미지 등의 파일을 모두 입력으로 사용할 수 있으며, 다음과 같은 대표적인 파일 형식이 있다:

* 비디오 파일: `.mp4`, `.mkv`, `.avi`, `.mov` 등
* 오디오 파일: `.mp3`, `.wav`, `.aac` 등
* 이미지 파일: `.png`, `.jpg`, `.bmp` 등
* 스트리밍 파일: HTTP, RTSP, RTP 등 다양한 프로토콜을 통한 스트림 입력

FFmpeg는 이러한 다양한 형식을 자동으로 인식하고 적절한 코덱과 설정을 적용한다.

#### 6. 시간대 선택을 통한 입력 파일 처리

FFmpeg는 입력 파일에서 특정 시간대만을 선택하여 처리할 수 있다. 이를 위해 `-ss`와 `-t` 옵션을 사용할 수 있다. `-ss`는 입력 파일에서 시작할 시간을 지정하며, `-t`는 선택한 구간의 길이를 설정한다. 예를 들어, 10초부터 시작하여 20초간의 비디오를 처리하는 명령어는 다음과 같다:

```
ffmpeg -ss 00:00:10 -t 00:00:20 -i input.mp4 output.mp4
```

이 명령은 10초부터 20초 구간의 비디오만 추출하여 `output.mp4`에 저장한다.

#### 7. 특정 오디오 트랙 또는 비디오 스트림 선택

입력 파일에 여러 개의 오디오 트랙 또는 비디오 스트림이 있을 경우, 특정 트랙이나 스트림만을 선택하여 처리할 수 있다. FFmpeg에서 `-map` 옵션을 사용하여 원하는 스트림을 선택할 수 있다. 기본적으로 FFmpeg는 첫 번째 비디오 스트림과 첫 번째 오디오 스트림을 처리하지만, `-map` 옵션을 사용하면 보다 세밀하게 스트림을 선택할 수 있다.

예를 들어, 두 번째 비디오 스트림과 첫 번째 오디오 스트림을 선택하는 명령어는 다음과 같다:

```
ffmpeg -i input.mp4 -map 0:v:1 -map 0:a:0 output.mp4
```

여기서 `0:v:1`은 첫 번째 입력 파일의 두 번째 비디오 스트림을 의미하고, `0:a:0`은 첫 번째 오디오 스트림을 의미한다.

#### 8. 입력 파일의 시간대 설정 및 동기화

FFmpeg에서는 입력 파일의 시작 시간을 `-itsoffset` 옵션으로 조정할 수 있다. 예를 들어, 두 개의 입력 파일을 병합할 때, 두 번째 입력 파일이 첫 번째 입력 파일보다 5초 후에 시작되도록 설정하려면 다음과 같이 명령어를 사용할 수 있다:

```
ffmpeg -i input1.mp4 -itsoffset 5 -i input2.mp4 -c copy output.mp4
```

이 명령은 두 번째 입력 파일이 첫 번째 파일보다 5초 후에 시작되도록 하여 병합한다.

#### 9. 입력 파일의 비트레이트 및 샘플레이트 설정

FFmpeg는 입력 파일의 비트레이트와 샘플레이트를 처리하는 옵션을 제공한다. 오디오 파일의 경우 `-ar` 옵션으로 샘플레이트를 설정할 수 있으며, 비디오 파일의 경우 `-b:v` 옵션으로 비트레이트를 설정할 수 있다.

예를 들어, 44100Hz 샘플레이트의 오디오 파일을 처리하려면 다음과 같이 명령어를 사용할 수 있다:

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

비디오 파일의 경우, 1000k 비트레이트로 변환하는 명령은 다음과 같다:

```
ffmpeg -i input.mp4 -b:v 1000k output.mp4
```

#### 10. 입력 파일의 해상도 및 프레임 레이트 조정

FFmpeg는 입력 파일의 해상도와 프레임 레이트를 조정할 수 있는 옵션을 제공한다. 해상도를 조정하기 위해 `-s` 옵션을 사용하며, 프레임 레이트를 조정하기 위해 `-r` 옵션을 사용할 수 있다.

예를 들어, 해상도를 1280x720으로 변경하고 프레임 레이트를 30fps로 설정하는 명령어는 다음과 같다:

```
ffmpeg -i input.mp4 -s 1280x720 -r 30 output.mp4
```

이 명령은 입력 파일을 처리하여 해상도를 1280x720으로 조정하고 30fps로 출력 파일을 생성한다.

#### 11. 입력 파일에서 특정 채널 선택

입력 파일에 여러 오디오 채널이 있는 경우, 특정 채널만 선택하여 처리할 수 있다. FFmpeg는 `-map_channel` 옵션을 사용하여 특정 채널을 선택할 수 있다. 예를 들어, 입력 파일이 스테레오 오디오(왼쪽과 오른쪽 채널)를 포함하고 있을 때, 왼쪽 채널만을 선택하여 모노 파일로 변환하는 명령은 다음과 같다:

```
ffmpeg -i input.mp3 -map_channel 0.0.0 output_left.wav
```

여기서 `0.0.0`은 첫 번째 입력 파일의 첫 번째 오디오 스트림(왼쪽 채널)을 의미한다.

#### 12. 입력 파일에서 메타데이터 처리

FFmpeg는 입력 파일의 메타데이터를 읽고 이를 처리할 수 있다. 메타데이터는 제목, 작곡가, 트랙 번호 등 다양한 정보를 포함할 수 있으며, `-metadata` 옵션을 사용하여 메타데이터를 추가하거나 수정할 수 있다.

예를 들어, 입력 파일에 제목을 추가하는 명령은 다음과 같다:

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

이 명령은 입력 파일에 'My Video'라는 제목을 추가하여 새로운 파일로 저장한다.

#### 13. 비디오 및 오디오 스트림을 분리

입력 파일에서 비디오와 오디오 스트림을 별도로 분리하여 처리할 수 있다. 이 경우 `-vn`(비디오 없음) 또는 `-an`(오디오 없음) 옵션을 사용하여 특정 스트림을 제거할 수 있다.

예를 들어, 입력 파일에서 비디오 스트림만 추출하여 출력 파일로 저장하는 명령은 다음과 같다:

```
ffmpeg -i input.mp4 -an output_video.mp4
```

반대로, 오디오 스트림만 추출하는 명령은 다음과 같다:

```
ffmpeg -i input.mp4 -vn output_audio.mp3
```

#### 14. 비디오 또는 오디오 스트림 변환 없이 입력 처리

때때로 입력 파일을 변환하지 않고 스트림을 그대로 복사하여 처리하고자 할 때 `-c copy` 옵션을 사용할 수 있다. 이 옵션은 입력 스트림을 변환하지 않고 그대로 복사하여 출력 파일로 저장한다.

```
ffmpeg -i input.mp4 -c copy output.mp4
```

이 명령은 변환 과정 없이 입력 파일을 그대로 복사하여 처리한다. 스트리밍 또는 동일한 코덱으로 파일을 처리할 때 유용한 옵션이다.

#### 15. 입력 파일의 정보 확인

입력 파일의 세부 정보를 확인하고 싶을 때, FFmpeg는 `-i` 옵션을 사용하여 파일 정보를 출력할 수 있다. 이 명령은 입력 파일의 코덱, 해상도, 프레임 레이트, 오디오 형식 등을 보여준다.

```
ffmpeg -i input.mp4
```

이 명령은 입력 파일의 비디오 및 오디오 스트림 정보를 출력하는데 유용하다. 이 정보를 바탕으로 파일을 처리하기 전, 필요한 설정을 결정할 수 있다.

#### 16. 입력 파일의 시간 범위 제한

FFmpeg는 입력 파일의 처리 시간을 제한하여 일정 구간만 처리할 수 있다. `-t` 옵션은 입력 파일을 처리할 때 제한할 시간을 설정하는 데 사용된다.

```
ffmpeg -i input.mp4 -t 00:01:00 output.mp4
```

이 명령은 입력 파일의 첫 1분만을 처리하여 출력 파일로 저장한다. `-t` 옵션은 짧은 구간만 처리하고자 할 때 유용하게 사용된다.

#### 17. 입력 파일의 특정 프레임 추출

FFmpeg는 입력 파일에서 특정 시간대의 프레임을 추출할 수 있다. `-ss` 옵션을 사용하여 특정 시간대의 프레임을 지정하고, 이미지 파일로 추출할 수 있다. 예를 들어, 비디오 파일의 30초 지점에서 프레임을 추출하려면 다음과 같은 명령어를 사용할 수 있다:

```
ffmpeg -ss 00:00:30 -i input.mp4 -frames:v 1 output.png
```

여기서 `-frames:v 1`은 한 개의 프레임만 추출하겠다는 의미이다. 이 명령은 30초 지점에서 프레임을 추출하여 이미지로 저장한다.

#### 18. 이미지 시퀀스에서 비디오 생성

FFmpeg는 여러 이미지 파일을 입력으로 받아 비디오 파일을 생성할 수 있다. 이미지 파일이 연속적으로 이름이 지정되어 있을 때, 이를 비디오로 변환할 수 있다. 예를 들어, `image_001.png`, `image_002.png` 등의 이미지 파일을 입력으로 받아 비디오를 생성하는 방법은 다음과 같다:

```
ffmpeg -i image_%03d.png -r 30 output.mp4
```

여기서 `%03d`는 세 자리 숫자로 된 이미지 파일명을 의미하며, `-r 30`은 초당 30 프레임으로 비디오를 생성하는 것을 나타낸다.

#### 19. 오디오와 비디오를 함께 처리

FFmpeg는 비디오 파일과 오디오 파일을 각각 입력으로 받아 하나의 파일로 병합할 수 있다. 두 파일을 각각 입력으로 받아 비디오와 오디오를 하나의 출력 파일로 저장하는 예시는 다음과 같다:

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

이 명령은 비디오와 오디오를 변환하여 `output.mp4` 파일에 병합한다. 비디오 스트림은 변환하지 않고 그대로 복사(`-c:v copy`), 오디오 스트림은 AAC 코덱으로 변환(`-c:a aac`)하여 저장된다.

#### 20. 다양한 입력 포맷 및 프로토콜 지원

FFmpeg는 다양한 입력 포맷과 프로토콜을 지원하며, 이를 통해 파일 변환뿐 아니라 실시간 스트리밍 데이터도 처리할 수 있다. 주요 입력 포맷 및 프로토콜에는 다음과 같은 것들이 포함된다:

* 비디오 파일: `.mp4`, `.avi`, `.mkv`, `.mov` 등
* 오디오 파일: `.mp3`, `.aac`, `.wav` 등
* 이미지 파일: `.jpg`, `.png`, `.bmp` 등
* 스트리밍 프로토콜: HTTP, RTSP, RTP 등

이러한 다양한 입력 포맷과 프로토콜을 지원함으로써 FFmpeg는 매우 유연한 파일 처리 도구로 활용될 수 있다.

#### 21. 입출력 파일 포맷 자동 감지

FFmpeg는 입력 파일과 출력 파일의 확장자를 자동으로 인식하고, 적절한 코덱 및 포맷을 설정한다. 별도로 포맷을 지정하지 않으면, 입력 파일의 확장자와 포맷에 따라 자동으로 코덱이 설정된다. 예를 들어, `.mp4` 확장자를 사용하면 자동으로 MP4 컨테이너와 관련된 코덱을 사용하여 파일을 처리한다.

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

이 명령은 AVI 파일을 MP4 파일로 자동 변환한다. FFmpeg가 자동으로 입력 및 출력 파일의 포맷을 감지하여 적절한 코덱을 선택하는 방식이다.
