emby-server 3.2.70 하드웨어 트랜스코딩 (VAAPI)

category 서버/리눅스 서버 2018.01.24 22:33

안녕하세요. 도정진입니다.


emby-server 가 이전과는 설정이 많이 바뀌었네요. 그래서 메모 겸 글을 남기고 있습니다.


이전에는 Transcoding 항목에 custom ffmpeg 설정하는 부분이 있었는데요. 이제는 없네요.



아무래도 설치를 repo 를 통해서 하면 ffmpeg custom path 가 존재하고 그냥 deb 파일로 받아버리면 안나오는 것 같습니다.





설치 방법


1. 레포 등록하여 설치하기


https://emby.media/linux-server.html


상기 처럼 deb 파일로 설치를 진행하는 방법



2. repo 등록을 통한 설치


https://software.opensuse.org/download.html?project=home%3Aemby&package=emby-server






환경 맞추기


1. 하드웨어 트랜스코딩을 위한 emby 사용자를 아래의 그룹에 추가


usermod -a -G cdrom,audio,video,plugdev,users,dialout,dip,input emby


2. 본래 deb 패키지에 내장된 ffmpeg 사용하기


실제로 ffmpeg 패키지가 /opt/emby-server/bin/ffmpeg 이렇게 내장이 되어 있습니다.


그런데 실제로 데비안 8에서는 미리 들어가 있는 ffmpeg 에 대해서 의존성을 맞추기가 힘들더라구요. 그래서 그냥 저는 컴파일해서 사용합니다만, 그대로 사용하길 원하신다면 아래와 같이 드라이버 파일을 복사해 주셔야합니다.


cp /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so /opt/emby-server/lib/dri/


아무리 해도 의존성이 맞춰지지 않는 것입니다. 


root@debian:/opt/emby-server/bin# ./ffmpeg

./ffmpeg: relocation error: ./ffmpeg: symbol av_hwdevice_find_type_by_name, version LIBAVUTIL_55 not defined in file libavutil.so.55 with link time reference


(에라이 ... ㅅ..ba)


3. 아무리 해도 안된다. 걍 컴파일해서 쓰자!


# 깃에서 코드 내려받기

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


# 3.3.6 브랜치 체크아웃

git checkout n3.3.6


# 컴파일 configure 명령

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


# 컴파일 및 설치

make -j 4

make install


상기에서 컴파일 과정에서 필요한 의존성 패키지들은 대략 아래와 같습니다.


yasm nasm build-essential git gcc libvdpau1 vdpauinfo libva1 vainfo i965-va-driver libfdk-aac-dev libx264-dev libx265-dev


조금 더 필요할 수 있습니다.


만약에 버전이 맞지 않아서 (버전이 낮아서) 컴파일이 불가능 하다고 하면 아래와 같이 백포트에서 설치하시길 바랍니다.


apt-get install -t jessie-backports [패키지 이름]


non-free 패키지와 contrib 패키지를 설치하기 위해서는 그리고 백포트 패키지를 설치하기 위해서는 아래와 같이 apt 주소가 작성되어 있어야 합니다.


root@debian:~# cat /etc/apt/sources.list


# deb cdrom:[Debian GNU/Linux 8.7.0 _Jessie_ - Official amd64 NETINST Binary-1 20170114-13:24]/ jessie main


# deb cdrom:[Debian GNU/Linux 8.7.0 _Jessie_ - Official amd64 NETINST Binary-1 20170114-13:24]/ jessie main


deb http://ftp.kr.debian.org/debian/ jessie main contrib non-free


deb http://security.debian.org/ jessie/updates main contrib non-free

deb-src http://security.debian.org/ jessie/updates main contrib non-free


# jessie-updates, previously known as 'volatile'

deb http://ftp.kr.debian.org/debian/ jessie-updates main contrib non-free

deb-src http://ftp.kr.debian.org/debian/ jessie-updates main contrib non-free


# jessie-backports

deb http://ftp.kr.debian.org/debian/ jessie-backports main contrib non-free

deb-src http://ftp.kr.debian.org/debian/ jessie-backports main contrib non-free



4. 컴파일 한 ffmpeg 실행하기


root@debian:~# ffmpeg 

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

Hyper fast Audio and Video encoder

usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...


Use -h to get full help or, even better, run 'man ffmpeg'

root@debian:~#


정확히는 제가 어떻게 ffmpeg 를 빌드하는지는 모르겠습니다. 그냥 있는 그대로 간단하게만 빌드했습니다.


5. emby-server 에서 커스텀 빌드 ffmpeg 사용하도록 변경하기


root@debian:~# cat /opt/emby-server/bin/emby-server 

#!/bin/sh


APP_DIR=/opt/emby-server


export FONTCONFIG_PATH=$APP_DIR/etc/fonts

export ICU_DATA=$APP_DIR/share/icu/59.1

export LD_LIBRARY_PATH=$APP_DIR/lib:$APP_DIR/lib/samba

export LIBVA_DRIVERS_PATH=$APP_DIR/lib/dri

if [ -z $EMBY_DATA ]; then

  if [ -d /var/lib/emby-server ]; then

    export EMBY_DATA=/var/lib/emby-server

  else

    export EMBY_DATA=/var/lib/emby

  fi

fi


exec $APP_DIR/system/EmbyServer \

  -programdata $EMBY_DATA \

  -ffmpeg /usr/local/bin/ffmpeg \

  -ffprobe /usr/local/bin/ffprobe \

  -restartexitcode 3 \

  -updatepackage 'emby-server-deb_{version}_amd64.deb'


6. 그런데 참 신기하게도 emby-server 최신 버전이 나왔다고 해서 업글 진행 후 내장 ffmpeg 정상 사용가능하네요..


emby     19543  2736 47 21:49 ?        00:10:20 /opt/emby-server/bin/ffmpeg -ss 00:37:57.000 -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -i file:/srv/plexdrive/100.djjproject/pvr/2017-KBS-가요대축제-KBS2.2부2017-12-29.ts -threads 1 -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_vaapi -vf format=nv12|vaapi,hwupload,deinterlace_vaapi,scale_vaapi=w=1280:h=720 -b:v 2616000 -maxrate 2616000 -bufsize 5232000 -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 libmp3lame -ac 2 -ab 384000 -f segment -max_delay 5000000 -avoid_negative_ts disabled -map_metadata -1 -map_chapters -1 -start_at_zero -segment_time 3 -segment_time_delta -2277 -individual_header_trailer 0 -segment_format mpegts -segment_list_type m3u8 -segment_start_number 759 -segment_list /var/lib/emby/transcoding-temp/34aca6a89d672477001d33a60652e792.m3u8 -y /var/lib/emby/transcoding-temp/34aca6a89d672477001d33a60652e792%d.ts


컴파일 하면서 환경이 맞춰진것 같네요.


동일하게 실행 시 에러는 발생하는데요. 작동은 하네요..


root@debian:~# /opt/emby-server/bin/ffmpeg 

/opt/emby-server/bin/ffmpeg: relocation error: /opt/emby-server/bin/ffmpeg: symbol av_hwdevice_find_type_by_name, version LIBAVUTIL_55 not defined in file libavutil.so.55 with link time reference





트랜스코딩 로그를 통해 에러 확인하기


혹시 동작이 되지 않고 CPU 가 100퍼로 치솟는 경우 에러로그를 참고하세요.


[AVHWDeviceContext @ 0x18458e0] No VA display found for device: /dev/dri/renderD128.
Device creation failed: -22.
Failed to set value '/dev/dri/renderD128' for option 'vaapi_device': Invalid argument 

Error parsing global options: Invalid argument


상기 에러는 i965-driver 가 환경 변수가 맞지 않는 경우 발생하는 에러입니다. 그리고 emby 계정에 video 에 대한 권한이 없어서 발생하는 문제입니다.


그 다음 에러는 ffmpeg 를 너무 낮은 버전을 쓰면 deinterlace_vappi 라는 필터를 쓰지 못해서 발생하는 에러입니다. ffmpeg 를 이 글에 맞게 컴파일 하시면 됩니다.


[AVFilterGraph @ 0x308b3e0] No such filter: 'deinterlace_vaapi' 

Error opening filters!





트랜스코딩 VAAPI 동작 확인


트와이스 영상 재생하면서 테스트 진행 하였습니다.


환경 


mk802 카페 공제 N3150 듀얼이

CPU : N3150 4core / Braswall

RAM : 4GB


테스트 영상 정보




CPU 사용량 (SW 트랜스코딩 / HW 트랜스코딩)




그래픽 사용량 (SW 트랜스코딩 / HW 트랜스코딩)




인코딩 프레임 속도 (SW 트랜스코딩 / HW 트랜스코딩)




상기와 같은 결과를 보였으며 SW 일때는 끊김이 8초 정도 나오고 10초 끊기고 그래서 볼 수가 없습니다. 프레임 수로 비교하면 HW 시 31프레임이 나오는데요. 자원을 자 끌어다 쓰지 않는걸로 보아 속도 조절을 하는 것 같습니다.


간단 메모 겸 리뷰 여기서 마치도록 하겠습니다.


감사합니다.





댓글을 달아 주세요