비디오 포맷 변환은 비디오 파일을 다른 포맷으로 변환하는 과정이다. 이 과정에서는 비디오 스트림을 인코딩하거나 디코딩하는 작업을 포함하며, 비디오 파일의 구조적 요소인 컨테이너 포맷을 변경하는 작업도 수행한다. FFMPEG은 다양한 비디오 포맷을 지원하고 있으며, 이를 통해 비디오 파일의 호환성을 높이고 품질과 파일 크기를 조정할 수 있다.

입력 파일 선택

FFMPEG에서 비디오 포맷을 변환하려면 먼저 입력 파일을 지정해야 한다. 이를 위해 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4

여기서 -i는 입력 파일을 지정하는 옵션이며, input.mp4는 변환할 비디오 파일을 의미한다. 이때 입력 파일은 FFMPEG이 지원하는 모든 비디오 포맷이 가능하다.

출력 파일 포맷 지정

입력 파일을 지정한 후, 변환할 포맷의 출력 파일을 지정한다. 이때 원하는 포맷으로 파일을 변환하려면, 출력 파일의 확장자를 설정하면 된다. 예를 들어, MP4 파일을 AVI 파일로 변환하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 output.avi

여기서 output.avi는 변환된 파일이며, FFMPEG은 자동으로 파일의 확장자에 따라 적절한 컨테이너 포맷을 설정한다.

코덱 변환

비디오 포맷을 변환할 때 단순히 컨테이너 포맷만 변경하는 것이 아니라 비디오와 오디오 스트림의 코덱도 변경할 수 있다. 이를 위해서는 -c:v (비디오 코덱)와 -c:a (오디오 코덱) 옵션을 사용할 수 있다. 예를 들어, 비디오를 H.264 코덱으로, 오디오를 AAC 코덱으로 변환하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4

여기서 libx264는 H.264 비디오 코덱을, aac는 AAC 오디오 코덱을 의미한다.

비디오 스트림의 샘플링 레이트 조정

비디오 변환 시, 스트림의 샘플링 레이트를 변경하여 최종 비디오의 프레임 속도 및 비디오 품질에 영향을 줄 수 있다. 다음과 같은 명령어를 사용하여 프레임 속도를 변경할 수 있다.

ffmpeg -i input.mp4 -r 24 output.mp4

여기서 -r 24는 비디오의 프레임 속도를 24fps로 설정하는 옵션이다. 프레임 속도가 낮을수록 비디오 품질은 낮아지지만, 파일 크기를 줄일 수 있다.

비디오 포맷 변환 시 품질 설정

비디오 포맷 변환 시, 출력 파일의 품질을 조정할 수 있다. 이를 위해서는 -crf(constant rate factor) 옵션을 사용할 수 있다. 일반적으로 -crf 값이 낮을수록 품질이 높아지며, 파일 크기는 커진다. 예를 들어, 다음 명령어는 높은 품질의 비디오를 생성하는 명령어이다.

ffmpeg -i input.mp4 -c:v libx264 -crf 18 output.mp4

여기서 -crf 18은 높은 품질의 비디오를 생성하며, 기본 값은 23이다.

변환 과정에서의 수학적 모델링

비디오 포맷 변환 과정에서의 품질과 파일 크기는 수학적으로 모델링될 수 있다. 출력 비디오의 품질 Q는 비트레이트 B와 샘플링 레이트 R에 비례하며, 다음과 같은 수식을 따를 수 있다.

Q = f(B, R)

여기서 f는 비트레이트와 샘플링 레이트를 이용한 품질을 계산하는 함수이다. 예를 들어, 비트레이트 B가 증가하면 품질 Q는 증가하지만 파일 크기 C도 함께 증가한다.

C = g(B, R)

위 수식에서 g는 비트레이트와 샘플링 레이트에 따른 파일 크기를 나타내는 함수이다.

비디오 포맷 변환 시 해상도 변경

비디오 포맷을 변환할 때 출력 파일의 해상도를 조정할 수 있다. 이를 위해 -s 옵션을 사용하여 가로와 세로 해상도를 설정할 수 있다. 예를 들어, 다음 명령어는 1280x720 해상도의 비디오를 생성하는 명령어이다.

ffmpeg -i input.mp4 -s 1280x720 output.mp4

여기서 -s 1280x720은 출력 비디오의 해상도를 1280x720으로 설정한다. FFMPEG은 다양한 해상도 설정을 지원하며, 원본 파일의 비율을 유지하면서 해상도를 조정하려면 -vf scale 필터를 사용할 수도 있다.

비율을 유지한 해상도 조정

비디오의 가로세로 비율을 유지하면서 해상도를 변경하고 싶을 때는 -vf(비디오 필터) 옵션과 scale 필터를 사용하여 출력 해상도를 동적으로 조정할 수 있다. 다음 명령어는 출력 비디오의 가로세로 비율을 유지하면서 최대 해상도를 720p로 제한한다.

ffmpeg -i input.mp4 -vf "scale=-1:720" output.mp4

여기서 scale=-1:720은 세로 해상도를 720으로 고정하고, 가로 해상도는 비율에 맞춰 자동으로 조정하는 옵션이다. -1은 비율에 맞춰 계산하라는 의미로 사용된다.

비트레이트 변환

비트레이트는 비디오 파일의 품질과 크기에 중요한 영향을 미치는 요소다. 비디오 포맷 변환 시 비트레이트를 설정하여 파일 크기와 품질을 조정할 수 있다. -b:v 옵션을 사용하여 비디오 비트레이트를 설정할 수 있으며, -b:a 옵션을 사용하여 오디오 비트레이트를 설정할 수 있다.

ffmpeg -i input.mp4 -b:v 2M -b:a 192k output.mp4

위 명령어는 비디오 비트레이트를 2Mbps, 오디오 비트레이트를 192kbps로 설정하여 변환하는 예시이다. 비트레이트는 파일의 크기와 직접적으로 연관이 있기 때문에, 비트레이트가 높을수록 품질이 좋아지고 파일 크기도 커진다.

비트레이트와 품질의 관계

비트레이트 B와 품질 Q의 관계는 다음과 같은 함수로 표현될 수 있다.

Q = h(B)

여기서 h는 비트레이트에 따른 품질을 나타내는 함수다. B가 증가할수록 Q는 비례적으로 증가하지만, 어느 정도 이상부터는 품질 향상의 효과가 감소하는 경향을 보인다. 이는 점차 비트레이트를 높이더라도 체감적인 품질 향상이 크지 않다는 것을 의미한다.

또한, 비트레이트 B가 커질수록 파일의 크기 C도 함께 증가하며, 이 관계는 다음과 같은 함수로 나타낼 수 있다.

C = i(B)

비디오 스트림의 프레임 레이트 변환

비디오 포맷 변환 과정에서 프레임 레이트를 변경할 수 있다. 프레임 레이트는 비디오의 부드러움과 관련된 중요한 요소로, 보통 초당 프레임 수(fps)로 표현된다. 이를 변경하려면 -r 옵션을 사용할 수 있다.

ffmpeg -i input.mp4 -r 30 output.mp4

위 명령어는 비디오의 프레임 레이트를 30fps로 설정하여 변환한다. 프레임 레이트를 높이면 더 부드러운 비디오를 얻을 수 있지만, 그만큼 파일 크기도 커지게 된다.

특정 시간대 비디오 추출

FFMPEG을 사용하여 비디오의 특정 구간을 추출할 수 있다. 이를 위해 -ss(시작 시간)와 -t(지속 시간) 옵션을 사용할 수 있다. 예를 들어, 비디오 파일에서 1분부터 30초간의 구간을 추출하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:30 output.mp4

여기서 -ss 00:01:00은 1분부터 시작하라는 의미이고, -t 00:00:30은 30초 동안의 구간을 추출하라는 뜻이다. 이를 통해 특정 구간만 추출하여 새로운 비디오 파일로 저장할 수 있다.

비디오 필터 적용

비디오 포맷을 변환하는 과정에서 다양한 비디오 필터를 적용하여 출력 파일의 품질이나 스타일을 조정할 수 있다. FFMPEG은 필터 체인을 사용하여 여러 필터를 동시에 적용할 수 있다. 비디오 필터는 -vf(비디오 필터) 옵션을 통해 설정할 수 있으며, 대표적인 필터로는 scale, crop, rotate 등이 있다.

예를 들어, 비디오를 회전시키고 해상도를 조정하는 필터를 동시에 적용하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -vf "scale=1280:720, rotate=PI/2" output.mp4

여기서 scale=1280:720은 해상도를 1280x720으로 조정하는 필터이며, rotate=PI/2는 비디오를 90도 회전시키는 필터이다.

비디오 필터와 행렬 표현

비디오 필터를 적용하는 과정은 수학적으로 다양한 행렬 연산을 통해 모델링될 수 있다. 예를 들어, 비디오의 회전은 회전 행렬 \mathbf{R}을 통해 다음과 같이 나타낼 수 있다.

\mathbf{R} = \begin{pmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{pmatrix}

여기서 \theta는 회전 각도를 나타내며, FFMPEG의 rotate 필터에서는 이 각도를 라디안 값으로 설정할 수 있다. 예를 들어, 90도 회전은 \theta = \frac{\pi}{2}로 설정된다.

비디오 해상도 변환과 행렬

해상도 변환은 비디오 프레임의 크기를 조정하는 작업으로, 이를 수학적으로 해석하면 해상도 조정은 선형 변환 \mathbf{S}을 통해 비디오 프레임의 각 픽셀 위치를 변경하는 작업이다.

\mathbf{S} = \begin{pmatrix} s_x & 0 \\ 0 & s_y \end{pmatrix}

여기서 s_xs_y는 각각 가로와 세로 해상도를 조정하는 비율을 나타낸다. 예를 들어, 원본 비디오가 1920x1080 해상도일 때, 1280x720으로 변환하는 것은 각각의 축에서 0.67의 비율로 축소하는 것을 의미한다.

자막 추가

FFMPEG을 사용하여 비디오에 자막을 추가할 수 있다. 자막 파일은 보통 .srt 포맷으로 제공되며, 이를 비디오에 적용하려면 -vf subtitles 필터를 사용할 수 있다.

ffmpeg -i input.mp4 -vf subtitles=subtitles.srt output.mp4

여기서 subtitles.srt는 자막 파일을 가리키며, 이 자막이 비디오에 오버레이되는 방식으로 적용된다. FFMPEG은 자막의 위치, 폰트, 크기 등을 커스터마이징할 수 있는 기능을 제공한다.

자막 인코딩

FFMPEG은 자막을 별도의 트랙으로 인코딩할 수 있다. 이는 비디오의 자막이 선택적으로 켜거나 꺼질 수 있도록 해주며, -c:s 옵션을 사용하여 자막 코덱을 설정할 수 있다. 예를 들어, mov_text 코덱을 사용하여 MP4 파일에 자막을 추가하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -i subtitles.srt -c:s mov_text output.mp4

여기서 mov_text는 자막을 위한 코덱이며, 이를 통해 비디오 파일 내에 자막 트랙을 포함시킬 수 있다.

오디오 포맷 변환

비디오 포맷을 변환하는 것뿐만 아니라, 비디오에 포함된 오디오 스트림을 다른 포맷으로 변환할 수 있다. 오디오 포맷 변환은 주로 오디오 코덱과 비트레이트를 조정하는 과정에서 이루어지며, FFMPEG에서 제공하는 다양한 옵션을 통해 처리할 수 있다. 예를 들어, MP3 포맷으로 오디오를 변환하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -c:a libmp3lame -b:a 192k output.mp3

여기서 -c:a libmp3lame는 MP3 오디오 코덱을 사용하라는 의미이고, -b:a 192k는 오디오 비트레이트를 192kbps로 설정한다.

오디오 스트림 추출

비디오 파일에서 오디오 스트림만 추출하여 별도의 파일로 저장할 수 있다. 이는 비디오에서 오디오만 필요할 때 유용하며, 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -vn -c:a copy output.aac

여기서 -vn은 비디오 스트림을 제거하고 오디오 스트림만 남긴다는 의미이고, -c:a copy는 원본 오디오 코덱을 그대로 유지하여 복사하는 옵션이다.

오디오 필터 적용

FFMPEG을 사용하여 오디오에 필터를 적용할 수 있으며, 이를 통해 오디오의 특성을 조정하거나 효과를 추가할 수 있다. 대표적인 오디오 필터로는 볼륨 조절, 오디오 채널 변환, 리버브(잔향) 효과 등이 있다. 예를 들어, 볼륨을 두 배로 증가시키는 오디오 필터는 다음과 같이 설정할 수 있다.

ffmpeg -i input.mp4 -af "volume=2.0" output.mp4

여기서 -af는 오디오 필터를 적용하는 옵션이며, volume=2.0은 오디오 볼륨을 두 배로 증가시키라는 의미이다.

오디오 채널 변환

오디오 채널을 변환하여 모노, 스테레오 등의 설정을 변경할 수 있다. 예를 들어, 스테레오 오디오를 모노 오디오로 변환하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -ac 1 output.mp4

여기서 -ac 1은 오디오 채널 수를 1개로 설정하여 모노 오디오로 변환하는 옵션이다.

오디오 변환 시의 수학적 모델링

오디오 포맷 변환과 필터 적용 과정은 수학적으로도 설명될 수 있다. 예를 들어, 오디오 볼륨을 두 배로 증가시키는 것은 오디오 신호 A(t)를 일정한 배율 \alpha로 곱하는 것으로 표현된다.

A'(t) = \alpha \cdot A(t)

여기서 A'(t)는 볼륨이 조정된 오디오 신호이며, \alpha = 2.0인 경우 오디오 볼륨이 두 배로 증가한다.

여러 입력 파일 병합

FFMPEG을 사용하여 여러 개의 비디오 또는 오디오 파일을 하나의 파일로 병합할 수 있다. 이를 위해 여러 입력 파일을 지정하고 concat 필터를 사용할 수 있다. 예를 들어, 두 개의 MP4 파일을 병합하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]concat=n=2:v=1:a=0" output.mp4

여기서 concat=n=2:v=1:a=0는 두 개의 비디오 파일을 하나로 병합하되, 오디오는 제외한다는 의미이다. 만약 오디오도 함께 병합하려면 a=1로 설정할 수 있다.

파일 분할

비디오 파일을 일정한 시간 간격으로 분할하여 여러 파일로 나눌 수 있다. 예를 들어, 10분짜리 비디오 파일을 2분씩 분할하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -c copy -f segment -segment_time 120 output%03d.mp4

여기서 -f segment는 파일을 분할하는 포맷을 의미하며, -segment_time 120은 120초(2분) 단위로 분할하라는 옵션이다. output%03d.mp4는 분할된 파일의 이름을 지정하는데, %03d는 파일 번호가 3자리 숫자로 추가됨을 의미한다.

파일 자르기

비디오 파일의 특정 구간을 잘라내어 필요한 부분만 새로운 파일로 저장할 수 있다. 이를 위해 -ss-to 옵션을 사용할 수 있다. 예를 들어, 1분 30초부터 3분 15초까지의 구간만 잘라내려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -ss 00:01:30 -to 00:03:15 -c copy output.mp4

여기서 -ss 00:01:30은 시작 시간을 1분 30초로 설정하고, -to 00:03:15은 종료 시간을 3분 15초로 설정한다. -c copy는 인코딩 없이 원본 코덱을 그대로 유지하면서 자르기를 수행한다는 의미이다.

파일 길이 조정

비디오 파일의 길이를 조정하여 시간을 압축하거나 확장할 수 있다. 이는 보통 비디오 속도와 관련이 있으며, -filter:v "setpts" 필터를 사용하여 설정할 수 있다. 예를 들어, 비디오의 속도를 두 배로 빠르게 하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4

여기서 setpts=0.5*PTS는 비디오 타임스탬프를 절반으로 줄여 비디오의 재생 속도를 두 배로 빠르게 한다는 의미이다. 반대로 속도를 느리게 하고 싶다면, 배율을 2.0으로 설정할 수 있다.

비디오에서 오디오 추출

비디오 파일에서 오디오 스트림만 추출하여 별도의 파일로 저장할 수 있다. 이를 위해 -vn(비디오 제외) 옵션을 사용할 수 있다. 예를 들어, MP4 파일에서 AAC 오디오를 추출하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -vn -c:a copy output.aac

여기서 -vn은 비디오를 제외하고, -c:a copy는 오디오를 인코딩 없이 그대로 복사하라는 의미이다.

오디오에서 비디오 추출

오디오 파일에 비디오가 포함된 경우, 오디오만 제외하고 비디오만 추출할 수 있다. 이를 위해 -an(오디오 제외) 옵션을 사용하면 된다. 예를 들어, 비디오 파일에서 오디오를 제외하고 비디오만 추출하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -an -c:v copy output.mp4

여기서 -an은 오디오를 제외하고, -c:v copy는 비디오를 인코딩 없이 그대로 복사하라는 의미이다.

특정 시간대 비디오 추출

비디오의 특정 구간을 추출하려면 시작 시간과 종료 시간을 명시하여 필요한 부분만 추출할 수 있다. 예를 들어, 2분부터 5분까지의 비디오를 추출하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -ss 00:02:00 -to 00:05:00 -c copy output.mp4

이 명령어는 2분부터 5분까지의 구간만 추출하여 새로운 비디오 파일로 저장한다.

특정 시간대 오디오 추출

비디오 파일에서 특정 구간의 오디오만 추출할 수도 있다. 예를 들어, 1분부터 2분 30초까지의 구간을 추출하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:30 -vn -c:a copy output.aac

이 명령어는 1분부터 2분 30초까지의 구간에서 오디오만 추출하여 AAC 파일로 저장한다.

비디오 자르기 및 병합

비디오의 여러 구간을 잘라내어 병합할 수 있다. 이를 위해 먼저 각 구간을 잘라낸 후, concat 필터를 사용하여 병합할 수 있다. 예를 들어, 1분부터 2분 구간과 3분부터 4분 구간을 병합하려면 먼저 각 구간을 잘라내고, 이를 병합할 수 있다.

ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy part1.mp4
ffmpeg -i input.mp4 -ss 00:03:00 -to 00:04:00 -c copy part2.mp4
ffmpeg -i "concat:part1.mp4|part2.mp4" -c copy output.mp4

이 명령어는 두 구간을 잘라내어 각각의 파일로 저장한 후, 두 파일을 하나로 병합한다.

오디오 자르기 및 병합

오디오 파일도 비슷한 방식으로 잘라내고 병합할 수 있다. 다음 명령어는 오디오의 두 구간을 잘라내고 병합하는 예시이다.

ffmpeg -i input.mp4 -ss 00:00:30 -to 00:01:00 -vn -c:a copy audio_part1.aac
ffmpeg -i input.mp4 -ss 00:02:00 -to 00:02:30 -vn -c:a copy audio_part2.aac
ffmpeg -i "concat:audio_part1.aac|audio_part2.aac" -c copy output.aac

이 명령어는 오디오의 두 구간을 잘라내어 병합한다.

비디오/오디오 동기화

비디오와 오디오가 동기화되지 않는 경우, FFMPEG을 사용하여 이를 조정할 수 있다. 오디오 스트림을 앞당기거나 지연시키기 위해 -itsoffset 옵션을 사용할 수 있다. 예를 들어, 오디오를 1초 앞당기려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -itsoffset -00:00:01 -i input.mp4 -map 0:v -map 1:a -c copy output.mp4

여기서 -itsoffset -00:00:01은 오디오 스트림을 1초 앞당긴다는 의미이다.

메타데이터 관리

FFMPEG은 비디오 파일에 포함된 메타데이터를 읽고 수정할 수 있는 기능을 제공한다. 메타데이터는 파일의 제목, 저작권 정보, 제작자, 앨범 정보 등과 같은 부가적인 데이터를 포함한다. 메타데이터를 확인하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4

이 명령어는 입력 파일의 메타데이터를 포함한 다양한 정보를 출력한다.

메타데이터 추가 및 수정

비디오 파일에 메타데이터를 추가하거나 수정하려면 -metadata 옵션을 사용할 수 있다. 예를 들어, 비디오 파일의 제목과 저작권 정보를 추가하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -metadata title="Sample Video" -metadata copyright="Copyright 2024" output.mp4

이 명령어는 비디오 파일의 메타데이터에 제목과 저작권 정보를 추가한다.

스트리밍 설정

FFMPEG은 비디오 파일을 스트리밍할 수 있도록 설정할 수 있으며, 이를 위해 주로 RTMP(Real-Time Messaging Protocol) 또는 HTTP를 사용한다. 스트리밍 설정을 하려면 먼저 비디오 파일을 적절한 포맷으로 인코딩한 후, 스트리밍 서버로 전송해야 한다.

예를 들어, RTMP 프로토콜을 사용하여 스트리밍 서버로 비디오를 전송하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -re -i input.mp4 -c:v libx264 -f flv rtmp://server/live/stream

여기서 -re는 입력 파일의 재생 속도를 그대로 유지하면서 스트리밍한다는 의미이며, -f flv는 RTMP 프로토콜에서 주로 사용되는 FLV 포맷으로 비디오를 전송하라는 뜻이다.

라이브 스트리밍 변환

라이브 스트리밍을 설정할 때 FFMPEG을 사용하여 실시간으로 비디오를 인코딩하고 변환할 수 있다. 라이브 스트리밍 시에는 실시간 비디오 입력을 처리해야 하며, 예를 들어 카메라에서 직접 비디오를 받아 변환할 수 있다.

ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -f flv rtmp://server/live/stream

이 명령어는 카메라 /dev/video0에서 입력을 받아 RTMP 서버로 스트리밍하는 예시이다. 이때 비디오 인코딩은 H.264로 설정된다.

RTMP/HTTP 스트리밍 설정

FFMPEG을 사용하여 RTMP나 HTTP 프로토콜을 통해 스트리밍을 설정할 수 있다. RTMP는 실시간 스트리밍에 자주 사용되며, HTTP는 비디오 파일을 요청에 따라 제공하는 데 사용된다. HTTP를 통해 스트리밍을 설정하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -f mpegts http://localhost:8080

이 명령어는 MPEG-TS 포맷을 사용하여 HTTP 서버를 통해 비디오를 제공하는 예시이다.

다중 트랙 지원

FFMPEG은 하나의 비디오 파일에서 여러 개의 트랙(비디오, 오디오, 자막 등)을 지원하며, 이를 병합하거나 분리할 수 있다. 예를 들어, 비디오 파일에서 오디오와 비디오 트랙을 각각 추출하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -map 0:v -map 0:a -c copy video_only.mp4 -c copy audio_only.mp4

이 명령어는 비디오 트랙과 오디오 트랙을 별도의 파일로 저장한다.

비디오 속도 조정

비디오의 속도를 조정하려면 -filter:v "setpts" 필터를 사용하여 비디오의 재생 시간을 변경할 수 있다. 예를 들어, 비디오의 속도를 2배로 빠르게 하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" output.mp4

여기서 setpts=0.5*PTS는 비디오의 시간을 절반으로 줄여 속도를 두 배로 빠르게 한다는 의미이다.

오디오 속도 조정

오디오의 속도를 조정하려면 -filter:a 필터를 사용하여 재생 속도를 조정할 수 있다. 예를 들어, 오디오의 속도를 두 배로 빠르게 하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -filter:a "atempo=2.0" output.mp4

여기서 atempo=2.0은 오디오의 속도를 두 배로 빠르게 한다는 의미이다. 반대로, 속도를 느리게 하려면 atempo=0.5로 설정할 수 있다.

비디오 품질 최적화

비디오 품질을 최적화하려면 비트레이트, 코덱 설정, 해상도 등을 적절히 조정해야 한다. 특히 -crf 옵션은 비디오 품질과 파일 크기 사이의 균형을 맞추는 중요한 역할을 한다. 다음 명령어는 H.264 코덱을 사용하여 품질을 최적화하는 예시이다.

ffmpeg -i input.mp4 -c:v libx264 -crf 18 output.mp4

여기서 -crf 18은 고품질을 나타내며, 값이 낮을수록 더 높은 품질을 의미한다. 일반적으로 -crf 18에서 -crf 23 사이의 값이 권장된다.

오디오 품질 최적화

오디오 품질을 최적화하려면 비트레이트와 코덱을 적절히 설정해야 한다. 오디오 비트레이트가 높을수록 품질이 높아지지만, 파일 크기 또한 커진다. 다음 명령어는 오디오 품질을 256kbps로 설정하는 예시이다.

ffmpeg -i input.mp4 -b:a 256k output.mp4

여기서 -b:a 256k는 오디오 비트레이트를 256kbps로 설정하는 옵션이다. 고품질 오디오를 원한다면 이 값을 더 높일 수 있다.

비디오 회전 및 뒤집기

비디오를 회전하거나 뒤집는 작업은 FFMPEG에서 transpose 필터를 사용하여 수행할 수 있다. transpose 필터는 비디오를 90도 단위로 회전시킬 수 있으며, vfliphflip 필터를 사용하여 비디오를 수직 및 수평으로 뒤집을 수 있다.

예를 들어, 비디오를 90도 시계 방향으로 회전하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

여기서 transpose=1은 시계 방향으로 90도 회전시키는 필터다. 비디오를 180도 회전하려면 transpose=2를 사용할 수 있다.

비디오를 수직으로 뒤집으려면 vflip 필터를 사용하고, 수평으로 뒤집으려면 hflip 필터를 사용할 수 있다.

ffmpeg -i input.mp4 -vf "vflip" output.mp4
ffmpeg -i input.mp4 -vf "hflip" output.mp4

비디오 화면 비율 조정

비디오의 가로세로 비율(Aspect Ratio)을 조정하려면 -aspect 옵션을 사용하여 지정할 수 있다. 예를 들어, 16:9 비율로 비디오를 설정하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -aspect 16:9 output.mp4

이 옵션은 비디오의 가로세로 비율을 강제로 설정하는 역할을 하며, 원본 비율과 일치하지 않는 경우 비디오의 외관이 왜곡될 수 있다. 따라서 비율을 변경할 때는 해상도와 함께 조정하는 것이 중요하다.

오디오 채널 변환

오디오 파일의 채널을 변환할 수 있으며, 예를 들어 스테레오 오디오를 모노 오디오로 변환하거나 그 반대로 설정할 수 있다. 이를 위해 -ac 옵션을 사용한다. 다음 명령어는 모노 오디오로 변환하는 예시이다.

ffmpeg -i input.mp4 -ac 1 output.mp4

여기서 -ac 1은 오디오를 모노로 변환하는 옵션이다. 반대로 스테레오로 변환하려면 -ac 2를 사용한다.

무손실 변환

FFMPEG을 사용하여 품질을 손상시키지 않고 무손실로 변환할 수 있다. 이를 위해 무손실 코덱을 사용하거나 -q:v 0 옵션을 사용할 수 있다. 예를 들어, H.264 코덱을 사용하여 무손실 비디오를 생성하려면 다음과 같은 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -c:v libx264 -crf 0 output.mp4

여기서 -crf 0은 무손실 품질을 의미하며, 비디오의 품질을 유지하면서 압축을 수행한다. 하지만 무손실 변환은 파일 크기가 매우 커질 수 있다.

하드웨어 가속 설정

FFMPEG은 하드웨어 가속을 지원하여 비디오 인코딩 및 디코딩 속도를 크게 향상시킬 수 있다. 이를 위해 GPU를 사용할 수 있으며, NVIDIA의 NVENC 또는 VAAPI와 같은 하드웨어 가속 기술을 사용할 수 있다.

예를 들어, NVIDIA GPU를 사용하여 H.264 비디오를 인코딩하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -c:v h264_nvenc output.mp4

여기서 h264_nvenc는 NVIDIA NVENC를 사용하여 H.264 코덱으로 비디오를 인코딩한다는 의미이다.

GPU 인코딩/디코딩

GPU를 사용한 비디오 인코딩 및 디코딩은 CPU보다 훨씬 빠르게 처리될 수 있으며, 주로 대용량 비디오 파일을 다룰 때 유리하다. FFMPEG은 NVIDIA의 NVENC 및 AMD의 VCE와 같은 다양한 하드웨어 가속 옵션을 지원하며, 이를 통해 인코딩 속도를 크게 향상시킬 수 있다.

예를 들어, 다음 명령어는 NVIDIA NVENC를 사용하여 H.265 비디오를 인코딩하는 예시이다.

ffmpeg -i input.mp4 -c:v hevc_nvenc output.mp4

이 명령어는 H.265(HEVC) 코덱을 사용하여 비디오를 인코딩한다.

다중 코덱 사용

FFMPEG은 하나의 파일 내에서 여러 개의 비디오 또는 오디오 코덱을 사용할 수 있다. 예를 들어, 비디오 스트림은 H.264 코덱으로, 오디오 스트림은 AAC 코덱으로 인코딩할 수 있다.

ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4

이 명령어는 비디오 스트림은 H.264 코덱으로, 오디오 스트림은 AAC 코덱으로 각각 인코딩한다.

다중 파일 변환

FFMPEG을 사용하여 여러 파일을 동시에 변환할 수 있으며, 이를 위해 -i 옵션을 여러 번 사용할 수 있다. 예를 들어, 두 개의 비디오 파일을 동시에 변환하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input1.mp4 -i input2.mp4 -c:v libx264 output1.mp4 output2.mp4

이 명령어는 두 개의 입력 파일을 각각 변환하여 두 개의 출력 파일을 생성한다.

파일 포맷 자동 감지

FFMPEG은 입력 파일의 포맷을 자동으로 감지하여 처리할 수 있다. 파일의 확장자나 내부 구조를 기반으로 포맷을 감지하며, 이에 따라 적절한 코덱을 선택하여 변환 작업을 수행한다. 이 과정에서 특별한 옵션을 지정하지 않아도 되므로 사용자는 입력 파일을 지정하기만 하면 된다.

실시간 미리보기

FFMPEG을 사용하여 실시간으로 변환 중인 비디오의 미리보기를 확인할 수 있다. 변환 작업을 수행하면서 동시에 비디오를 화면에 출력하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -vf "scale=1280:720" -f sdl2 -

이 명령어는 변환 작업을 수행하는 동안 비디오를 1280x720 해상도로 축소하여 실시간으로 화면에 출력한다.

FFmpeg 로그 관리

FFMPEG은 변환 과정에서 다양한 로그를 생성하며, 이 로그는 변환 상태를 모니터링하거나 오류를 디버깅하는 데 유용하다. 로그의 수준을 조정하려면 -loglevel 옵션을 사용할 수 있으며, quiet, error, warning, info, verbose, debug와 같은 다양한 수준을 지원한다.

예를 들어, 로그 수준을 info로 설정하려면 다음 명령어를 사용할 수 있다.

ffmpeg -i input.mp4 -loglevel info output.mp4

이 명령어는 변환 과정에서 중요한 정보만 출력하는 로그 수준을 설정한다.