현재 사실상의 동영상 표준 코덱인 H.264와 HEVC는 유료인데다, 라이센스도 복잡하다.
개인이 사용할 때야 아무 문제 없지만, 상용 제품을 만들게 되면 여기부턴 쉽지 않다.
이에 따라 차기 코덱을 자유 라이센스 환경에서 오픈소스로 만들자는 움직임이 있었고, 그래서 만들어진 코덱이 AV1[각주:1]이다.
인텔, 애플, 모질라, 넷플릭스 등등 수많은 회사들이 모여 AOM[각주:2]을 결성하였으며, 스펙은 '18년 6월 25일에 1.0.0이 발표[각주:3]되었다.
그간 libaom을 포함한 인코더들이 있었지만, 인코딩 시간이 너무 오래 걸려 대중화에는 무리가 있어왔다.
그러다, 며칠 전('22.4.22) 인텔이 SVT-AV1 인코더 1.0을 정식으로 공개하였다.
이에 따라 SVT-AV1의 인코딩 성능과 영상 품질이 어느 정도인지 확인해보기로 했다.
공식적으로 SVT-AV1 인코더는 gitlab와 github를 통해 배포되고 있다.
이 중 본진(?)은 gitlab이며, github은 미러링 개념으로 사용된다.
그런데, github 쪽은 미러링이라 그런지, 릴리즈 버전이 올라오지 않았고[각주:4] 릴리즈 버전은 gitlab에만 올라온다.
하지만, gitlab 쪽은 문제가 있어 윈도우용 릴리즈 버전은 다운을 받을 수 없다.
그래서 간단하게(?) 직접 컴파일하기로 했다.
컴파일은 생각보다 어렵지 않다.
media-autobuild_suite를 컴파일 하면서 SVT-AV1을 포함시키면 실행파일을 함께 생성해준다.
아예 ffmpeg에 포함된 배포판을 사용하려면 github에 공개된 버전을 활용할 수도 있다.
github에는 파이프를 통해 인코딩하는 방법이 기술되어 있다.
ffmpeg -i infile.mkv -map 0:v:0 -pix_fmt yuv420p10le -f yuv4mpegpipe -strict -1 -^
| SvtAv1EncApp -i stdin --preset 5 --keyint 240 --input-depth 10 --crf 32 --film-grain 8 -tune 0 -b outfile.ivf
ffmpeg -i outfile.ivf -i infile.mkv -map 0:v -map 1:a:0 -c:v copy -c:a copy outfile.mkv
그런데, 막상 이를 적용해보면 오류가 발생하여 정상적으로 인코딩할 수 없다.
아예 처음부터 ffmpeg만을 사용할 걸 그랬다는 후회를 뒤로 하고 삽질을 좀 한 결과 올바른 방법을 찾을 수 있었다.
ffmpeg -i infile.mkv -map 0:v:0 -pix_fmt yuv420p10le -f yuv4mpegpipe -strict -1 -an - -loglevel panic^
| SvtAv1EncApp -i stdin --progress 0 --svtav1-params "preset=5:keyint=200:input-depth=10:crf=32:film-grain=8:tune=0" -b stdout^
| ffmpeg -i - -vcodec copy -y test.mkv
더불어, 현재 SVT-AV1 인코더는 yuv420p, yuv420p10le 두 가지 픽셀 포맷만 지원한다.
모든 테스트는 PC 한 대로만 수행하였으며, 인텔이 아닌 AMD CPU가 장착된 모델을 사용했다.
임의의 영상을 선정하여 다양한 파라미터를 적용해가며 인코딩을 반복한 뒤 인코딩 시간과 품질을 비교했다.
preset은 3, 4, 5, 6, 7, 8, 9, 10, 12을 각각 적용했으며, crf는 각각 5, 10, 20, 35, 42, 50을 각각 적용했다[각주:5].
훨씬 더 다양한 옵션을 지정할 수는 있지만, 이런 경우 테스트의 의미가 퇴색될 수가 있어 이 정도로 수행했다.
비교를 위해서 x264를 8bpp로, x265를 10bpp로 함께 인코딩했으며, MainConcept HEVC 인코더도 함께 돌렸다.
x264, x265는 slow profile, MC HEVC는 main10 profile에 대해서 다양한 crf 값을 1패스로 적용했다.
crf 값은 각 코덱마다 다섯 종류를 적용했다[각주:6].
기본 데이터를 화면에 펼쳐놓으면 아래와 같은 모습이 나온다.
정신 사나우니까 바로 요약 화면으로 가면...
동영상 품질 테스트 결과 그래프는 대부분 아래와 같은 형태를 가진다.
x축은 생성된 파일의 크기, y축은 PSNR 또는 SSIM 등의 계량화된 값.
이 값들은 높을 수록 원본과 차이가 적다는 의미이므로 좌상으로 갈 수록 품질이 좋다고 생각하면 된다.
별도로 범례를 적진 않았지만, 그래프를 찬찬히 보면 내용을 쉽게 알 수 있다.
PSNR와 SSIM은 전체적으로 유사한 경향을 보여주는데, 여기서는 SSIM만을 보이기로 하겠다.
전체를 다 보여주기에 앞서 preset을 7, 8, 9, 10으로 적용한 결과의 그래프는 아래와 같다.
굵은 선이 나타내는 값들은 각각 x265, MC HEVC 그리고 x264.
가는 선들은 위에서 아래로 각각 SVT-AV1 preset 7, 8, 9, 10.
이 그래프를 보면 preset이 8, 9 일 때가 x265나 MC HEVC와 비슷한 용량 대비 품질을 보여준다는 것을 알 수 있다.
다시 말하면 용량 대비 품질을 고려했을 때 preset 10 이상은 굳이 적용할 필요가 없다는 뜻. 그냥 x265 쓰면 됨.
그럼 이제 전체 데이터를 다 표시한 내용을 보자.
그래프에서 제일 위쪽에 선들이 보여주는 내용이 preset을 3, 4, 5로 적용했을 때이다.
그 부분에선 유의미한 차이를 보여주지는 않고, 5와 6 사이에서 좀 차이가 나는 경향을 보여준다.
용량 대비 품질이 꽤 높은 profile로는 5, 기존 코덱보다 조금 높은 정도의 profile로는 6 또는 7이 적당하다 보면 될 듯.
인코딩 시간은 각 profile 별 인코딩 시간의 산술평균값을 정리했다.
적용한 crf의 수량이 서로 다르면서 저화질-고화질 구간을 두루 적용했으므로 산술평균이 가장 합리적일 듯.
일단 SVT-AV1의 profile 별 인코딩 시간은 다음과 같다.
profile 3, 4에서는 시간이 극단적으로 많이 소요된다는 점이 눈에 띈다[각주:7].
x264 등의 기존 코덱과 함께 보면 소요 시간이 어느 정도인지 느낌이 온다.
x265 slow profile과 비교해도 10배 정도의 시간이 소요된다... ㄷㄷㄷ
SVT-AV1 profile을 5 이상만으로 모아보면 결과를 좀 더 편안하게(?) 볼 수 있다.
profile이 5인 경우의 인코딩 시간이 x265의 2배 정도밖에(?) 되지 않는다.
profile이 7 이상이면 x265보다 빠르게 인코딩되지만, x265는 slow profile에서 동작했다는 점을 생각해야 한다..
참고로, AV1 포맷에서 명시하는 Profile은 Main, High, Professional 3 가지이다.
SVT-AV1에서 지정하는 profile과 다소 의미의 차이가 있다는 점에 유의할 것.
1. profile을 5, 6, 7 정도로 적용하면 용량 대비 품질이 x265보다 높게 나올 수 있음
2. 인코딩 테스트 특성상 다양한 옵션을 더 적용할 수 없었음
3. 인코딩 시간 역시 profile을 5, 6, 7 정도로 적용하는 것이 합리적일 듯
4. x265 등과 비교시 인텔이 아닌 AMD 라이젠 5900x CPU 환경에서도 수긍이 가는 인코딩 성능을 보여주었음
1. 인코딩 시 CPU 점유율은 꾸준히 50% 약간 아래를 보여줌
2. PC 외의 환경으로 가보면 AV1을 적용하기엔 아직 시기상조인 요소가 많음
- MainConcept HEVC 인코더와 비교시 인코딩 속도가 몇 배 이상 차이가 남
- Raspberry PI 4 환경의 Kodi에서는 SW로 디코딩하는데, 영상을 보기 힘든 수준이라 적용 불가
- 내 아이폰 11, 내 TV(LG 65") 환경에서는 AV1 디코딩 기능이 없음
자막에 NEL(U+0085), NBSP(U+00A0)이 적용되면... (0) | 2022.09.10 |
---|---|
이제는 안드로메다로 가버리는 SAMI 자막... (8) | 2022.08.23 |
아마 영원히 어려울 Exif, ICC Profile 처리... (3) | 2022.01.09 |
ffmpeg으로 VirtualDub과 동일한 무압축 RGB 비디오를 만드는 법 (0) | 2021.11.10 |
MainConcept HEVC 인코더가 2.0으로 업데이트됨 (0) | 2021.10.18 |