跳到主要内容

向主代码库贡献代码

获取源代码

核心、Web界面、Docker和文档

这个仓库包含了主要的Frigate应用程序及其所有依赖项。

blakeblackshear/frigate复制(fork)到你自己的GitHub账户,然后将复制的仓库克隆到你的本地机器。

从这里,按照以下指南进行操作:

Frigate Home Assistant插件

这个仓库包含了Home Assistant插件,用于Home Assistant OS和兼容的安装。它允许你通过Home Assistant的Supervisor标签页运行Frigate。

blakeblackshear/frigate-hass-addons复制到你自己的GitHub账户,然后将复制的仓库克隆到你的本地机器。

Frigate Home Assistant集成

这个仓库包含了自定义集成,可以让你的Home Assistant安装自动为Frigate实例创建实体,无论你是将Frigate作为独立的Docker容器运行还是作为Home Assistant插件运行。

blakeblackshear/frigate-hass-integration复制到你自己的GitHub账户,然后将复制的仓库克隆到你的本地机器。

核心

前提条件

  • GNU make
  • Docker (包括buildx插件)
  • 额外的检测器(Coral、OpenVINO等)是可选的,但建议用于模拟真实世界的性能。
备注

一个Coral设备一次只能被一个进程使用,因此如果将Coral用于开发目的,建议使用额外的Coral设备。

设置

1. 使用Visual Studio Code打开仓库

打开后,你应该会收到在远程容器中打开项目的提示。这将在基础Frigate容器之上构建一个安装了所有开发依赖项的容器。这确保了每个人都使用一致的开发环境,而无需在主机上安装任何依赖项。

2. 修改本地配置文件以进行测试

将文件放在仓库根目录的config/config.yml中。

这里是一个示例,但请根据你的需求修改:

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使用率。

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

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

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

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

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界面

前提条件

  • 所有核心前提条件 另一个本地可用的运行中的Frigate实例
  • Node.js 20

进行更改

1. 设置Frigate实例

Web UI需要一个Frigate实例来交互以获取所有数据。你可以在本地运行一个实例(推荐)或连接到网络上可访问的独立实例。

要运行本地实例,请按照核心开发说明进行操作。

如果你不会对Frigate HTTP API进行任何更改,可以将web开发服务器连接到网络上的任何Frigate实例。跳过这一步,直接转到3a

2. 安装依赖项

cd web && npm install

3. 运行开发服务器

cd web && npm run dev
3a. 针对非本地实例运行开发服务器

要针对非本地实例运行开发服务器,你需要将vite.config.ts中的localhost值替换为非本地后端服务器的IP地址。

4. 进行更改

Web UI使用VitePreactTailwind CSS构建。

轻量级指南和建议:

  • 避免添加更多依赖项。web UI旨在轻量化和快速加载。
  • 不要进行大规模的改动。对于任何大型或架构性的想法,请在GitHub上开启讨论
  • 确保lint通过。此命令将确保基本符合样式规范,应用尽可能多的自动修复,包括Prettier格式化。
npm run lint
npm run test
  • 在不同浏览器中测试。Firefox、Chrome和Safari都有使它们成为独特目标的不同特性。

文档

前提条件

  • Node.js 20

进行更改

1. 安装

cd docs && npm install

2. 本地开发

npm run start

此命令启动本地开发服务器并打开浏览器窗口。大多数更改无需重启服务器即可实时反映。

文档使用Docusaurus v3构建。请参阅Docusaurus文档以获取有关如何修改Frigate文档的更多信息。

3. 构建(可选)

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配置更改时,可以使用以下命令复制并重新加载配置进行测试,而无需重新构建容器:

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来管理Web UI的翻译。要贡献翻译,请在Weblate注册一个账户并导航到Frigate NVR项目:

https://hosted.weblate.org/projects/frigate-nvr/

在翻译时,保持现有的键结构,只翻译值。确保你的翻译保持适当的格式,包括任何占位符变量(如{{example}})。