0. 들어가기에 앞서

동영상 포맷의 사실상 표준이 H.264에서 HEVC로 이동하려 하지만, 한편으론 여전히 더 대중적인 쪽은 H.264이다.
온라인 방송용 앱이나 동영상 인코더들은 이 포맷들로 영상을 인코딩하는데, 어떤 것이 최선인지 궁금해졌다.

손쉽게(?) 구할 수 있는 S/W 기반 인코더인 x264/x265와 인텔 quicksync(이하 qsv), nvidia의 nvenc를 활용하여 다양한 조건에서 영상을 인코딩해보고 성능을 비교해보고 싶어졌다.

 

1. 테스트 영상

Durian Project로 만들어진 단편 애니메이션 Sintel의 일부를 사용하여 테스트를 진행했다.

다섯 가지 해상도의 포맷으로 공개했는데, 이 중 BluRay 포맷 및 4K mov 의 두 가지 포맷을 사용했다.

 

Durian Open Movie project의 결과물 [Sintel]

 

2. 테스트 방식

테스트 영상의 일부를 ffmpeg으로 인코딩한 뒤 결과물에 대해 원본과의 Overall PSNR를 비교했다.

 

- H.264와 HEVC 모두에 대해 인코딩

- S/W 기반은 ffmpeg에 내장된 x264/x265를 적용

- H/W 기반은 nvidia의 nvenc 및 인텔 qsv를 적용

반복되는 인코딩은 지겨우니까 별도로 GUI를 만들어야지…

- 모두 1패스 고정 품질(Constant Rate Factor) 또는 이제 준하는 방식으로 인코딩

- preset은 medium 및 slow 두 가지에 대해 모두 수행

- 결과물의 Bit RateOverall PSNR을 비교

- Overall PSNR은 AviSynth+에 내장된 Compare() 필터를 사용해서 확인함

여전히 유용한, 전설의 VirtualDub

- 인코딩에 소요되는 시간도 측정

 

3. 인코딩 명령행 옵션

a. ffmpeg 인코딩 옵션 확인

당연한 얘기지만, 각 인코더 별로 인코딩 옵션이 다르다.

nvenc H.264 인코더의 옵션을 확인하려면 다음과 같이 입력하면 된다.

ffmpeg -h encoder=h264_nvenc

 

또는, ffmpeg에서 사용할 수 있는 모든 H.264 인코더의 옵션은 이렇게 하면 확인할 수 있다.

ffmpeg -h encoder=h264

 

b. x264 / x265

x264 및 x265는 고정 품질(Constant Rate Factor)을 글자 그대로 crf 옵션으로 지정할 수 있다.

ffmpeg -i input.avs -c:v libx264 -preset slow -crf 22 -an output_x264.mp4

 

c. nvenc

도움말을 포함한 각종 자료들에는 x264/x265의 crf에 해당하는 옵션이 cq라고 되어있다.

ffmpeg -i input.avs -c:v h264_nvenc -preset slow -cq 22 -an output_nvenc.mp4

 

하지만, 막상 저 옵션으로 인코딩을 해보면 영상 결과에 1도 영향을 미치지 않는다.

 

뒤져보니 guru3D에 한 현자께서 적용 가능한 옵션을 상세하게 설명해두셨다.

더불어, H.264에는 -temporal-aq 1을, HEVC에는 -spatial_aq 1를 적용하라는 팁도 덧붙여두셨다.

이를 반영하면 아래와 같이[각주:1] 정리할 수 있다.

ffmpeg -i input.avs -c:v h264_nvenc -preset slow -rc constqp -global_quality 22 -temporal-aq 1 -rc-lookahead 32 -g 600 -an output_nvenc2.mp4

 

d. qsv

인텔의 qsv는 nvenc에 비해 훨씬 간결하며, x264/x265와 유사하게 옵션을 적용할 수 있다.

crf 대신 q를 사용하면 된다.

ffmpeg -i input.avs -c:v h264_qsv -preset slow -q 22 -an output_qsv.mp4

 

4. qsv 적용시 주의사항

다른 인코딩 방식들에 비해서 인텔 qsv는 적용이 은근히 까다롭다.

동영상 인코딩에 qsv를 적용하려면 다음의 세 가지를 모두 해두어야 한다.

1. BIOS에서 내장 그래픽을 사용하는 것으로 설정

2. 최신 버전의 인텔 내장 그래픽 장치 드라이버 설치

3. 모니터를 내장 그래픽 장치에 연결

 

특히, 3번만 하지 않는 경우 장치가 장치관리자에 보여도 정작 qsv를 사용할 수 없는 황당한 상황이 발생하니 주의.

 

 

  1. 참고로, -g 600 옵션은 GoP의 크기를 지정하는 건데, fps×10이 권장값임. 즉, 아래는 60fps 영상의 권장 옵션임 [본문으로]
  1. Favicon of http://salm.pe.kr/ BlogIcon koc/SALM 2019.04.29 19:55

    >> 특히, 3번만 하지 않는 경우 장치가 장치관리자에 보여도 정작 qsv를 사용할 수 없는 황당한 상황이 발생하니 주의.

    흠, 더미 플러그가 필요하려나...?

+ Recent posts