반응형

0. 들어가기 앞서

현재 사실상의 동영상 표준 코덱인 H.264HEVC유료인데다, 라이센스도 복잡하다.

개인이 사용할 때야 아무 문제 없지만, 상용 제품을 만들게 되면 여기부턴 쉽지 않다.

 

이에 따라 차기 코덱자유 라이센스 환경에서 오픈소스로 만들자는 움직임이 있었고, 그래서 만들어진 코덱이 AV1[각주:1]이다.

 

 

인텔, 애플, 모질라, 넷플릭스 등등 수많은 회사들이 모여 AOM[각주:2]을 결성하였으며, 스펙은 '18년 6월 25일에 1.0.0이 발표[각주:3]되었다.

 

 

그간 libaom을 포함한 인코더들이 있었지만, 인코딩 시간이 너무 오래 걸려 대중화에는 무리가 있어왔다.

그러다, 며칠 전('22.4.22) 인텔이 SVT-AV1 인코더 1.0을 정식으로 공개하였다.

 

이에 따라 SVT-AV1의 인코딩 성능과 영상 품질이 어느 정도인지 확인해보기로 했다.

 

 

1. SVT-AV1 인코더 선택

공식적으로 SVT-AV1 인코더는 gitlab와 github를 통해 배포되고 있다.

이 중 본진(?)은 gitlab이며, github은 미러링 개념으로 사용된다.

 

그런데, github 쪽은 미러링이라 그런지, 릴리즈 버전이 올라오지 않았고[각주:4] 릴리즈 버전은 gitlab에만 올라온다.

하지만, gitlab 쪽은 문제가 있어 윈도우용 릴리즈 버전은 다운을 받을 수 없다.

 

아니, 선생님들... 404를 이런 데에서 알현하게 하시면... ㄷㄷㄷ

 

그래서 간단하게(?) 직접 컴파일하기로 했다.

컴파일은 생각보다 어렵지 않다.

media-autobuild_suite를 컴파일 하면서 SVT-AV1을 포함시키면 실행파일을 함께 생성해준다.

 

아예 ffmpeg에 포함된 배포판을 사용하려면 github에 공개된 버전을 활용할 수도 있다.

 

 

2. ffmpeg과 함께 하는 인코딩 옵션 적용

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 두 가지 픽셀 포맷만 지원한다.

 

 

3. 테스트 방법

모든 테스트는 PC 한 대로만 수행하였으며, 인텔이 아닌 AMD CPU가 장착된 모델을 사용했다.

 

공정성 시비를 피하기 위한 그런 이유 아니고, 집에 AMD PC밖에 없음

 

임의의 영상을 선정하여 다양한 파라미터를 적용해가며 인코딩을 반복한 뒤 인코딩 시간과 품질을 비교했다.

preset3, 4, 5, 6, 7, 8, 9, 10, 12을 각각 적용했으며, crf는 각각 5, 10, 20, 35, 42, 50을 각각 적용했다[각주:5].

훨씬 더 다양한 옵션을 지정할 수는 있지만, 이런 경우 테스트의 의미가 퇴색될 수가 있어 이 정도로 수행했다.

 

이러한 삽질은 프로그램이 하나 있어야 함

 

비교를 위해서 x264를 8bpp로, x265를 10bpp로 함께 인코딩했으며, MainConcept HEVC 인코더도 함께 돌렸다.

x264, x265slow profile, MC HEVCmain10 profile에 대해서 다양한 crf 값을 1패스로 적용했다.

crf 값각 코덱마다 다섯 종류를 적용했다[각주:6].

 

 

4. 테스트 결과 1: 품질

기본 데이터를 화면에 펼쳐놓으면 아래와 같은 모습이 나온다.

 

 

정신 사나우니까 바로 요약 화면으로 가면...

 

동영상 품질 테스트 결과 그래프는 대부분 아래와 같은 형태를 가진다.

x축생성된 파일의 크기, y축PSNR 또는 SSIM 등의 계량화된 값.

이 값들은 높을 수록 원본과 차이가 적다는 의미이므로 좌상으로 갈 수록 품질이 좋다고 생각하면 된다.

별도로 범례를 적진 않았지만, 그래프를 찬찬히 보면 내용을 쉽게 알 수 있다.

 

PSNR와 SSIM은 전체적으로 유사한 경향을 보여주는데, 여기서는 SSIM만을 보이기로 하겠다.

전체를 다 보여주기에 앞서 preset을 7, 8, 9, 10으로 적용한 결과의 그래프는 아래와 같다.

 

SSIM(SVT-AV1 preset: 7..10, x264, x265, MC-HEVC)

 

굵은 선이 나타내는 값들은 각각 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이 적당하다 보면 될 듯.

 

 

5. 테스트 결과 2: 인코딩 시간

인코딩 시간은 각 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과 다소 의미의 차이가 있다는 점에 유의할 것.

 

 

6. 테스트 결론

1. profile을 5, 6, 7 정도로 적용하면 용량 대비 품질이 x265보다 높게 나올 수 있음

2. 인코딩 테스트 특성상 다양한 옵션을 더 적용할 수 없었음

3. 인코딩 시간 역시 profile을 5, 6, 7 정도로 적용하는 것이 합리적일 듯

4. x265 등과 비교시 인텔이 아닌 AMD 라이젠 5900x CPU 환경에서도 수긍이 가는 인코딩 성능을 보여주었음

 

 

7. 기타 사항

1. 인코딩 시 CPU 점유율은 꾸준히 50% 약간 아래를 보여줌

 

 

2. PC 외의 환경으로 가보면 AV1을 적용하기엔 아직 시기상조인 요소가 많음

- MainConcept HEVC 인코더와 비교시 인코딩 속도가 몇 배 이상 차이가 남

- Raspberry PI 4 환경의 Kodi에서는 SW로 디코딩하는데, 영상을 보기 힘든 수준이라 적용 불가

- 내 아이폰 11, 내 TV(LG 65") 환경에서는 AV1 디코딩 기능이 없음

 

 

  1. 공식적인 HEVC의 후속 코덱은 VVC이며, HEVC가 H.265라고도 불리듯이 VVC는 H.266이라고도 불림 [본문으로]
  2. Alliance for Open Media [본문으로]
  3. 최종은 '19년 1월 8일에 발표된 Version 1.0.0 with Errata 1 [본문으로]
  4. 글 쓰는 현재 0.8.7까지 올라옴 [본문으로]
  5. 대략 SVT-AV1으로 54번 인코딩 해봤다는 뜻 [본문으로]
  6. 이 쪽도 15번 인코딩 했다는 얘기... [본문으로]
  7. profile은 1, 2도 적용 가능하지만, 테스트 자체를 진행하지 않았음 [본문으로]
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band