c:a copy: 오디오 코덱(a)을 다시 압축하지 말고 원본 그대로 복사(copy)해라.
map 0:v:0: 0번 입력(temp_video)의 비디오(v)를 가져와라.
map 1:a:0: 1번 입력(input.mp4)의 오디오(a)를 가져와라.
FPS (Frames Per Second) - '재생 속도'
FPS는 1초에 몇 장의 그림(프레임)을 보여줄지 정하는 값이다.
문제: Python 스크립트가 비디오를 frame_001.png, frame_002.png...처럼 낱장 이미지로 분해하는 순간, "이 그림들이 원래 1초에 30장씩 재생되던 것"이라는 시간 정보가 사라진다.
FFmpeg 해결책: 이 낱장 이미지들을 다시 비디오로 합칠 때, 원본의 FPS 값을 반드시 알려줘야 한다.
300페이지짜리 만화책을 한 장씩 뜯어서 스캔(업스케일링)했다. 이걸 다시 책으로 묶을 때(FFmpeg) "이건 원래 1초에 30페이지씩 넘기던 거야" (framerate 30)라고 알려주지 않으면, FFmpeg은 자기 마음대로 1초에 25페이지씩 넘겨서(기본값) 재생 속도가 느려지게 된다.
비트레이트 (Bitrate) - '데이터 할당량'
비트레이트는 1초 분량의 비디오를 저장하는 데 얼마나 많은 데이터(bits)를 사용할지 정하는 값이다.
그림을 그릴 때 사용하는 '물감의 양'이라고 생각하면 편하다.
비트레이트가 높다 (예: 10,000 kbps): 물감을 듬뿍 써서 그린다. -> 색이 풍부하고 디테일이 살아있다. (고화질, 큰 용량)
비트레이트가 낮다 (예: 1,000 kbps): 물감을 아껴서(물을 많이 타서) 그린다. -> 색이 옅고 경계가 뭉개진다. (저화질, 작은 용량). 비디오에서는 '깍두기 현상(artifacts)'으로 나타난다.
4단계 적용: 우리는 FFmpeg에게 "품질은 내가 정할 테니, 용량(비트레이트)은 네가 알아서 써라"고 할 수 있다.
이것을 **CRF (Constant Rate Factor)**라고 한다.
ffmpeg ... -c:v libx264 -crf 23 ...
crf 23: H.264 코덱의 표준 품질 값이다. 숫자가 낮을수록 고화질(물감을 많이 씀)이고, 높을수록 저화질(물감을 아낌)이다.