让群辉的ffmpeg用上硬件加速

最近下了一些电视节目的录像,是古早的 RMVB 格式,需要转成 MP4 才能在 Plex 中播放,但是节目有点多,所以研究了一下硬件加速。群辉 DS220+ 是支持硬件加速的,但是想用起来着实有点不太容易。

# 更换 ffmpeg

群辉自带的 ffmpeg 是没有硬件加速模块的,必须用 Docker 安装一个新版本的 ffmpeg ,或者加入社区套件源,比如[矿神的套件源](https://spk7.imnks.com/)。从社区中下载的 ffmpeg 一般是带 vaapi 和 qsv 加速的。

下载后,可以运行下面的命令查看是否支持硬件加速

```bash
ffmpeg -hwaccels
```

如果出现了一些名字,比如 `vaapi` `qsv` 则表示支持这些模式的硬件加速。

# 设置 ffmpeg 参数

这里暂时只记录 vaapi 加速的参数

```bash
ffmpeg6 -hwaccel vaapi \
  -hwaccel_output_format vaapi \
  -vaapi_device /dev/dri/renderD128 \
  -i INPUT \
  -vf 'format=nv12|vaapi,hwupload' \
  -c:v h264_vaapi \
  -c:a aac \
  -format mp4 \
  OUTPUT
```

首先 `-hwaccel vaapi` 指定加速模式,`-hwaccel_output_format vaapi` 指定输出格式也用 vaapi 而不是回到软件模式,配合 `-vf 'format=nv12|vaapi,hwupload'` 可以避免一些错误,`-vaapi_device` 指定硬件。

# 改变用户或权限

这是个非常细节的坑,很多文章里面没有提到。设备 `/dev/dri/renderD128` 并不是所有用户都可以用的,它的权限是这样的

```plaintext
crw-rw---- 1 root videodriver 226, 128 Apr  5 15:53 /dev/dri/renderD128
```

该设备属于 root 用户和 videodriver 组,其他组中的用户是没有任何权限的!

所以,要么我们使用 root 用户执行,要么将这个设备的权限修改一下,添加 `o+x` 。也有[文章](https://timothybasanov.com/2018/12/08/hardware-accelerated-h264-encoding-synology-nas.html)说直接 `chmod 777` ,但这样可能有点太危险了。总之,用一般的用户是无法调用硬解的。但是如果是通过群辉套件安装的 Plex,用户 PlexMediaServer 已经在 videodriver 这个组里了,所以是可以直接调用的。我试了一下,群辉好像把 `usermod` 命令隐藏了,DSM中也没找到可以把用户加入 videodriver 的办法,所以要么切换到 root 用户执行,要么修改设备的权限,是比较稳妥的办法。