비디오의 품질을 측정하는 기준엔 PSNR, PSNR-HVS, PSNR-HVS-M, SSIM 등 많은 방식이 있다.
두 영상의 각각 픽셀의 표준편차를 통해 신호 대 잡음비를 계산하는 PSNR이나 구조적 유사성을 계산하는 SSIM 등이 많이 사용되지만, 사람이 눈으로 보는 결과와는 여전히 차이가 있다.
몇년 전에 넷플릭스에서 이러한 문제를 해결할 수 있는 VMAF라는 기준을 개발했다.
핵심 아이디어는 간단(?)하다.
많은 사람들이 직접 비교한 이미지 품질의 평균을 기준으로 삼은 뒤 정량적 측정치에 가중치를 부여해 더해서 유사한 결과가 나오는 모델을 만든 것.
이게 말이야 쉽지 쉬운 일도 아니거니와 그 결과를 통해 최적의 인코딩을 수행한 결과를 전 세계의 사용자들에게 평가를 받게 되는 것이다.
이 방식이 발표된지 시간도 많이 지나서 이제는 ffmpeg 배포판에도 사실상 기본 필터로 기능이 포함되어 있다.
ffmpeg의 최신 빌드에서는 간단하게 다음 정도만 써도 결과가 나온다.
ffmpeg.exe -i "jureka1.mp4" -i "jureka2.mp4" -lavfi "libvmaf" -f null -
하지만, 측정 방식의 특성상 CPU 사용량이 많은데, 기본값은 싱글 스레드만 사용한다.
아래와 같이 최대 스레드의 개수를 지정하면 성능이 대폭 향상된다.
ffmpeg.exe -i "jureka1.mp4" -i "jureka2.mp4" -lavfi "libvmaf=n_threads=12" -f null -
결과는 아래와 같이 점수로 표시된다.
[Parsed_libvmaf_0 @ 000001e6b662fa00] VMAF score: 13.159400
99점이면 거의 무손실이라 봐도 무방한 것 같고, 넷플릭스의 글에 따르면 70점이면 good이나 fair 정도라 한다.
성능 향상을 위해 n_threads 외에도 n_subsample 옵션을 지정해서 프레임을 건너뛰며 속도를 향상시킬 수도 있다.
또, log_path를 지정해 각 프레임 단위의 결과를 저장할 수도 있고, psnr/ssim을 함께 계산할 수도 있다.
상세한 것은 ffmpeg 문서를 참고.