跳到主要内容

硬件加速

建议更新配置,启用 ffmpeg 硬件加速解码。根据您的系统,这些参数可能不兼容。有关 ffmpeg 硬件加速解码的更多信息,请访问:https://trac.ffmpeg.org/wiki/HWAccelIntro。

正式支持

基于英特尔的 CPU

通过 VAAPI

VAAPI 支持自动配置文件选择,因此可自动处理 H.264 和 H.265 数据流。如果 QSV 不能工作,建议所有基于英特尔的 CPU 都使用 VAAPI。

ffmpeg:
hwaccel_args: preset-vaapi
备注

对于某些处理器,比如 J4125,默认的驱动程序 iHD 似乎不能正确地进行硬件加速。你可能需要通过在 docker-compose 文件或HA OS 用户的 frigate.yaml中添加以下环境变量 LIBVA_DRIVER_NAME=i965 来将驱动程序更改为 i965

通过 Quicksync (仅限 >= 10代)

必须根据视频流的视频编码专门设置 QSV。

H.264 流

ffmpeg:
hwaccel_args: preset-intel-qsv-h264

H.265 流

ffmpeg:
hwaccel_args: preset-intel-qsv-h265

在 Docker 中配置英特尔 GPU 统计信息

为了让 Docker 容器能够访问 intel_gpu_top 命令以获取 GPU 统计数据,还需要进行其他配置。有两个选项:

  1. 以特权身份运行容器。
  2. 添加 CAP_PERFMON 功能(注意:可能需要将 perf_event_paranoid 设置得足够低,以允许访问性能事件系统。)

以特权身份运行

这种方法可行,但它赋予容器的权限超过了实际需要。

Docker Compose - Privileged
services:
frigate:
...
image: frigate:stable
privileged: true
Docker Run CLI - Privileged
docker run -d \
--name frigate \
...
--privileged \
frigate:stable

CAP_PERFMON

只有最新版本的 Docker 支持 CAP_PERFMON 功能。你可以通过运行: docker run --cap-add=CAP_PERFMON hello-world 来测试你的 Docker 是否支持该功能。

Docker Compose - CAP_PERFMON
services:
frigate:
...
image: frigate:stable
cap_add:
- CAP_PERFMON
Docker Run CLI - CAP_PERFMON
docker run -d \
--name frigate \
...
--cap-add=CAP_PERFMON \
frigate:stable

perf_event_paranoid

注意:必须为整个系统更改此设置。

有关不同分布的各种值的更多信息,请参阅 https://askubuntu.com/questions/1400874/what-does-perf-paranoia-level-four-do。

根据操作系统和内核配置的不同,您可能需要更改 /proc/sys/kernel/perf_event_paranoid 内核可调参数。你可以运行 sudo sh -c 'echo 2 >/proc/sys/kernel/perf_event_paranoid' 来测试更改,更改将持续到重启。运行 sudo sh -c 'echo kernel.perf_event_paranoid=2 >> /etc/sysctl.d/local.conf' 可使更改永久生效。

通过 libva-mesa 驱动程序运行的 AMD/ATI GPU(Radeon HD 2000 及更新的 GPU)

VAAPI 支持自动配置文件选择,因此可自动处理 H.264 和 H.265 数据流。

备注

你需要在 docker-compose 文件或HA OS 用户的 frigate.yaml添加以下环境变量 LIBVA_DRIVER_NAME=radeonsi 将驱动程序更改为 radeonsi

ffmpeg:
hwaccel_args: preset-vaapi

NVIDIA GPUs

虽然旧版 GPU 也能使用,但建议使用受支持的现代 GPU。NVIDIA 提供了一个matrix of supported GPUs and features,如果您的显卡在列表中并支持 CUVID/NVDEC,那么它很可能可以与 Frigate 一起进行解码。不过,您还必须使用能与 FFmpeg 配合使用的驱动程序版本。较旧的驱动程序版本可能缺少符号而无法工作,较新的驱动程序版本也不支持较旧的显卡。解决这个问题的唯一办法是提供自己的 FFmpeg,它将与你的驱动程序版本一起工作,但这是不支持的,而且可能根本无法正常工作。

有关显卡及其兼容驱动程序的更完整列表,请参阅driver release readme

如果你的发行版不提供 NVIDIA 驱动程序软件包,你可以在此下载

在Docker中配置 Nvidia GPUs

Docker 容器需要额外的配置才能访问 NVIDIA GPU。支持的方法是安装NVIDIA Container Toolkit,并向 Docker 指定 GPU。具体方法取决于 Docker 的运行方式:

Docker Compose - Nvidia GPU

services:
frigate:
...
image: frigate:stable
deploy: # <------------- Add this section
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['0'] # this is only needed when using multiple GPUs
count: 1 # number of GPUs
capabilities: [gpu]

Docker Run CLI - Nvidia GPU

docker run -d \
--name frigate \
...
--gpus=all \
frigate:stable

设置解码器

您需要在 hwaccel_args 中传递的解码器取决于输入视频。

支持的编解码器列表(您可以在容器中使用 ffmpeg -decoders | grep cuvid 来获取支持的编解码器)。

 V..... h263_cuvid           Nvidia CUVID H263 decoder (codec h263)
V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)
V..... hevc_cuvid Nvidia CUVID HEVC decoder (codec hevc)
V..... mjpeg_cuvid Nvidia CUVID MJPEG decoder (codec mjpeg)
V..... mpeg1_cuvid Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
V..... mpeg2_cuvid Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
V..... mpeg4_cuvid Nvidia CUVID MPEG4 decoder (codec mpeg4)
V..... vc1_cuvid Nvidia CUVID VC1 decoder (codec vc1)
V..... vp8_cuvid Nvidia CUVID VP8 decoder (codec vp8)
V..... vp9_cuvid Nvidia CUVID VP9 decoder (codec vp9)

例如,对于 H264 视频,您可以选择 preset-nvidia-h264

ffmpeg:
hwaccel_args: preset-nvidia-h264

如果一切正常,性能应该会有显著提高。 通过运行 nvidia-smi,验证硬件解码是否正常工作,其中应显示 ffmpeg 进程:

备注

由于 docker 的限制nvidia-smi 在容器内运行时可能不会显示ffmpeg 进程。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.38 Driver Version: 455.38 CUDA Version: 11.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce GTX 166... Off | 00000000:03:00.0 Off | N/A |
| 38% 41C P2 36W / 125W | 2082MiB / 5942MiB | 5% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 12737 C ffmpeg 249MiB |
| 0 N/A N/A 12751 C ffmpeg 249MiB |
| 0 N/A N/A 12772 C ffmpeg 249MiB |
| 0 N/A N/A 12775 C ffmpeg 249MiB |
| 0 N/A N/A 12800 C ffmpeg 249MiB |
| 0 N/A N/A 12811 C ffmpeg 417MiB |
| 0 N/A N/A 12827 C ffmpeg 417MiB |
+-----------------------------------------------------------------------------+

如果看不到这些进程,请检查容器的 docker logs 并查找解码错误。

这些说明最初基于 Jellyfin 文档