방송 기술/기술정보

시각적 무손실 동영상 압축 기술 (Part-2)

초이1220 2022. 6. 27. 11:39
728x90

(Part-1)에서는 동영상 용량 줄여주는 사이트에 대해 알아 보았습니다.

 

이번에는 오픈소스 동영상 압축 툴인 FFMPEG를 사용하여 시각적 무손실 동영상 압축 기술에 대해 알아 보겠습니다.

 

우선 시각적 무손실을 구현하는 알고리즘은 여러가지 기법이 존재 하며 여기서는 주로 CFR(constant rate factor) 방식을 주로 다룰 예정입니다.

 

CRF 기법을 확인 하기 전에 Constant QP (Constant Quantization Parameter) 기법을 잠깐 살펴 보도록 하겠습니다.

 

1. CQP (Constant Quantization Parameter)

QP란 무엇인지 설명하기가 쉽지 않고 실제 low 레벨의 압축 코덱을 개발하는 개발자가 아니면 쉽게 이해 하기 어렵습니다. 

QP는 시각적 충실도에 따른 압축 변수로 빠르게 움직이는 부분은 최대한 많이 압축하고, 느리게 움직이거나 정지한 부분은 가능한 한 적게 압축합니다. 
CQP는 QP가 항상 고정이라서 동영상을 압축하게 되면 변화가 많을 경우 용량이 늘어나고, 변화가 적을 경우 용량이 줄어들게 압축하는 방식이라고 생각 하시면 될 것 같습니다.

 

실제 CQP 방식으로 압축하게 되면 최종 압축 파일의 용량을 예측하기 어렵습니다. 그리고 이러한 방식으로 압축된 파일은 디코딩 측에서 변화되는 비트레이트를 예상하기 쉽지 않기 때문에 스트리밍용으로 바로 쓰이기에는 한계가 존재합니다. 

 

일정한 품질로 인코딩하햐려면 보통, 영상의 매 프레임을 같은 정도로 압축해야 하며 이는 일정한 QP(Quantization Parameter)를 유지한다는 것입니다. QP는 주어진 픽셀 블럭에서 얼마나 많은 정보를 버려야 하는지에 대한 수치라고 이해 하시면 됩니다.

 

뒤에 설명드리는 CRF 방식이 현재 가장 효율적인 시각적 무손실 기법이라 CQP는 이정도 정보로만 정리하도록 하겠습니다.

 

2. CRF (Constant Rate Factor)

CRF 기법은 간단히 정리하면 매 프레인을 같은 정도로 압축하는 CQP와 다르게 해당 영상의 움직임을 분석하여 매 프레임을 다른 정도로 압축하는 기법이라고 이해하시면 됩니다.

즉, 움직임 및 변화가 많은 프레임은 많이 압축하고 움직임이 적은 혹은 정지 화면에 대해서는 조금만 압축해서 같은 용량의 압축된 영상을 비교했을때 보는 사람은 CRF 기법으로 압축한 파일에 대해서 더 화질이 좋다라고 느끼게 됩니다.

 

일부 OTT 서비스 사용자들이 사용하는 2Pass 방식의 압축방식과 가장 유사한 품질을 보이는 기법입니다.

 

2Pass 방식의 압축은 영상 원본을 몇개의 블록으로 나누고 해당 블록의 움직임 정도를 분석하여 각 블록에 말맞는 압축율을 적용하는 기법입니다. 최근에 넷플릭스는 씬 단위로 적절한 압축율을 적용하는 기법을 사용하고 있습니다. (Per Scean Optimizer Encoding). 넷 플릭스가 사용하는 기법은 몇년간의 AI 데이터 수집으로 인해 가장 현재 씬에 적합한 인코딩 방법을 적용해서 압축하는 기술로 동일한 화질의 영상에서 20% 이상의 데이터 량을 줄이므로써 트래픽 비용을 절감하는 효과를 보인다고 합니다.

 

(1) FFMPEG를 사용한 CRF 인코딩 방법

동영상 처리 오픈소스의 최고봉인 ffmpeg을 사용하여 CRF 인코딩을 구현하는 방법을 알아 보도록 하겠습니다.

 

CRF(Constant Rate Factor)는 x264 및 x265 인코더의 기본 품질(및 속도 제어) 설정이며 libvpx 에도 사용할 수 있습니다 . x264 및 x265를 사용하면 0에서 51 사이의 값을 설정할 수 있습니다. 값이 낮을수록 파일 크기는 커지지만 품질은 높아집니다. 값이 높을수록 압축률이 높아지지만 어느 시점에서 품질 저하를 확인할 수 있습니다.

 

흔히 사용하는 ffmpeg 라이브러리 중 libx264를 사용하면 아래와 같은 명령어로 수행 됩니다.

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

여기서 CRF 값은 18 ~ 28 까지의 수로 정의 되며 보통의 경우 CRF 값이 5~6 정도로 올라가면 용량은 절반이상 줄어 듭니다.

저는 품질 측정 방식은 다음장에서 설명 할 VMAF 방식을 사용하여 실제로 영상을 CRF 변수로 압축 했을때 원본 파일 대비 얼만큼 화질이 변했는지 확인 하면서 측정해 보았습니다.

 

근데 여기서 중요한 사항이 원본파일의 화질이 매우 중요한 것이라는 결론이 나왔습니다. 이 내용은 다음장에서 확인 해 주시면 감사하겠습니다.

 

 ffmpeg 라이브러리 중 libx265를 사용하면 아래와 같은 명령어로 수행 됩니다.

ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4

 

이 libx265 라이브러리에서는 기본값이 28 이며 CRF 값은 0에서 51까지의 수로 정의 할 수 있습니다.

 

마지막으로 libvpx 라이브러리를 사용하는 경우 다음과 같습니다.

 

ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 31 -b:v 0 output.mkv

여기서는 CRF 값이 기본 1080P에서 31이며 0부터 61까지의 수를 사용 할 수 있습니다.

 

앞서 말씀드린대로 CRF 변수값은 적으면 적을수록 더 좋은 화질, 큰 용량을 가지고 CRF 변수값이 높으면 높을수록 낮은 화질, 저용량으로 변경 할 수 있습니다.

(2) FFMPEG를 사용한 CRF 인코딩 옵션

ffmpeg에서 CRF 기법을 사용할때 추가적으로 사용하는 옵션이 있습니다.

바로 인코딩 시 인코딩 속도를 정하는 옵션으로 Slow, Midium, Fast, Very Fast 등의 옵션이 있으며 이 옵션은 CRF 인코딩시 인코딩 속도 및 용량과 관계가 있습니다.

 

이 내용은 아래 블로그에서 자세히 정리 되어 있으시 참고 하시면 될것 같습니다.

 

https://scvspace.kr/1509

 

ffmpeg로 녹화영상 압축하기 - 2. 일부 옵션별 영상스펙 비교 & 결론

지난번 빌드환경 글 정리하고 한주가 지났네요. 먼저 정리하려던게 요즘 집 밖으로 못나가니 진척이 없어서, 그게 밀리니 이 글 정리도 밀렸습니다. 계속 미루다가는 한주 더 지나가버릴것만 같

scvspace.kr

(3) FFMPEG를 사용한 CRF 인코딩 결과 및 품질

(원본) 핸드폰 촬영 동영상, 약 16Mbps 동영상, Mp4

 

위 원본 파일을 이용하여 ffmpeg CRF 인코딩을 해 보았고 국내외 용량줄이기 사이트에 올려서 고화질, 중화질, 저화질를 생성한 파일과 용량기준으로 비교하여 용량줄이기 사이트에서 대략 얼마정도의 CRF 값을 적용하는지 유추해 보았습니다.

 

- 용량줄이기 사이트 고화질 --> CRF 20, Slow

- 용량줄이기 사이트 중간화질 --> CRF 23, Midium

- 용량줄이기 사이트 고화질 --> CRF 26, Slow

 

100% 정확하진 않지만 위 정도의 CRF 변수를 입력했을때 비슷한 용량의 출력물이 생성 되었습니다.

 

또한 화질이 얼마나 차이나는지 확인 하기 위해서 넷플릭스에서 정의한 VMAF 기법을 이용하여 제가 변환한 파일의 원본대비 화질점수, 동영상 용량줄이기 사이트에서 변환한 화질 점수를 비교한 결과 거의 유사하거나 소수점 단위의 점수차를 보였습니다.

 

다음장에서 VMAF 에 대한 정의를 확인하도록 하겠습니다.

728x90