2025-04-29 16:20:14 +03:00
|
|
|
|
---
|
|
|
|
|
|
id: contributing
|
|
|
|
|
|
title: 向主代码库贡献代码
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 获取源代码
|
|
|
|
|
|
|
|
|
|
|
|
### 核心、Web界面、Docker和文档
|
|
|
|
|
|
|
|
|
|
|
|
这个仓库包含了主要的Frigate应用程序及其所有依赖项。
|
|
|
|
|
|
|
|
|
|
|
|
将[blakeblackshear/frigate](https://github.com/blakeblackshear/frigate.git)复制(fork)到你自己的GitHub账户,然后将复制的仓库克隆到你的本地机器。
|
|
|
|
|
|
|
|
|
|
|
|
从这里,按照以下指南进行操作:
|
|
|
|
|
|
|
2025-04-29 16:58:32 +03:00
|
|
|
|
- [核心](#核心)
|
|
|
|
|
|
- [Web界面](#web界面)
|
|
|
|
|
|
- [文档](#文档)
|
2025-04-29 16:20:14 +03:00
|
|
|
|
|
|
|
|
|
|
### Frigate Home Assistant插件
|
|
|
|
|
|
|
|
|
|
|
|
这个仓库包含了Home Assistant插件,用于Home Assistant OS和兼容的安装。它允许你通过Home Assistant的Supervisor标签页运行Frigate。
|
|
|
|
|
|
|
|
|
|
|
|
将[blakeblackshear/frigate-hass-addons](https://github.com/blakeblackshear/frigate-hass-addons)复制到你自己的GitHub账户,然后将复制的仓库克隆到你的本地机器。
|
|
|
|
|
|
|
|
|
|
|
|
### Frigate Home Assistant集成
|
|
|
|
|
|
|
2025-04-29 16:58:32 +03:00
|
|
|
|
这个仓库包含了自定义集成,可以让你的Home Assistant安装自动为Frigate实例创建实体,无论你是将Frigate作为独立的Docker容器运行还是作为[Home Assistant插件](#frigate-home-assistant插件)运行。
|
2025-04-29 16:20:14 +03:00
|
|
|
|
|
|
|
|
|
|
将[blakeblackshear/frigate-hass-integration](https://github.com/blakeblackshear/frigate-hass-integration)复制到你自己的GitHub账户,然后将复制的仓库克隆到你的本地机器。
|
|
|
|
|
|
|
|
|
|
|
|
## 核心
|
|
|
|
|
|
|
|
|
|
|
|
### 前提条件
|
|
|
|
|
|
|
|
|
|
|
|
- GNU make
|
|
|
|
|
|
- Docker (包括buildx插件)
|
|
|
|
|
|
- 额外的检测器(Coral、OpenVINO等)是可选的,但建议用于模拟真实世界的性能。
|
|
|
|
|
|
|
|
|
|
|
|
:::note
|
|
|
|
|
|
|
|
|
|
|
|
一个Coral设备一次只能被一个进程使用,因此如果将Coral用于开发目的,建议使用额外的Coral设备。
|
|
|
|
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
|
|
|
|
### 设置
|
|
|
|
|
|
|
|
|
|
|
|
#### 1. 使用Visual Studio Code打开仓库
|
|
|
|
|
|
|
|
|
|
|
|
打开后,你应该会收到在远程容器中打开项目的提示。这将在基础Frigate容器之上构建一个安装了所有开发依赖项的容器。这确保了每个人都使用一致的开发环境,而无需在主机上安装任何依赖项。
|
|
|
|
|
|
|
|
|
|
|
|
#### 2. 修改本地配置文件以进行测试
|
|
|
|
|
|
|
|
|
|
|
|
将文件放在仓库根目录的`config/config.yml`中。
|
|
|
|
|
|
|
|
|
|
|
|
这里是一个示例,但请根据你的需求修改:
|
|
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
|
mqtt:
|
|
|
|
|
|
host: mqtt
|
|
|
|
|
|
|
|
|
|
|
|
cameras:
|
|
|
|
|
|
test:
|
|
|
|
|
|
ffmpeg:
|
|
|
|
|
|
inputs:
|
|
|
|
|
|
- path: /media/frigate/car-stopping.mp4
|
|
|
|
|
|
input_args: -re -stream_loop -1 -fflags +genpts
|
|
|
|
|
|
roles:
|
|
|
|
|
|
- detect
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
这些输入参数告诉ffmpeg以无限循环方式读取mp4文件。你可以在这里使用任何有效的ffmpeg输入。
|
|
|
|
|
|
|
|
|
|
|
|
#### 3. 收集一些mp4文件用于测试
|
|
|
|
|
|
|
|
|
|
|
|
在仓库根目录创建一个`debug`文件夹并放入这些文件。如果你启用了录制功能,录制的文件也会保存在这里。更新上面步骤2中的配置以指向正确的文件。你可以查看仓库中的`docker-compose.yml`文件来了解卷的映射方式。
|
|
|
|
|
|
|
|
|
|
|
|
#### 4. 从命令行运行Frigate
|
|
|
|
|
|
|
|
|
|
|
|
VS Code会为你启动Docker Compose文件并打开一个连接到`frigate-dev`的终端窗口。
|
|
|
|
|
|
|
|
|
|
|
|
- 根据你的开发硬件,你可能需要修改项目根目录中的`docker-compose.yml`以传递USB Coral或GPU进行硬件加速。
|
|
|
|
|
|
- 运行`python3 -m frigate`启动后端。
|
|
|
|
|
|
- 在VS Code的另一个终端窗口中,切换到`web`目录并运行`npm install && npm run dev`启动前端。
|
|
|
|
|
|
|
|
|
|
|
|
#### 5. 清理
|
|
|
|
|
|
|
|
|
|
|
|
关闭VS Code后,可能仍有容器在运行。要关闭所有内容,只需运行`docker-compose down -v`来清理所有容器。
|
|
|
|
|
|
|
|
|
|
|
|
### 测试
|
|
|
|
|
|
|
|
|
|
|
|
#### FFMPEG硬件加速
|
|
|
|
|
|
|
|
|
|
|
|
以下命令在容器内部使用,以确保硬件加速正常工作。
|
|
|
|
|
|
|
|
|
|
|
|
**树莓派(64位)**
|
|
|
|
|
|
|
|
|
|
|
|
这应该在top中显示低于50%的CPU使用率,不使用`-c:v h264_v4l2m2m`时约为80%的CPU使用率。
|
|
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
|
ffmpeg -c:v h264_v4l2m2m -re -stream_loop -1 -i https://streams.videolan.org/ffmpeg/incoming/720p60.mp4 -f rawvideo -pix_fmt yuv420p pipe: > /dev/null
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**NVIDIA GPU**
|
|
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
|
ffmpeg -c:v h264_cuvid -re -stream_loop -1 -i https://streams.videolan.org/ffmpeg/incoming/720p60.mp4 -f rawvideo -pix_fmt yuv420p pipe: > /dev/null
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**NVIDIA Jetson**
|
|
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
|
ffmpeg -c:v h264_nvmpi -re -stream_loop -1 -i https://streams.videolan.org/ffmpeg/incoming/720p60.mp4 -f rawvideo -pix_fmt yuv420p pipe: > /dev/null
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**VAAPI**
|
|
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
|
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format yuv420p -re -stream_loop -1 -i https://streams.videolan.org/ffmpeg/incoming/720p60.mp4 -f rawvideo -pix_fmt yuv420p pipe: > /dev/null
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**QSV**
|
|
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
|
ffmpeg -c:v h264_qsv -re -stream_loop -1 -i https://streams.videolan.org/ffmpeg/incoming/720p60.mp4 -f rawvideo -pix_fmt yuv420p pipe: > /dev/null
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Web界面
|
|
|
|
|
|
|
|
|
|
|
|
### 前提条件
|
|
|
|
|
|
|
|
|
|
|
|
- 所有[核心](#core)前提条件 _或_ 另一个本地可用的运行中的Frigate实例
|
|
|
|
|
|
- Node.js 20
|
|
|
|
|
|
|
|
|
|
|
|
### 进行更改
|
|
|
|
|
|
|
|
|
|
|
|
#### 1. 设置Frigate实例
|
|
|
|
|
|
|
|
|
|
|
|
Web UI需要一个Frigate实例来交互以获取所有数据。你可以在本地运行一个实例(推荐)或连接到网络上可访问的独立实例。
|
|
|
|
|
|
|
|
|
|
|
|
要运行本地实例,请按照[核心](#core)开发说明进行操作。
|
|
|
|
|
|
|
|
|
|
|
|
如果你不会对Frigate HTTP API进行任何更改,可以将web开发服务器连接到网络上的任何Frigate实例。跳过这一步,直接转到[3a](#3a-针对非本地实例运行开发服务器)。
|
|
|
|
|
|
|
|
|
|
|
|
#### 2. 安装依赖项
|
|
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
|
cd web && npm install
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 3. 运行开发服务器
|
|
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
|
cd web && npm run dev
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
##### 3a. 针对非本地实例运行开发服务器
|
|
|
|
|
|
|
|
|
|
|
|
要针对非本地实例运行开发服务器,你需要将`vite.config.ts`中的`localhost`值替换为非本地后端服务器的IP地址。
|
|
|
|
|
|
|
|
|
|
|
|
#### 4. 进行更改
|
|
|
|
|
|
|
|
|
|
|
|
Web UI使用[Vite](https://vitejs.dev/)、[Preact](https://preactjs.com)和[Tailwind CSS](https://tailwindcss.com)构建。
|
|
|
|
|
|
|
|
|
|
|
|
轻量级指南和建议:
|
|
|
|
|
|
|
|
|
|
|
|
- 避免添加更多依赖项。web UI旨在轻量化和快速加载。
|
|
|
|
|
|
- 不要进行大规模的改动。对于任何大型或架构性的想法,请[在GitHub上开启讨论](https://github.com/blakeblackshear/frigate/discussions/new)。
|
|
|
|
|
|
- 确保`lint`通过。此命令将确保基本符合样式规范,应用尽可能多的自动修复,包括Prettier格式化。
|
|
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
|
npm run lint
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
- 添加单元测试并确保它们通过。尽可能地,你应该在进行更改时努力_增加_测试覆盖率。这将有助于确保功能在未来不会意外损坏。
|
|
|
|
|
|
- 如果在运行测试时遇到"TypeError: Cannot read properties of undefined (reading 'context')"之类的错误消息,这可能是由于vitest中的这些问题(https://github.com/vitest-dev/vitest/issues/1910, https://github.com/vitest-dev/vitest/issues/1652),但我还没能解决它们。
|
|
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
|
npm run test
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
- 在不同浏览器中测试。Firefox、Chrome和Safari都有使它们成为独特目标的不同特性。
|
|
|
|
|
|
|
|
|
|
|
|
## 文档
|
|
|
|
|
|
|
|
|
|
|
|
### 前提条件
|
|
|
|
|
|
|
|
|
|
|
|
- Node.js 20
|
|
|
|
|
|
|
|
|
|
|
|
### 进行更改
|
|
|
|
|
|
|
|
|
|
|
|
#### 1. 安装
|
|
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
|
cd docs && npm install
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### 2. 本地开发
|
|
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
|
npm run start
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
此命令启动本地开发服务器并打开浏览器窗口。大多数更改无需重启服务器即可实时反映。
|
|
|
|
|
|
|
|
|
|
|
|
文档使用[Docusaurus v3](https://docusaurus.io)构建。请参阅Docusaurus文档以获取有关如何修改Frigate文档的更多信息。
|
|
|
|
|
|
|
|
|
|
|
|
#### 3. 构建(可选)
|
|
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
|
npm run build
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
此命令将静态内容生成到`build`目录中,可以使用任何静态内容托管服务来提供服务。
|
|
|
|
|
|
|
|
|
|
|
|
## 官方构建
|
|
|
|
|
|
|
|
|
|
|
|
设置buildx进行多架构构建
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
docker buildx stop builder && docker buildx rm builder # <---- 如果已存在
|
|
|
|
|
|
docker run --privileged --rm tonistiigi/binfmt --install all
|
|
|
|
|
|
docker buildx create --name builder --driver docker-container --driver-opt network=host --use
|
|
|
|
|
|
docker buildx inspect builder --bootstrap
|
|
|
|
|
|
make push
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 其他
|
|
|
|
|
|
|
|
|
|
|
|
### Nginx
|
|
|
|
|
|
|
|
|
|
|
|
当从开发容器内测试nginx配置更改时,可以使用以下命令复制并重新加载配置进行测试,而无需重新构建容器:
|
|
|
|
|
|
|
|
|
|
|
|
```console
|
|
|
|
|
|
sudo cp docker/main/rootfs/usr/local/nginx/conf/* /usr/local/nginx/conf/ && sudo /usr/local/nginx/sbin/nginx -s reload
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 贡献Web UI的翻译
|
|
|
|
|
|
|
|
|
|
|
|
Frigate使用[Weblate](https://weblate.org)来管理Web UI的翻译。要贡献翻译,请在Weblate注册一个账户并导航到Frigate NVR项目:
|
|
|
|
|
|
|
|
|
|
|
|
https://hosted.weblate.org/projects/frigate-nvr/
|
|
|
|
|
|
|
|
|
|
|
|
在翻译时,保持现有的键结构,只翻译值。确保你的翻译保持适当的格式,包括任何占位符变量(如`{{example}}`)。
|