프레임 레이트는 영상에서 1초 동안 재생되는 프레임의 수를 의미하며, 단위는 FPS(Frame Per Second)로 표현된다. FFMPEG에서 프레임 레이트를 조정하는 것은 영상의 재생 속도, 부드러움, 크기 등에 큰 영향을 미친다.

프레임 레이트 개념

프레임 레이트는 영상을 구성하는 각 이미지(프레임)의 재생 빈도를 결정하며, 다양한 프레임 레이트가 존재한다. 예를 들어, 24fps는 영화에서 자주 사용되는 표준이고, 30fps는 TV 프로그램이나 웹에서 자주 사용된다. 또한 60fps는 고속 영상을 부드럽게 표현하기 위해 사용된다.

프레임 레이트를 변경하면 결과 영상의 길이나 품질에 영향을 미칠 수 있다. FFMPEG에서 프레임 레이트를 설정하거나 변경하는 방법에는 두 가지 주요 방식이 있다.

1. 기본 프레임 레이트 설정

FFMPEG에서는 -r 옵션을 사용하여 기본 프레임 레이트를 설정할 수 있다. 이 옵션은 입력과 출력에 모두 사용할 수 있으며, 영상의 재생 속도를 변경하지 않고 단순히 프레임 레이트만 변경한다.

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

위의 명령어는 입력 파일인 input.mp4의 프레임 레이트를 30fps로 설정한 후 output.mp4로 저장한다.

2. 영상 속도 조정과 프레임 레이트

프레임 레이트를 조정하는 것은 단순히 재생 속도만을 의미하지 않는다. 영상의 속도를 실제로 변경하면서 프레임 레이트를 조정할 수도 있다. 이 경우 FFMPEG은 setpts 필터를 사용하여 타임스탬프를 수정한다. setpts 필터는 PTS(Presentation Time Stamp)를 조정하여 영상의 재생 속도를 변화시킨다.

ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4

위의 명령어는 영상의 재생 속도를 두 배로 빠르게 하고, 결과적으로 프레임 레이트도 함께 변경된다.

3. 프레임 레이트와 시간축

프레임 레이트 조정과 관련된 시간 축 변환은 매우 중요한 개념이다. 일반적으로 영상에서 시간은 프레임 번호에 따라 표현될 수 있으며, 이를 수식으로 표현하면 다음과 같다.

t = \frac{n}{\text{fps}}

여기서 t는 시간(초)이고, n은 프레임 번호, \text{fps}는 초당 프레임 수이다. 프레임 레이트가 변경되면 시간 축도 함께 변경된다.

4. 프레임 레이트와 타임스탬프

타임스탬프는 각 프레임의 정확한 시간 정보를 제공하는 중요한 데이터이다. FFMPEG은 각 프레임의 타임스탬프를 기반으로 정확한 재생 시간을 계산한다. 이를 수학적으로 표현하면:

PTS_n = \frac{n}{\mathbf{fps}}

여기서 PTS_nn번째 프레임의 타임스탬프이다. 프레임 레이트를 조정하게 되면, 이 타임스탬프 역시 변경되므로 정확한 시간 관리가 필수적이다.

5. 프레임 레이트 변경에 따른 비트레이트 영향

프레임 레이트를 변경하면, 해당 영상의 비트레이트에도 영향을 미칠 수 있다. 비트레이트는 초당 전송되는 비트 수를 의미하며, 영상의 품질과 크기에 밀접한 관계가 있다. 프레임 레이트가 증가하면 동일한 품질을 유지하기 위해서는 더 많은 데이터를 필요로 하므로 비트레이트가 상승할 수 있다.

비트레이트는 다음과 같은 수식으로 나타낼 수 있다:

\mathbf{비트레이트} = \frac{\mathbf{파일 크기}}{\mathbf{영상 길이}}

만약 프레임 레이트가 증가하여 동일한 길이의 영상에 더 많은 프레임을 추가하게 되면, 파일 크기도 증가하므로 비트레이트가 변하게 된다. 이를 해결하기 위해 FFMPEG에서는 비트레이트를 적절히 조절하는 기능을 제공하며, 주로 -b:v 옵션을 사용한다.

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

위의 명령어는 프레임 레이트를 60fps로 변경하고, 비디오 비트레이트를 1000kbps로 설정한 것이다. 이를 통해 프레임 수가 증가함에 따라 비트레이트를 조정하여 품질을 관리할 수 있다.

6. 특정 구간의 프레임 레이트 조정

FFMPEG에서는 전체 영상이 아닌 특정 구간의 프레임 레이트만 조정하는 것도 가능한다. 이를 위해 -ss-t 옵션을 사용하여 조정할 구간을 선택할 수 있다. 예를 들어, 다음과 같은 명령어로 영상의 처음 10초 동안만 프레임 레이트를 24fps로 변경할 수 있다.

ffmpeg -i input.mp4 -ss 00:00:00 -t 00:00:10 -r 24 output.mp4

위의 명령어는 영상의 처음 10초 구간의 프레임 레이트를 24fps로 조정한다. 이러한 방식으로 영상의 특정 구간만 조정할 수 있다.

7. 고정 프레임 레이트와 가변 프레임 레이트

영상에서는 고정 프레임 레이트(CFR, Constant Frame Rate)와 가변 프레임 레이트(VFR, Variable Frame Rate)의 두 가지 방식이 사용될 수 있다. 고정 프레임 레이트는 일정한 시간 간격으로 프레임이 삽입되는 반면, 가변 프레임 레이트는 영상의 복잡성에 따라 프레임 간격이 변동될 수 있다.

\Delta t = \frac{1}{\mathbf{fps}}

여기서 \Delta t는 프레임 간격(시간)이다. 고정 프레임 레이트에서는 모든 \Delta t가 동일한다.

\Delta t_n = PTS_{n+1} - PTS_n

가변 프레임 레이트를 사용하면 파일 크기를 줄이거나 특정 구간에서 더 부드러운 재생을 구현할 수 있다.

8. 프레임 드랍 및 프레임 중복

프레임 레이트를 조정할 때, 입력 영상의 프레임 레이트와 출력 영상의 프레임 레이트가 다를 경우 FFMPEG은 자동으로 프레임을 삭제(프레임 드랍)하거나 중복(프레임 복제)할 수 있다. 이 과정에서 중요한 것은 영상의 흐름을 최대한 자연스럽게 유지하는 것이며, FFMPEG의 필터 옵션을 통해 이러한 과정을 제어할 수 있다.

n = \frac{\mathbf{fps_{in}}}{\mathbf{fps_{out}}}

이때, \mathbf{fps_{in}}는 입력 프레임 레이트, \mathbf{fps_{out}}는 출력 프레임 레이트이다. 예를 들어 60fps 영상을 30fps로 변환할 경우, 각 두 번째 프레임이 삭제된다.

n = \frac{\mathbf{fps_{out}}}{\mathbf{fps_{in}}}

출력 프레임 레이트가 입력 프레임 레이트보다 두 배가 될 경우, 각 프레임이 두 번씩 삽입된다. 예를 들어, 30fps 영상을 60fps로 변환할 때 모든 프레임이 두 번 반복된다.

9. 복합 프레임 레이트 조정 (Interlaced와 Progressive)

프레임 레이트 조정에서는 인터레이스 방식(interlaced)과 프로그레시브 방식(progressive)의 차이도 고려해야 한다. 인터레이스 영상은 시간차를 두고 두 개의 반프레임이 결합된 방식이고, 프로그레시브 영상은 완전한 프레임이 한 번에 표시된다. 프레임 레이트를 조정할 때, 인터레이스 영상의 경우 추가적인 필터링이 필요하다.

\mathbf{프레임} = \mathbf{반프레임_1} + \mathbf{반프레임_2}
\mathbf{프레임} = \mathbf{완전한 이미지}

FFMPEG에서 인터레이스 영상의 프레임 레이트를 변경할 때는 deinterlace 필터를 사용하여 반프레임을 결합한 후, 프레임 레이트를 조정해야 한다.

ffmpeg -i input.mp4 -vf "yadif" -r 60 output.mp4

위의 명령어는 인터레이스된 영상을 디인터레이스한 후 프레임 레이트를 60fps로 조정하는 예시이다.

10. 고급 프레임 레이트 변환 필터

FFMPEG은 기본적인 프레임 레이트 조정 외에도 다양한 고급 필터를 제공한다. 그 중 하나가 minterpolate 필터로, 입력 프레임 사이에 새로운 프레임을 생성하여 자연스러운 슬로우 모션 또는 프레임 레이트 업스케일링을 수행할 수 있다.

ffmpeg -i input.mp4 -vf "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1'" output.mp4

이 명령어는 움직임 보간 알고리즘을 사용하여 슬로우 모션을 만들거나 프레임 레이트를 자연스럽게 높일 수 있다. 이를 수식적으로 표현하면:

\mathbf{F_{new}} = \mathbf{F_{prev}} + \Delta t \cdot \mathbf{V}

여기서 \mathbf{F_{new}}는 생성된 새로운 프레임, \mathbf{F_{prev}}는 이전 프레임, \Delta t는 시간 간격, \mathbf{V}는 물체의 속도 벡터이다.

FFMPEG의 프레임 레이트 변환은 이렇게 다양한 필터와 옵션을 통해 세밀하게 조정할 수 있다.