카비레이크 계열 (아폴로레이크 포함) VAAPI 트랜스코딩 (데비안8)

category 서버/리눅스 서버 2018.02.04 21:44

안녕하세요.


이번에는 VAAPI 트랜스코딩 관련하여 카비레이크 / 아폴로레이크이면 HEVC 10BIT 4K 60FPS / VP9 Profile0 8BIT 4K 60FPS 를 하드웨어로 인코딩 할 수 있을까 하는 테스트를 해 보았습니다.


실제로 CPU 빨로 절대로 인코딩이 불가능합니다. 라이젠 1800X 로도 트랜스코딩이 잘 안되는 영상들입니다.


결과. 정말 잘 됩니다.


카비레이크 아폴로레이크의 경우, 상기에 설명드린 영상을 하드웨어 디코딩 할 수 있는 능력이 있습니다. 그리고 그것을 H264 로 하드웨어 인코딩 하는 것입니다.


하드웨어 정보

Intel(R) Celeron(R) CPU 3865U @ 1.80GHz

DDR4 16GB

Integrated Graphic Memory 1GB


아폴로레이크 DXVA 정보


http://blog.djjproject.com/266





설치과정


설치과정은 제가 매우 간략하게 작성하겠습니다. 의존성 에러는 해결해 가면서 설치해 주시길 바랍니다.


그리고 처음 설치해 보아서 필요하지 않은 과정이 포함되었을 수 있습니다.


1. 백포트 커널 설치


apt-get install -t jessie-backports linux-base

apt-get install linux-image-4.9.0-0.bpo.5-amd64 linux-headers-4.9.0-0.bpo.5-amd64 -t jessie-backports


2. 인텔 CMRT 설치


git clone https://github.com/01org/cmrt

cd cmrt

./autogen.sh

make -j 4 && make install


3. 인텔 하이브리드 드라이버 설치


git clone https://github.com/01org/intel-vaapi-driver

cd intel-vaapi-driver

./autogen.sh

make -j 4 && make install


4. 인텔 vaapi 드라이버 설치


libva 버전 에러 발생시 5번 항목을 먼저 하고 4번을 하시면 됩니다.


git clone https://github.com/01org/intel-vaapi-driver

cd intel-vaapi-driver

./autogen.sh

make -j 4 && make install


5. libva 설치


git clone https://github.com/01org/libva

cd libva

./autogen.sh

make -j 4 && make install


6. ffmpeg 설치


git clone https://github.com/FFmpeg/FFmpeg.git

cd FFmpeg/

git checkout -b n3.3.6

./configure --prefix=/usr --enable-nonfree --enable-static --enable-vaapi --enable-gpl --enable-libfdk-aac --enable-libx264 --enable-libx265

make -j 4 && make install


7. vainfo 확인


재부팅 후에 확인을 진행합니다.


root@debian:~/FFmpeg# vainfo

error: XDG_RUNTIME_DIR not set in the environment.

error: can't connect to X server!

libva info: VA-API version 1.1.0

libva info: va_getDriverName() returns 0

libva info: Trying to open /usr/local/lib/dri/i965_drv_video.so

libva info: Found init function __vaDriverInit_1_1

libva info: va_openDriver() returns 0

vainfo: VA-API version: 1.1 (libva 2.0.0)

vainfo: Driver version: Intel i965 driver for Intel(R) Kaby Lake - 2.1.1.pre1 (2.0.0-122-gd1453b5)

vainfo: Supported profile and entrypoints

      VAProfileMPEG2Simple            : VAEntrypointVLD

      VAProfileMPEG2Simple            : VAEntrypointEncSlice

      VAProfileMPEG2Main              : VAEntrypointVLD

      VAProfileMPEG2Main              : VAEntrypointEncSlice

      VAProfileH264ConstrainedBaseline: VAEntrypointVLD

      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice

      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP

      VAProfileH264Main               : VAEntrypointVLD

      VAProfileH264Main               : VAEntrypointEncSlice

      VAProfileH264Main               : VAEntrypointEncSliceLP

      VAProfileH264High               : VAEntrypointVLD

      VAProfileH264High               : VAEntrypointEncSlice

      VAProfileH264High               : VAEntrypointEncSliceLP

      VAProfileH264MultiviewHigh      : VAEntrypointVLD

      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice

      VAProfileH264StereoHigh         : VAEntrypointVLD

      VAProfileH264StereoHigh         : VAEntrypointEncSlice

      VAProfileVC1Simple              : VAEntrypointVLD

      VAProfileVC1Main                : VAEntrypointVLD

      VAProfileVC1Advanced            : VAEntrypointVLD

      VAProfileNone                   : VAEntrypointVideoProc

      VAProfileJPEGBaseline           : VAEntrypointVLD

      VAProfileJPEGBaseline           : VAEntrypointEncPicture

      VAProfileVP8Version0_3          : VAEntrypointVLD

      VAProfileVP8Version0_3          : VAEntrypointEncSlice

      VAProfileHEVCMain               : VAEntrypointVLD

      VAProfileHEVCMain               : VAEntrypointEncSlice

      VAProfileHEVCMain10             : VAEntrypointVLD

      VAProfileHEVCMain10             : VAEntrypointEncSlice

      VAProfileVP9Profile0            : VAEntrypointVLD

      VAProfileVP9Profile0            : VAEntrypointEncSlice

      VAProfileVP9Profile2            : VAEntrypointVLD

root@debian:~/FFmpeg#


8. 환경변수 에러 해결


드라이버 파일을 아래 경로에 복사합니다.


cp /usr/local/lib/dri/i965_drv_video.* /usr/lib/x86_64-linux-gnu/dri/





emby-server 에서 테스트 진행


emby-server 설치 및 설정

http://blog.djjproject.com/359


실제로 intel_gpu_top 명령은 5세대 까지 먹습니다. 그래서 운영체제 버전을 올려서 최신 패키지를 받거나 컴파일을 해야하는데요. 그냥 안보기로 했습니다. ㅎㅎ (귀차니즘)


root@debian:~/FFmpeg# intel_gpu_top

Test assertion failure function init_instdone_definitions, file ../../lib/instdone.c:591:

Failed assertion: IS_GEN2(devid)


트랜스코딩 로그


/usr/bin/ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -i file:"/media/volume/[LG UHD 4K_60FPS] AOA (�먯씠�ㅼ뿉��) - Miniskirt (吏㏃� 移섎쭏)-pDtYVo4D-6k.mkv" -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_vaapi -vf "format=nv12|vaapi,hwupload,scale_vaapi=w=1278:h=718"  -b:v 2808000 -maxrate 2808000 -bufsize 5616000 -profile:v 578 -level 41 -force_key_frames "expr:if(isnan(prev_forced_t),eq(t,t),gte(t,prev_forced_t+3))" -copyts -vsync -1 -codec:a:0 copy -f segment -max_delay 5000000 -avoid_negative_ts disabled -map_metadata -1 -map_chapters -1 -start_at_zero -segment_time 3  -individual_header_trailer 0 -segment_format mpegts -segment_list_type m3u8 -segment_start_number 0 -segment_list "/var/lib/emby-server/transcoding-temp/03e307ab84027558571d6b6a5dc45bf4.m3u8" -y "/var/lib/emby-server/transcoding-temp/03e307ab84027558571d6b6a5dc45bf4%d.ts"


ffmpeg version n3.3.6 Copyright (c) 2000-2017 the FFmpeg developers

  built with gcc 4.9.2 (Debian 4.9.2-10)

  configuration: --prefix=/usr --enable-nonfree --enable-static --enable-vaapi --enable-gpl --enable-libfdk-aac --enable-libx264 --enable-libx265

  libavutil      55. 58.100 / 55. 58.100

  libavcodec     57. 89.100 / 57. 89.100

  libavformat    57. 71.100 / 57. 71.100

  libavdevice    57.  6.100 / 57.  6.100

  libavfilter     6. 82.100 /  6. 82.100

  libswscale      4.  6.100 /  4.  6.100

  libswresample   2.  7.100 /  2.  7.100

  libpostproc    54.  5.100 / 54.  5.100

libva info: VA-API version 1.1.0

libva info: va_getDriverName() returns 0

libva info: Trying to open /usr/local/lib/dri/i965_drv_video.so

libva info: Found init function __vaDriverInit_1_1

libva info: va_openDriver() returns 0

Input #0, matroska,webm, from 'file:/media/volume/[LG UHD 4K_60FPS] AOA (�먯씠�ㅼ뿉��) - Miniskirt (吏㏃� 移섎쭏)-pDtYVo4D-6k.mkv':

  Metadata:

    ENCODER         : Lavf56.1.0

  Duration: 00:03:09.96, start: 0.000000, bitrate: 25567 kb/s

    Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709/unknown/unknown), 3840x2160, SAR 1:1 DAR 16:9, 59.94 fps, 59.94 tbr, 1k tbn, 1k tbc (default)

    Stream #0:1(und): Audio: aac (LC), 44100 Hz, stereo, fltp (default)

    Metadata:

      CREATION_TIME   : 2015-10-13 04:29:15

      LANGUAGE        : und

Stream mapping:

  Stream #0:0 -> #0:0 (vp9 (native) -> h264 (h264_vaapi))

  Stream #0:1 -> #0:1 (copy)

Press [q] to stop, [?] for help

[h264_vaapi @ 0x3d23f00] H.264 constrained baseline profile doesn't support encoding with B frames, disabling them.

[segment @ 0x3cce440] Opening '/var/lib/emby-server/transcoding-temp/03e307ab84027558571d6b6a5dc45bf40.ts' for writing

Output #0, segment, to '/var/lib/emby-server/transcoding-temp/03e307ab84027558571d6b6a5dc45bf4%d.ts':

  Metadata:

    encoder         : Lavf57.71.100

    Stream #0:0: Video: h264 (h264_vaapi) (Constrained Baseline), vaapi_vld, 1278x718 [SAR 1:1 DAR 639:359], q=0-31, 2808 kb/s, 59.94 fps, 90k tbn, 59.94 tbc (default)

    Metadata:

      encoder         : Lavc57.89.100 h264_vaapi

    Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp (default)

frame=   60 fps=0.0 q=-0.0 size=N/A time=00:00:00.99 bitrate=N/A speed=1.98x    

frame=  111 fps=110 q=-0.0 size=N/A time=00:00:01.83 bitrate=N/A speed=1.82x    

frame=  166 fps=110 q=-0.0 size=N/A time=00:00:02.78 bitrate=N/A speed=1.84x    

[segment @ 0x3cce440] Opening '/var/lib/emby-server/transcoding-temp/03e307ab84027558571d6b6a5dc45bf4.m3u8.tmp' for writing

[segment @ 0x3cce440] Opening '/var/lib/emby-server/transcoding-temp/03e307ab84027558571d6b6a5dc45bf41.ts' for writing

frame=  220 fps=108 q=-0.0 size=N/A time=00:00:03.66 bitrate=N/A speed=1.81x    

frame=  270 fps=107 q=-0.0 size=N/A time=00:00:04.52 bitrate=N/A speed=1.79x    

frame=  330 fps=109 q=-0.0 size=N/A time=00:00:05.52 bitrate=N/A speed=1.82x    

[segment @ 0x3cce440] Opening '/var/lib/emby-server/transcoding-temp/03e307ab84027558571d6b6a5dc45bf4.m3u8.tmp' for writing

[segment @ 0x3cce440] Opening '/var/lib/emby-server/transcoding-temp/03e307ab84027558571d6b6a5dc45bf42.ts' for writing

frame=  387 fps=109 q=-0.0 size=N/A time=00:00:06.47 bitrate=N/A speed=1.83x    

frame=  443 fps=110 q=-0.0 size=N/A time=00:00:07.38 bitrate=N/A speed=1.83x    

frame=  501 fps=110 q=-0.0 size=N/A time=00:00:08.38 bitrate=N/A speed=1.84x    


잘 작동합니다.





주요 영상 트랜스코딩 테스트


1. HEVC 4K 60FPS 10BIT



2. VP9 Profile0 4K 60FPS 8BIT



결과는 영상으로!




하아.. 카비레이크 가야되나요...






댓글을 달아 주세요