在jetson nano上使用硬件加速的jellyfin(失败)

信息

本次演示使用Linux jetsonnano 4.9.140-tegra #1 SMP PREEMPT Thu Jun 25 21:25:44 PDT 2020 aarch64 aarch64 aarch64 GNU/Linux | Ubuntu 18.04.5 LTS (GNU/Linux 4.9.140-tegra aarch64) | Jetpack 4.4 L4T 32.4.3系统。

首先我们看看不使用硬件解码的播放流畅度

使用的ffmpeg为jellyfin自带的ffmpeg,并将转码线程数设置为4,其他保持默认。

HEVC(h265)解码测试

文件信息

解码信息

系统资源占用

MPEG4(DivX)解码测试

文件信息

解码信息

系统资源占用

MPEG4(Xvid)解码测试

文件信息

解码信息

系统资源占用

AVC(h264)解码测试

无需解码即可串流播放

MPEG2解码测试

文件信息

解码信息

系统资源占用

解码性能低下原因解析(可能)

首先使用jellyfin自带的ffmpeg并且不开启硬件解码的情况下调用的是CPU编码,这颗4核ARMv8处理器性能可能比较低下,因为嵌入式设备限制性能。下面我们打开硬件解码试试看。

使用硬件解码但是继续使用jellyfin自带的ffmpeg播放测试

OpenMAX(OMX)测试

设置信息

播放

boom!

NVENC测试

设置信息

解码信息

系统资源占用

GPU占用

VAAPI测试

设置信息

很容易就看出来会播放出错,但。。。

解码信息

系统资源占用

Video Toolbox测试

设置信息

boom!

既然使用NVDEC为什么GPU占用为0%

首先怀疑的是jellyfin自带的ffmpeg并未对jetson系列的GPU进行适配,决定自行编译ffmpeg试试

自行编译ffmpeg

首先安装好工具以及以依赖

由于这里使用的是最小化版本(无桌面)的系统,于是使用下面命令来安装编译工具

sudo apt -y install \
  autoconf \
  automake \
  build-essential \
  cmake \
  git-core \
  libass-dev \
  libfreetype6-dev \
  libgnutls28-dev \
  libtool \
  libvorbis-dev \
  pkg-config \
  texinfo \
  wget \
  yasm \
  zlib1g-dev

使用下方命令安装依赖

sudo apt -y install \
	libx264-dev \
	libzvbi-dev \
	libwebp-dev \
	libvorbis-dev \
	libtheora-dev \
	libfribidi-dev \
	libdrm-dev \
	libbluray-dev \
	libfontconfig-dev \
	libmp3lame-dev \
	libv4l-dev \
	libx264-dev \
	libopus-dev \
	libvpx-dev \
	libx265-dev \

之后添加nvidia官方给出的jetson ffmpeg库

新建/etc/apt/sources.list.d/ffmpeg.list文件并写入

deb https://repo.download.nvidia.com/jetson/ffmpeg main main
deb-src https://repo.download.nvidia.com/jetson/ffmpeg main main

请勿使用仓库自带的ffmpeg,因为使用后无法播放文件,输出如下

可以看出是未编译进解码器

下载源代码

sudo apt update && sudo apt source ffmpeg

过程中输出错误请不要管他,进入目录

cd ffmpeg-4.2.2

准备编译

查看jellyfin自带的ffmpeg编译代码

configuration: --prefix=/usr/lib/jellyfin-ffmpeg --target-os=linux --disable-doc --disable-ffplay --disable-shared --disable-libxcb --disable-sdl2 --disable-xlib --enable-gpl --enable-version3 --enable-static --enable-libfontconfig --enable-fontconfig --enable-gmp --enable-gnutls --enable-libass --enable-libbluray --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libwebp --enable-libx264 --enable-libx265 --enable-libzvbi --toolchain=hardened --enable-cross-compile --enable-omx --enable-omx-rpi --arch=arm64 --cross-prefix=/usr/bin/aarch64-linux-gnu-

查看默认nvidia的ffmpeg编译代码

configuration: --prefix=/usr --enable-nvv4l2dec --enable-libv4l2 --enable-shared --extra-libs='-L/usr/lib/aarch64-linux-gnu/tegra -lnvbuf_utils' --extra-cflags='-I /usr/src/jetson_multimedia_api/include/'

经整合后代码如下

sudo ./configure --prefix=$HOME/ffmpeg_build --target-os=linux --enable-libzvbi --enable-libwebp --enable-libvorbis --enable-libtheora --enable-libfribidi --enable-libdrm --enable-libbluray --enable-gmp --enable-gnutls --enable-libass --enable-version3 --enable-static  --enable-fontconfig --enable-gpl --enable-libfontconfig --enable-nvv4l2dec --enable-libmp3lame --enable-libv4l2 --enable-libx264 --enable-libopus --enable-libvpx --enable-nonfree --enable-libx265 --arch=arm64 --toolchain=hardened --enable-shared --extra-libs='-L/usr/lib/aarch64-linux-gnu/tegra -lnvbuf_utils' --extra-cflags='-I /usr/src/jetson_multimedia_api/include/'

进行编译

sudo make -j4
sudo make install

编译后进入目录运行

出现异常

编辑/etc/ld.so.conf,加入以下行(请根据您的用户名修改)

/home/bmyjacks/ffmpeg_build/lib

执行

sudo ldconfig

编译完成!

使用自己编译的ffmpeg

设置信息

接下来进行解码测试

???WHAT 怎么还是一样的

最后失败了

与软解完全一样的速度,如果有哪位大神知道怎么去设置或编译,请在评论区留言,我将不胜感激!