ffmpeg으로 동영상을 인코딩할 때는 기본적으로 SW만을 사용한다.

HW 인코딩을 자동으로 사용하는 줄 알았는데, 확인해보니 역시 그럴 리가 없없다…


ffmpeg에서 HW 인코딩을 하는 방법에 대해선 ffmpeg 홈페이지를 뒤지면 많은 정보를 확인할 수 있다.

윈도우 용 ffmpeg 빌드의 대표주자인 Zeranoe 님 빌드에선 NVENC, Direct 3D 11, Direct 3D 9, 인텔 QSV 등을 지원한다.


C:\bluenlive>ffmpeg -hwaccels
ffmpeg version 3.4.1 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 7.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth --enable-libmfx
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Hardware acceleration methods:
d3d11va
dxva2
qsv
cuvid

C:\bluenlive>_


이 방식들 중에 nVidia GPU에서 사용되는 CUVID/NVENC를 활용해서 H.264, HEVC의 H/W 인코딩을 테스트해봤다.

H/W 환경은 아래와 같다.


CPU: Intel Core i7-3770

Memory: 8GB (PC3-12800, DDR3)

GPU: GTX 1050Ti (GP107, Pascal core)



테스트 조건은 대략 다음과 같다.


1. 비디오 소스는 임의의 블루레이 소스에서 2개를 사용

2. 인코딩 시간을 고려 1,000 프레임만 편집하여 사용

3. YUV420p로 변환하여 인코딩

4. S/W 인코딩, H/W 인코딩 각각에 대해 H.264, HEVC 인코딩

5. 일정 품질 모드 및 일정 비트레이트 모드로 모두 인코딩

   → 확인 결과 일정 품질 및 일정 비트레이트 모드는 유의미한 차이를 보이지 않아 통합



1. 소스#1


PSNR 결과는 아래와 같다.

X 축은 파일 크기(KByte), Y 축은 PSNR.


NVENC를 활용한 H/W 인코딩이 S/W 인코딩에 비해 다소 품질이 떨어지는[각주:1]을 확인할 수 있다.

특이한 점은 H/W 인코딩 시 HEVC가 오히려 H.264보다 PSNR이 미묘하게 낮다는 점.

또한, H/W 인코딩 시 품질값을 변경해도 동일한 결과[각주:2]가 나왔다…



PSNR만으로는 H/W 인코딩을 사용할 이유가 별로 없어보인다.

하지만, 소요 시간을 보면 얘기가 달라진다.


H.264의 경우 2배 빠른 속도를 보이고, HEVC는 5배 가까운 속도를 보여준다.

H.264와 HEVC의 H/W 인코딩 속도 차이는 거의 없다고 봐도 무방할 수준이다.




2. 소스#2


PSNR은 소스#1에 비교하면 비슷하지만, 눈에 띄는 차이가 있다.

우선 S/W 인코딩과 H/W 인코딩 간의 격차가 훨씬 작다.

또한, H/W 인코딩시 HEVC가 H.264보다 PSNR이 다소 높게 나왔다.



소요 시간은 위의 소스#1과 비슷하다.

H.264는 H/W가 2배 빠르고, HEVC는 7배 가까이 빠르다.




3. 기타 테스트


혹시 저화질 소스에선 H/W HEVC 인코딩 시 어떤 결과가 나오는지 확인해봤다.

소스는 (위의 두 테스트와 달리) 10년도 넘은 mpeg1 동영상 클립(142,275Bytes).


최고 품질로 인코딩하니 파일 크기가 3배 이상 늘어난다.

물론 PSNR은 상당히 높게 나오지만, 파일이 3배나 커졌는데, 화질까지 떨어지면 이상하잖아…




결론


1. NVENC를 활용한 H/W 인코딩은 시간 절약의 효과는 탁월함

2. H.264와 HEVC 간에 파일 크기 및 화질의 유의미한 차이는 없으므로 굳이 HEVC를 사용할 이유는 없음

3. 소스가 고화질인 경우는 품질을 고품질로 설정해서 인코딩하는 것이 효과적임

4. 소스가 저화질인 경우는 굳이 재인코딩할 필요는 없어보이며, 한다면 비트레이트를 지정해서 파일 크기를 줄이는 게 합리적임

5. (여기엔 명시하지 않았지만) YUV444 등으로 인코딩 시에 문제가 발생한다는 보고가 있으며, 칩셋에 따라 지원 범위가 들쑥날쑥하다는 문제도 있음



  1. PSNR이 36 이상이니 화질이 심각하게 떨어진다는 얘기는 아니고, 용량 대비 효율이 S/W 쪽이 더 높다는 정도로 이해하면 됨 [본문으로]
  2. 그래서, 그래프에는 3개의 결과가 보이지만, 사실 4번 테스트했고, 겹치는 데이터는 점 3개 중 가운데 점. [본문으로]

+ Recent posts