정보

해상도 변경 + 하드웨어 가속 인코딩 시 속도 향상

by JKyle posted Aug 23, 2018
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

(샤나가 아닌 다른 프로그램을 소개하는 포스팅입니다. 타 커뮤니티 사이트에서 소개된 프로그램에 대한 사용기를 옮깁니다. 샤나와도 무관하지 않아서 여기에도 포스팅합니다.)

 

샤나 외에 하드웨어 가속 인코딩을 지원하는 많은 프로그램 중 A's Video Converter는 자체적으로 제공하는 해상도 변경을 위한 하드웨어 필터(Nvidia 그래픽 카드용으로도!)가 있어서 소프트웨어 필터인 scale를 이용할 때 발생하는 병목 현상 및 속도 저하를 어느 정도 피할 수 있습니다.

 

많은 분들이 샤나에서 메뉴로 제공하지 않는 AMD 하드웨어 가속 인코딩을 위해 이 프로그램을 사용하시지만, NVENC를 이용한 인코딩에서도 해상도 변경을 위해 (샤나에는 없는) 하드웨어 필터를 이용하면 속도가 두 배 이상 향상되어 꽤 유용한 프로그램이기도 합니다.

 

정해진 해상도로밖에는 변경을 못한다는 단점이 있긴 하지만 규격에 맞는 동영상을 하드웨어 인코딩할 때라면 매우 편합니다.

 

 

1시간짜리 FHD(1920x1080) 동영상 파일을 HD(1280x720)로 해상도를 줄여서 샤나와 A's에서 각각 인코딩해 보았습니다. 인코더는 HEVC_NVENC (영상), AAC (오디오, 샤나에서는 fdk-aac, A's에서는 aac)를 썼고, 해상도 변경을 위해 샤나에서는 scale 필터를, A's에서는 자체 제공하는 하드웨어 리사이징 필터를 사용했습니다.

 

결과는 다음과 같습니다.

 

[샤나]

속도 6.41x (189fps) 진행시간 9분 25초

 

[A's]

속도 14.58x (436fps) 진행시간 4분 7초

 

A's가 샤나보다 배 이상 빠른 것을 볼 수 있습니다.

 

 

시각적으로 비교하기 좋게 스크린샷을 첨부합니다.

 

[스크린샷]

 

<샤나 진행창>

Shana_compared_to_AsVideoConverter_transcoding.png

 

<A's 진행창>

AsVideoConverter_trasncoding.png

 

 

<샤나 GPU-CPU 사용 내역>

Shana_compared_to_AsVideoConverter_CPU_GPU_usage.png

(샤나에서는 하드웨어 가속 디코딩을 끄고 진행했습니다. 소프트웨어 필터를 사용할 때 하드웨어 가속 디코딩을 활성화하면 중간에 병목 현상 때문에 오히려 GPU, CPU 활용도와 속도가 떨어집니다. 참고로 하드웨어 가속 디코딩(NVDEC)을 켜면 속도가 130 fps 정도로 확 떨어집니다.)

 

<A's GPU-CPU 사용 내역>

AsVideoConverter_CPU_GPU_usage.png

 

 

<샤나 output 동영상 미디어인포>

Shana_compared_to_AsVideoConverter_output_video_mediainfo.png

 

<A's output 동영상 미디어인포>

AsVideoConverter_output_video_mediainfo.png

 

 

인코딩 결과 동영상 품질은 둘 다 비슷한 걸로 보아 A's의 내장 하드웨어 필터 품질이 쓸 만한 것 같습니다. 참고로, A's 역시 샤나와 마찬가지로 custom build한 내장 FFmpeg를 이용하는 것으로 보입니다.

 

 

===============================================================================

 

<<추가적인 내용: Nvidia에서 제공하는 하드웨어 필터 scale_npp 사용>>

 

해상도 변경을 위한 또다른 하드웨어 필터로 Nvidia에서 제공하는 scale_npp가 있습니다. 이를 이용하기 위해서는 FFmpeg 바이너리를 custom build 하여야 하는데, Nvidia에서 제공하는 CUDA Toolkit을 설치하여 CUDA 헤더 파일들을 확보한 뒤 FFmpeg를 '--enable-libnpp' 옵션을 주고 컴파일하여야 합니다.

 

CUDA Toolkit을 공백 없는 path에 설치하고, media-autobuild_suite을 이용해 custom build 한 FFmpeg로 DOS 셸에서 아래의 명령어를 실행하여 하드웨어 가속 디코딩 + 하드웨어 필터 scale_npp 사용 + 하드웨어 가속 인코딩을 적용해 보았습니다.

 


 

ffmpeg -vsync 0 -hwaccel cuvid -c:v h264_cuvid -i input.mkv -vf scale_npp=1280:720 -c:v hevc_nvenc -profile:v main -preset slow -b:v 2M -rc vbr_hq -rc-lookahead 30 -spatial_aq 1 -aq-strength 8 -c:a libfdk_aac -b:a 64k -ac 2 -ar 44100 -profile:a aac_he -tag:v hvc1 -map_metadata -1 -metadata creation_time=now -metadata:s:v:0 language=kor -metadata:s:a:0 language=kor -y output.mp4

 


 

실행 결과는 아래와 같습니다.

 

[FFmpeg CLI]

속도 10.4x (312fps) 진행시간 약 5분 46초

 

A'보다 124fps 정도 속도가 느린데, 이것은 화질 향상을 위해 프리셋을 'slow'로 맞추고 인코딩 옵션을 customize 했기 때문으로 추측됩니다. 샤나도 같은 인코딩 옵션을 사용했기 때문에 동일한 이유로 샤나가 A's보다 속도가 느린 이유 중에 이 부분에서 기인하는 부분도 있을 것으로 생각됩니다.

 

그리고 또 다른 속도 저하 요인으로는 필터 알고리듬의 차이가 아닐까 생각됩니다. A's 사용하는 필터의 알고리듬이 뭔지는 모르겠지만 scale_npp가 사용하는 기본 알고리듬인 'cubic'과의 차이가 약간이나마 속도 차이에 반영된 것 같습니다.

 

하지만 FFmpeg가 샤나보다는 123fps 정도로 확실히 속도가 빠른데 이는 샤나에서 사용한 소프트웨어 필터 scale이 아닌 하드웨어 필터 scale_npp를 사용했기 때문으로 추측됩니다.

 

 

스크린샷을 첨부합니다.

 

[스크린샷]

 

<FFmpeg 진행창>

FFmpegCLI_compared_to_AsVideoConverter_transcoding.png

 

<FFmpeg GPU-CPU 사용 내역>

FFmpegCLI_compared_to_AsVideoConverter_CPU_GPU_usage.png

(확실히 GPU 사용율이 무척 높습니다. 인코딩 내내 거의 100% 유지합니다.)

 

<FFmpeg output 동영상 미디어인포>

FFmpegCLI_compared_to_AsVideoConverter_output_video_mediainfo.png

(인코딩 프로그램 정보는 custom build된 FFmpeg의 libavformat 버전 정보를 나타냅니다.)

 

 

 

어쨌든 결론은, "하드웨어 가속 디코딩/인코딩 시 소프트웨어 필터보다 하드웨어 필터를 사용해야 인코딩 속도가 획기적으로 향상된다."는, 무척이나 당연한 내용입니다. 구체적인 자료들이 참고가 되셨길 바랍니다.