Ubuntu环境emby服务端开启intel核显VAAPI和QSV硬解码

让emby支持硬解和网页播放

请注意,本文编写于 1182 天前,最后修改于 1177 天前,其中某些信息可能已经过时。

前言

这篇文章其实就是自己的一个操作笔记和记录,由于emby和intel的官方文档,对这方面的叙述都不是很详细,并且有很多都已经很久没有更新了,使得很多编译步骤已经不能再用老的文档去实现了。在此结合了几位前辈大佬和其他踏坑者的经验,完成了一次vappi和qsv的安装,并且成功在emby上开启了核显硬解。
由于本人也是边摸索边实践,所以过程可能不尽完善,我很希望能够再操作一次,用于记录,让后续来人,可以方便简单的装上vappi和qsv并且实现emby服务端核显硬解。如果不着急搭建核显硬解的,可以联系我,当然前提是你的cpu是带有intel 600系核显的,并且能够给我服务器的root权限。如果是虚拟机系统的,当然直通显卡的前置步骤需要自己都做好,并且能够在系统里成功看到核显信息。

查看显卡信息

lspci | grep -i vga #input this command line
#output
00:02.0 VGA compatible controller: Intel Corporation HD Graphics P630 (rev 04)

有显示类似如上信息,说明系统已经认到显卡了,此时我们就可以开始操作了。
如果用的是Hetzner带核显的杜甫,请参考Hetzner杜甫启用intel核显部分

操作记录

环境介绍

Ubuntu 16.04 LTSC
GCC/G++ 4.9及以上版本
CMAKE 3.6及以上版本

安装环境

apt部分

sudo apt-get -y install autoconf automake build-essential make dh-autoreconf libass-dev libtool pkg-config texinfo zlib1g-dev libva-dev cmake mercurial libdrm-dev libvorbis-dev libogg-dev git libx11-dev libperl-dev libpciaccess-dev libpciaccess0 libncurses5-dev libpthread-stubs0-dev libxvmc-dev xutils-dev libsdl2-dev libxcb-shm0-dev xorg-dev intel-gpu-tools opencl-headers ocl-icd-*

确保gcc/g++版本大于等于4.9,cmake版本大于等于3.6

gcc/g++安装
# 检查版本
gcc -v
g++ -v
# 如果大于4.9,直接进入cmake部分;低于4.9,那就开始操作吧
sudo  apt-get -y  install  gcc-4.9  gcc-4.9-multilib  g++-4.9  g++-4.9-multilib

# 设置多版本
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9  49
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5  50 # 如果有的话
sudo update-alternatives --config gcc

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9  49
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5  50 # 如果有的话
sudo update-alternatives --config g++

# 检查
gcc -v
g++ -v

cmake安装

# 检查
cmake --version
# 如果高于3.6,直接跳过这个部分,低于3.6,开始操作
# 卸载现有的cmake
sudo apt remove --purge --auto-remove cmake
# 下载cmake版本
version=3.13
build=3
mkdir ~/temp
cd ~/temp
wget https://cmake.org/files/v$version/cmake-$version.$build.tar.gz
tar -xzvf cmake-$version.$build.tar.gz
cd cmake-$version.$build/
# 安装
./bootstrap
make -j4
sudo make install
# 检查
cmake --version

备注:执行cmake --version时可能会提示-bash: /usr/bin/cmake: No such file or directory
解决方案:执行sudo find / -name cmake查找cmake被安装到哪里了(一般来说安装在/usr/local/bin/下面了),把cmake拷贝一份放在/usr/bin/下即可。

Linux内核操作

检查内核版本,vaapi需要Kernel 4.14.16
uname -ar
# 低于4.14的输出
Linux ubuntu1604-Flexget 4.4.0-131-generic #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
# 等于高于4.14.16的输出
Linux emby-hz 4.14.16 #1 SMP Wed Sep 2 00:20:29 CST 2020 x86_64 x86_64 x86_64 GNU/Linux

返回如上信息,根据自己实际情况选择是否要升级内核

升级内核
cd ~/temp
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
cd linux-stable/
git checkout -b my_v4.14.16 v4.14.16
cp /boot/config-`uname -r` .config
make olddefconfig
make -j8
sudo make modules_install
sudo make install


编译linux-stable期间可能会出现 "bc: command not found " 问题
解决方案:sudo apt-get -y install bc
操作完内核更新后需要重启

sudo systemctl reboot

添加Oibaf PPA,安装最新的libva开发环境

sudo add-apt-repository ppa:oibaf/graphics-drivers
sudo apt-get update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade

从源码安装最新libva以及相关驱动

创建工作环境目录

cd temp
mkdir -p ~/vaapi
mkdir -p ~/ffmpeg_build
mkdir -p ~/ffmpeg_sources
mkdir -p ~/bin

Libva

cd ~/vaapi
git clone https://github.com/01org/libva
cd libva
./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu
time make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install
sudo ldconfig -vvvv

Gmmlib

mkdir -p ~/vaapi/workspace
cd ~/vaapi/workspace
git clone https://github.com/intel/gmmlib
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE= Release -DARCH= 64 ../gmmlib
make -j$(nproc)

Intel Media Driver

下载源码
cd ~/vaapi/workspace
git clone https://github.com/intel/media-driver
cd media-driver
git submodule init
git pull
mkdir -p ~/vaapi/workspace/build_media
cd ~/vaapi/workspace/build_media
cmake配置驱动
cmake ../media-driver \
-DMEDIA_VERSION="2.0.0" \
-DBUILD_ALONG_WITH_CMRTLIB=1 \
-DBS_DIR_GMMLIB=$PWD/../gmmlib/Source/GmmLib/ \
-DBS_DIR_COMMON=$PWD/../gmmlib/Source/Common/ \
-DBS_DIR_INC=$PWD/../gmmlib/Source/inc/ \
-DBS_DIR_MEDIA=$PWD/../media-driver \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu \
-DINSTALL_DRIVER_SYSCONF=OFF \
-DLIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri
编译驱动
time make -j$(nproc) VERBOSE=1
安装驱动
sudo make -j$(nproc) install VERBOSE=1
赋权
sudo usermod -a -G video $USER
sudo usermod -a -G video emby
修改环境变量
nano /etc/environment
# 加入以下两行
LIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri
LIBVA_DRIVER_NAME=iHD

Libva-utils

cd ~/vaapi
git clone https://github.com/intel/libva-utils
cd libva-utils
./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu
time make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install

完成到这里,需要重启一次

sudo systemctl reboot

重启后继续下面的步骤

Intel Media SDK

cd ~/vaapi
git clone https://github.com/Intel-Media-SDK/MediaSDK msdk
cd msdk
mkdir build && cd build
cmake ..
make
make install
配置环境
sudo mkdir -p /opt/intel/mediasdk/include/mfx
sudo cp -vr /opt/intel/mediasdk/include/*.h  /opt/intel/mediasdk/include/mfx
sudo nano /etc/ld.so.conf.d/imsdk.conf
# 将以下两行代码加入到这个文件
/opt/intel/mediasdk/lib
/opt/intel/mediasdk/plugins
# 保存退出
sudo ldconfig -vvvv

运行以下两条命令,确认输出是否正确(两条命令中,可能有一条是没有输出的,只要有一条输出即可

cat /opt/intel/mediasdk/lib/pkgconfig/libmfx.pc
cat /opt/mediasdk/lib/pkgconfig/mfx.pc

输出应为如下显示,

Name: mfx
Description: Intel(R) Media SDK Dispatcher
Version: 1.26  ((MFX_VERSION) % 1000)

prefix=/opt/intel/mediasdk
libdir=/opt/intel/mediasdk/lib
includedir=/opt/intel/mediasdk/include
Libs: -L${libdir} -lmfx -lstdc++ -ldl -lva -lva-drm -ldrm
Cflags: -I${includedir} -I/usr/include/libdrm

这时,离成功不远了,但是又需要重启一次了

sudo systemctl reboot

重启回来后继续

从源码编译安装FFmpeg

nasm
cd temp
cd ~/ffmpeg_sources
wget wget http://www.nasm.us/pub/nasm/releasebuilds/2.14rc0/nasm-2.14rc0.tar.gz
tar xzvf nasm-2.14rc0.tar.gz
cd nasm-2.14rc0
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" 
make -j$(nproc) VERBOSE=1
make -j$(nproc) install
make -j$(nproc) distclean
libx264
cd ~/ffmpeg_sources
git clone http://git.videolan.org/git/x264.git -b stable
cd x264/
PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --enable-static --disable-opencl # 需要开启opencl的用这个flag “--enable-opencl” 替换命令中的 “--disable-opencl”
PATH="$HOME/bin:$PATH" make -j$(nproc) VERBOSE=1
make -j$(nproc) install VERBOSE=1
make -j$(nproc) distclean

如果开启了opencl(--enable-opencl),需要运行以下命令安装依赖,如果是disable则不需要

sudo apt install ocl-icd-* 
libx265
cd ~/ffmpeg_sources
git clone https://bitbucket.org/multicoreware/x265_git.git
cd ~/ffmpeg_sources/x265_git/build/linux
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
make -j$(nproc) VERBOSE=1
make -j$(nproc) install VERBOSE=1
make -j$(nproc) clean VERBOSE=1
libfdk-AAC
cd ~/ffmpeg_sources
wget -O fdk-aac.tar.gz https://github.com/mstorsjo/fdk-aac/tarball/master
tar xzvf fdk-aac.tar.gz
cd mstorsjo-fdk-aac*
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make -j$(nproc)
make -j$(nproc) install
make -j$(nproc) distclean
libvpx
cd ~/ffmpeg_sources
git clone https://chromium.googlesource.com/webm/libvpx
cd libvpx
./configure --prefix="$HOME/ffmpeg_build" --enable-runtime-cpu-detect --enable-vp9 --enable-vp8 \
--enable-postproc --enable-vp9-postproc --enable-multi-res-encoding --enable-webm-io --enable-better-hw-compatibility --enable-vp9-highbitdepth --enable-onthefly-bitpacking --enable-realtime-only --cpu=native --as=nasm 
time make -j$(nproc)
time make -j$(nproc) install
time make clean -j$(nproc)
time make distclean
LibVorbis
cd ~/ffmpeg_sources
wget -c -v http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.6.tar.xz
tar -xvf libvorbis-1.3.6.tar.xz
cd libvorbis-1.3.6
./configure --enable-static --prefix="$HOME/ffmpeg_build"
time make -j$(nproc)
time make -j$(nproc) install
time make clean -j$(nproc)
time make distclean
FFmpeg
cd ~/ffmpeg_sources
git clone https://github.com/FFmpeg/FFmpeg -b master
cd FFmpeg
PATH="$HOME/bin:$PATH" 
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig:/opt/intel/mediasdk/lib/pkgconfig" ./configure \
--pkg-config-flags="--static" \
--prefix="$HOME/bin" \
--bindir="$HOME/bin" \
--extra-cflags="-I$HOME/bin/include" \
--extra-ldflags="-L$HOME/bin/lib" \
--extra-cflags="-I/opt/intel/mediasdk/include" \
--extra-ldflags="-L/opt/intel/mediasdk/lib" \
--extra-ldflags="-L/opt/intel/mediasdk/plugins" \
--enable-libmfx \
--enable-vaapi \
--disable-debug \
--enable-libvorbis \
--enable-libvpx \
--enable-libdrm \
--enable-gpl \
--cpu=native \
--enable-libfdk-aac \
--enable-libx264 \
--enable-libx265 \
--extra-libs=-lpthread \
--enable-nonfree 
PATH="$HOME/bin:$PATH" make -j$(nproc) 
make -j$(nproc) install 
make -j$(nproc) distclean 
hash -r

emby设置

操作到这里习惯性重启以下,进入emby后,应该就可以在转码的地方打开高级,看到vappi的和qsv的设备出现了。用网页播放尝试一下硬解吧,实测P630的核显还是很给力的。
如果是用的本人或者其他docker版的emby,那么还需要对docker的配置文件进行设置

docker版emby配置

docker版氛围官方版linuxserver版
以本人修改的linuxserver版为例,在docker里需要添加如下两个配置

volumes:
 - /path/for/transcoding:/transcode #optional
devices:
  - /dev/dri:/dev/dri

Hetzner杜甫启用intel核显

关于hetzner的杜甫,由于官方的默认系统,虽然可以认到显卡,但是bios里实际上是没有启用的,这里我是被坑了很久,最后翻阅了hz的官方文档,找到了相关解锁姿势
先放上Hetzner的官方文档,英语好的朋友可以直接根据文档操作。下面是我自己的记录,也方便将来hz更改页面有一个参考对照。

查看是否启用核显

在root用户的系统下,运行这条命令

ls -la /dev/dri

如果返回以下信息,说明iGPU默认disable了

ls: cannot access '/dev/dri': No such file or directory

如果返回以下信息,说明iGPU已经enable

total 0
drwxr-xr-x  2 root root        80 Sep  4 19:33 .
drwxr-xr-x 21 root root      4160 Sep  4 19:33 ..
crw-rw----  1 root video 226,   0 Sep  4 19:33 card0
crw-rw----  1 root video 226, 128 Sep  4 19:33 renderD128

这里建议hetzner的杜甫玩家,第一次配置iGPU,无论显示的上面哪种,都照着官方文档继续操作下去,因为我也是显示enable的,但是依然无法开启硬解,照着官方文档操作完,就成功开启了,让我百思不得其解。

开启iGPU

nano /etc/modprobe.d/blacklist-hetzner.conf # 编辑这个文件
# 将blacklist i915 和 blacklist i915_bdw 这两个驱动用#注释掉,编辑后的文件应为如下所示

### i915 driver blacklisted due to various bugs
### especially in combination with nomodeset
#blacklist i915
#blacklist i915_bdw

修改grub设置

nano /etc/default/grub.d/hetzner.cfg # 将此文件中的nomodeset字段删除,
# 如果是Ubuntu 18系统,此文件位置在 /etc/default/grub 目录下

编辑前的文件显示

GRUB_CMDLINE_LINUX_DEFAULT="nomodeset consoleblank=0"

修改后的文件显示

GRUB_CMDLINE_LINUX_DEFAULT="consoleblank=0"

保存退出后,还需要执行一下命令将设置应用到系统

sudo grub-mkconfig -o /boot/grub/grub.cfg

操作完成,执行重启

sudo systemctl reboot

重启后,此时核显已经被启用

重新查看核显信息

ls -la /dev/dri
# 此时屏幕返回应如下所示
drwxr-xr-x  3 root root       100 Mar  2 17:57 .
drwxr-xr-x 20 root root      4400 Mar  2 17:57 ..
drwxr-xr-x  2 root root        80 Mar  2 17:57 by-path
crw-rw----  1 root video 226,   0 Mar 16 19:55 card0
crw-rw----  1 root video 226, 128 Mar 16 19:55 renderD128

另一种方法是利用lspci 来查看,这个命令可以提供更加详细的信息

sudo lspci -v -s $(lspci | grep VGA | cut -d" " -f 1)
# 此时屏幕应当返回如下
00:02.0 VGA compatible controller: Intel Corporation HD Graphics P630 (rev 04) (prog-if 00 [VGA controller])
Subsystem: Fujitsu Technology Solutions Device 121c
Flags: bus master, fast devsel, latency 0, IRQ 125
Memory at ee000000 (64-bit, non-prefetchable) [size=16M]
Memory at d0000000 (64-bit, prefetchable) [size=256M]
I/O ports at f000 [size=64]
[virtual] Expansion ROM at 000c0000 [disabled] [size=128K]
Capabilities: [40] Vendor Specific Information: Len=0c <?>
Capabilities: [70] Express Root Complex Integrated Endpoint, MSI 00
Capabilities: [ac] MSI: Enable+ Count=1/1 Maskable- 64bit-
Capabilities: [d0] Power Management version 2
Capabilities: [100] #1b
Capabilities: [200] Address Translation Service (ATS)
Capabilities: [300] #13
Kernel driver in use: i915
Kernel modules: i915   

只要返回的信息中有Kernel driver in use: i915 的字样,标示核显已经启用

参考资料

  1. 小北的技术笔记
  2. Github
  3. Intel Media SDK官方文档
  4. MulticoreWare X265项目
  5. Hetzner开启iGPU官方文档
  6. Linuxserver docker emby项目

添加新评论

评论列表