在 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
首先安装好工具以及以依赖
由于这里使用的是最小化版本(无桌面)的系统,于是使用下面命令来安装编译工具
1 | sudo apt -y install \ |
使用下方命令安装依赖
1 | sudo apt -y install \ |
之后添加 nvidia 官方给出的 jetson ffmpeg 库
新建 /etc/apt/sources.list.d/ffmpeg.list
文件并写入
1 | deb https://repo.download.nvidia.com/jetson/ffmpeg main main |
请勿使用仓库自带的 ffmpeg,因为使用后无法播放文件,输出如下
可以看出是未编译进解码器
下载源代码
1 | sudo apt update && sudo apt source ffmpeg |
过程中输出错误请不要管他,进入目录
1 | cd ffmpeg-4.2.2 |
准备编译
查看 jellyfin 自带的 ffmpeg 编译代码
1 | 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 编译代码
1 | 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/' |
经整合后代码如下
1 | 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/' |
进行编译
1 | sudo make -j4 |
编译后进入目录运行
出现异常
编辑 /etc/ld.so.conf
, 加入以下行(请根据您的用户名修改)
1 | /home/bmyjacks/ffmpeg_build/lib |
执行
1 | sudo ldconfig |
编译完成!
使用自己编译的 ffmpeg
设置信息
接下来进行解码测试
???WHAT 怎么还是一样的