기본 개념

FFmpeg에서 비디오의 속도를 조정하는 것은 주로 프레임 레이트(Frame Rate)와 타임스탬프(Timestamp)의 조작을 통해 이루어진다. 비디오 속도는 프레임을 시간 축에 어떻게 배치하느냐에 따라 달라지므로, 프레임의 간격을 줄이거나 늘리는 방식으로 조정할 수 있다.

비디오 속도 조정은 두 가지 방식으로 나눌 수 있다: 1. 프레임 속도를 변경하지 않고 재생 속도를 조정하는 방법 2. 프레임 속도를 직접 변경하여 속도를 조정하는 방법

1. 타임스탬프 조작을 통한 속도 조정

타임스탬프는 각 프레임이 재생될 시간 정보를 나타낸다. 타임스탬프를 조정하면 프레임 간 간격이 변동되어 비디오의 속도를 조절할 수 있다. 예를 들어, 모든 타임스탬프를 절반으로 줄이면 비디오는 두 배 빠르게 재생된다. 반대로 타임스탬프를 두 배로 늘리면 비디오는 절반의 속도로 재생된다.

이때 사용되는 FFmpeg 명령어는 다음과 같다:

ffmpeg -i input.mp4 -filter:v "setpts=PTS/2" output.mp4

여기서 setpts=PTS/2프레젠테이션 타임스탬프(Presentation Timestamp, PTS)를 절반으로 줄이는 필터이다. 즉, 비디오가 2배 빠르게 재생된다.

\text{new\_pts} = \frac{\text{PTS}}{N}

위의 식에서 N은 속도 변경 계수로, N = 2인 경우 속도가 두 배가 된다.

2. 프레임 속도를 변경하는 방법

비디오의 프레임 속도 자체를 변경하는 방식도 있다. 이 방법은 프레임 레이트(Frame Rate)를 바꿔 비디오의 속도를 조절하는 것이다. 프레임 레이트는 초당 재생되는 프레임의 수를 의미하며, 단위는 FPS(Frames Per Second)로 나타낸다.

예를 들어, 30fps 비디오를 60fps로 변환하면 비디오가 두 배로 빠르게 재생된다. 이때 사용하는 명령어는 다음과 같다:

ffmpeg -i input.mp4 -r 60 output.mp4
\text{New Frame Rate} = \text{Old Frame Rate} \times N

위의 식에서 N은 비디오 속도를 조정하는 배수이다. 프레임 레이트를 30fps에서 60fps로 변경하면 N = 2이다.

3. 프레임 간 간격과 속도 관계

프레임 간 간격(시간)을 조정하면 비디오 속도가 변한다. 프레임 간 간격을 줄이면 비디오가 빨라지고, 간격을 늘리면 비디오가 느려진다. 시간 간격을 T라 하고, 프레임 수를 F라고 하면, 비디오의 재생 시간 t는 다음과 같다:

t = \frac{F}{\text{Frame Rate}}
T = \frac{1}{\text{Frame Rate}}

따라서, 프레임 간 시간을 절반으로 줄이면 속도는 두 배로 빨라지고, 시간을 두 배로 늘리면 속도는 절반으로 느려진다.

4. 비디오 속도 조정 시 주의 사항

비디오 속도를 조정할 때 주의해야 할 몇 가지 사항이 있다. 먼저, 비디오의 속도가 변경되면 그에 맞춰 오디오도 속도가 변동되므로, 오디오와 비디오의 동기화 문제가 발생할 수 있다. 이를 해결하기 위해 오디오 속도도 비디오와 동일하게 조정해야 한다.

FFmpeg에서 오디오의 속도도 비디오 속도에 맞춰 변경하려면 다음과 같은 명령어를 사용할 수 있다:

ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=PTS/2[v];[0:a]atempo=2[a]" -map "[v]" -map "[a]" output.mp4

여기서 atempo=2는 오디오의 재생 속도를 두 배로 조정하는 필터이다. FFmpeg에서 atempo 필터는 오디오의 속도만을 조절하므로, 비디오와 오디오를 동시에 처리할 때는 setpts와 함께 사용해야 한다.

\text{new\_audio\_time} = \frac{\text{old\_audio\_time}}{N}

5. 정밀한 속도 조정

비디오 속도를 매우 정밀하게 조정해야 하는 경우에는 프레임시간을 직접 계산하는 방법을 사용할 수 있다. 예를 들어, 프레임 간 간격을 미세하게 조정하려면 각 프레임의 타임스탬프를 수동으로 설정하는 방법이 필요하다.

프레임 번호를 n이라 하고, 프레임 간 시간 간격을 T라 하면, 각 프레임의 타임스탬프 PTS는 다음과 같이 표현된다:

PTS_n = n \times T

여기서 T는 프레임 간 시간 간격으로, 프레임 속도를 조정할 때 이 값을 변화시켜 속도를 변경한다. 만약 30fps의 비디오를 1.5배 빠르게 재생하려면 T를 다음과 같이 계산할 수 있다:

T_{\text{new}} = \frac{T_{\text{old}}}{1.5}

또한, 비디오의 속도를 조정할 때 프레임의 드롭(drop)이나 중복(duplication)이 발생할 수 있는데, 이러한 문제를 방지하기 위해 프레임을 재샘플링(resample)해야 할 수도 있다.

6. 고정된 프레임 속도 vs 가변 프레임 속도

비디오 파일은 고정된 프레임 속도(CFR, Constant Frame Rate) 또는 가변 프레임 속도(VFR, Variable Frame Rate)를 가질 수 있다. FFmpeg에서 비디오의 프레임 속도를 변경할 때는 고정된 프레임 속도를 유지할 것인지, 가변 프레임 속도로 변환할 것인지 결정해야 한다.

고정된 프레임 속도를 유지하는 방법:

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

가변 프레임 속도를 허용하는 방법:

ffmpeg -i input.mp4 -vsync vfr output.mp4

고정된 프레임 속도에서는 모든 프레임이 동일한 시간 간격을 유지하지만, 가변 프레임 속도에서는 각 프레임이 재생되는 시간이 달라질 수 있다. 이는 비디오의 재생 품질에 영향을 미칠 수 있으므로, 속도를 변경할 때 적절한 옵션을 선택하는 것이 중요하다.

7. 속도 조정과 프레임 드롭 및 중복

속도 조정 시 프레임 드롭(drop)과 중복(duplication)은 중요한 문제로, 속도 조정 후에도 비디오의 원래 품질을 유지하기 위해 신중하게 처리해야 한다. 프레임 드롭은 비디오의 속도를 빠르게 만들기 위해 일부 프레임을 삭제하는 것이며, 중복은 속도를 늦추기 위해 같은 프레임을 반복하는 것이다.

FFmpeg에서는 프레임 드롭과 중복을 조정하는 -vsync 옵션을 사용한다. 이 옵션을 사용해 가변 프레임 속도를 처리하거나, 일정한 프레임 속도를 유지하는 방식으로 동작할 수 있다.

예시 명령어:

ffmpeg -i input.mp4 -vf "setpts=PTS/1.5" -vsync drop output.mp4

위 명령어는 비디오의 속도를 1.5배 느리게 조정하고, 프레임 드롭을 허용하지 않는다. 즉, 프레임을 중복하여 속도를 조정한다.

8. 비디오 속도 조정의 수학적 모델

비디오 속도 조정의 수학적 모델은 주로 타임스탬프프레임 속도를 기반으로 한다. 속도 조정 계수 N을 적용한 타임스탬프는 다음과 같이 정의할 수 있다.

PTS' = \frac{PTS}{N}

여기서, - PTS는 원래 타임스탬프, - PTS'는 변경된 타임스탬프, - N은 속도 변경 계수이다.

이 수식을 기반으로 FFmpeg에서 setpts 필터를 적용해 타임스탬프를 조정한다. 예를 들어, N = 2인 경우 속도는 절반으로 느려지며, N = 0.5인 경우 속도는 두 배로 빨라진다.

또한, 프레임 간 간격을 변경하는 수식은 다음과 같다:

\Delta t' = \frac{\Delta t}{N}

여기서, - \Delta t는 원래 프레임 간 시간 간격, - \Delta t'는 변경된 프레임 간 시간 간격이다.

이 수식을 통해 비디오 속도 조정 시 각 프레임의 타임스탬프 간격을 조정하게 된다.