效率工具

买 NAS 或迷你主机跑 Plex:检查硬件转码能力并估算软件转码并发

用脚本检查 /dev/dri、Intel/NVIDIA 硬件加速条件,并以带噪点的视频运行 FFmpeg 软件转码基准;文中明确区分实际测量与未验证的硬件转码。

BINBHO · 图文教程

买 NAS 或迷你主机来跑 Plex,最关心的问题是:它能同时给几个人转码?这个脚本先检查机器上有没有能用的核显或显卡(/dev/dri、render 组、vainfo、nvidia-smi),再用 ffmpeg 实测纯 CPU 软件转码的速度,估算能同时转码几路。另外给出把核显交给 Plex 容器的 compose 片段。

先看清成品

  • box 的情况: box 是 8 核 Xeon 虚拟机,没有 /dev/dri,所以脚本如实报告“没有可用的核显或显卡”,硬件转码没有测过。
  • 软件转码实测: 带噪点的 1080p 测试片转成 720p,速度约 4.7–4.8 倍实时,估算可以同时转码约 3 路;纯测试图样能跑到 15.1 倍(见调试示例)。
  • compose 叠加文件: docker compose config 校验通过。
  • 前提: 硬件加速是 Plex Pass 功能,需要服务器所有者有 Plex Pass 订阅(见 Plex 帮助中心)。

注意:只给媒体服务器放你有权使用的内容,比如自己拍的视频、自己购买并合法备份的光盘、公共领域或采用开放授权的作品。不要安装或分享盗版插件和资源,不要把媒体库共享给家庭以外的人,硬件转码等付费功能请按官方方式订阅(Plex Pass,价格以官网为准,本文不列)。遵守《Plex 服务条款》。

做完之后你会得到什么?

成果 说明
hw_check.sh 检查 CPU、/dev/dri、render 组、vainfo 和 NVIDIA 显卡,再跑软件转码基准
docker-compose.hw.yml 叠加在 A 篇的 compose 上,把 /dev/dri 交给容器

需要准备哪些环境?

项目 要求 说明
CPU 带核显的 Intel CPU,支持 Quick Sync Plex 官方推荐 Intel Quick Sync 或 NVIDIA 显卡;AMD 显卡按“现状”提供支持
系统 64 位 Linux 官方正式支持的是 Ubuntu 16.04+ 和 Fedora 26+,其他发行版也可能可以用
订阅 Plex Pass 硬件加速是付费功能
ffmpeg 用来跑基准测试 sudo apt install ffmpeg

文件结构

36-plex-B-src/
├── hw_check.sh
└── docker-compose.hw.yml

第 1 步:检查脚本

hw_check.sh:

#!/usr/bin/env bash
# 检查这台 NAS / 迷你主机能不能给 Plex(或 Jellyfin、Emby)做硬件转码,再用 ffmpeg 粗测纯 CPU 软件转码的速度。
# 用法:./hw_check.sh [测试视频]   不传测试视频时,会生成 10 秒带噪点的 1080p 测试片(最好传一部你自己的片子)
set -uo pipefail
echo "== CPU =="; grep -m1 "model name" /proc/cpuinfo | cut -d: -f2- | sed 's/^ //'; echo "核心数:$(nproc)"
echo "== /dev/dri(Intel 核显 / AMD 显卡的设备节点) =="
if ls /dev/dri/renderD* >/dev/null 2>&1; then
  ls -l /dev/dri/
  g=$(stat -c %G /dev/dri/renderD128); echo "renderD128 属于组:$g(运行媒体服务器的用户要在这个组里)"
  id -nG | grep -qw "$g" && echo "✓ 当前用户在 $g 组" || echo "! 当前用户不在 $g 组:sudo usermod -aG $g \$USER"
  command -v vainfo >/dev/null && vainfo --display drm --device /dev/dri/renderD128 2>&1 | grep -E "Driver version|VAProfileH264|VAProfileHEVC" | head -6 \
    || echo "(没有安装 vainfo:sudo apt install vainfo,可以查看支持哪些编解码)"
else
  echo "✗ 没有 /dev/dri/renderD*:没有可用的核显或显卡,或者驱动没加载,或者是虚拟机没有直通"
fi
command -v nvidia-smi >/dev/null && nvidia-smi --query-gpu=name,driver_version --format=csv,noheader || echo "(没有 nvidia-smi:没有 NVIDIA 显卡,或者没装驱动)"
echo "== 软件转码基准(1080p → 720p H.264 4 Mbps,preset veryfast) =="
SRC=${1:-}
if [ -z "$SRC" ]; then SRC=$(mktemp --suffix=.mkv)
  ffmpeg -hide_banner -loglevel error -y -f lavfi -i "testsrc2=size=1920x1080:rate=30:duration=10,noise=alls=60:allf=t" -c:v libx264 -preset ultrafast -crf 18 -pix_fmt yuv420p "$SRC"; fi   # 加噪点:纯测试图样太好编码,测出来会偏快 3 倍左右
speed=$(ffmpeg -hide_banner -nostats -y -i "$SRC" -vf scale=-2:720 -c:v libx264 -preset veryfast -b:v 4M -an -f null - 2>&1 | grep -o "speed=[ 0-9.]*x" | tail -1 | tr -dc '0-9.')
echo "速度:${speed}x 实时"
awk -v s="$speed" 'BEGIN{n=int(s*0.7); printf "粗略估计:大约能同时软件转码 %d 路 1080p→720p(按 70%% 余量计算)\n", n}'

box 上的实际输出:

== CPU ==
Intel(R) Xeon(R) Processor
核心数:8
== /dev/dri(Intel 核显 / AMD 显卡的设备节点) ==
✗ 没有 /dev/dri/renderD*:没有可用的核显或显卡,或者驱动没加载,或者是虚拟机没有直通
(没有 nvidia-smi:没有 NVIDIA 显卡,或者没装驱动)
== 软件转码基准(1080p → 720p H.264 4 Mbps,preset veryfast) ==
速度:4.73x 实时
粗略估计:大约能同时软件转码 3 路 1080p→720p(按 70% 余量计算)

第 2 步:把核显交给容器

docker-compose.hw.yml:

# 在 36-plex-A 的 docker-compose.yml 基础上叠加:把核显设备交给容器(Intel Quick Sync / VAAPI)
# 用法:docker compose -f docker-compose.yml -f docker-compose.hw.yml up -d
services:
  plex:
    devices:
      - /dev/dri:/dev/dri
docker compose -f docker-compose.yml -f docker-compose.hw.yml up -d

然后按帮助中心的步骤操作:Plex Web → Settings → Server → Transcoder → 打开右上角的 Show Advanced → 勾选 Use hardware acceleration when available → Save Changes(不需要重启服务器)。

检查点:播放时把画质调低,强制触发转码,然后在 Dashboard 里看当前播放会话,确认显示的是硬件转码(hw)。这一步需要真实的核显和 Plex Pass,box 上没有测过。

调试示例:基准测试测出来太乐观

第一版用纯 testsrc2 测试图样做基准,结果是:

速度:15.1x 实时
粗略估计:大约能同时软件转码 10 路

测试图样大面积是纯色,编码器几乎不用费力。换成加了噪点的片子以后:

速度:4.77x 实时
粗略估计:大约能同时软件转码 3 路

两者相差 3 倍多。所以脚本默认改用带噪点的片子,并且建议传入一部你自己的真实片子:基准测试要用接近真实的素材才有参考价值。

常见问题

现象 原因 处理
容器里没有 /dev/dri compose 没有叠加 hw 文件 用两个 -f 启动
找不到硬件加速选项 服务器版本太旧,或者没有 Plex Pass 升级服务器;账号需要有 Plex Pass
虚拟机里没有核显 没有做 GPU 直通 在宿主机或物理机上运行
一个 4K 转码就卡住 软件转码 4K 很吃 CPU 尽量让客户端直接播放,或者准备一个 1080p 版本

模板规则

  • 先检查,再买硬件:基准测试用你自己的片子。
  • 硬件转码按官方订阅使用。
  • 估算只是参考,以实际播放时的 Dashboard 为准。

项目资源

用途 地址
硬件加速(官方) https://support.plex.tv/articles/115002178853-using-hardware-accelerated-streaming/
官方 Docker 镜像(含 /dev/dri 说明) https://github.com/plexinc/pms-docker
ffprobe 文档 https://ffmpeg.org/ffprobe.html
Plex 服务条款 https://www.plex.tv/about/privacy-legal/plex-terms-of-service/

能不能硬件转码,看 /dev/dri 和订阅;不能的话软件转码能撑几路,看基准测试。两个问题都有了答案,再决定买什么机器。