add docs chinese i18n

This commit is contained in:
ZhaiSoul 2025-04-29 21:20:14 +08:00
parent cee5d6e5ee
commit be35a90b83
63 changed files with 10400 additions and 0 deletions

View File

@ -17,6 +17,18 @@ const config: Config = {
markdown: {
mermaid: true,
},
i18n: {
defaultLocale: 'en',
locales: ['en', 'zh'],
localeConfigs: {
en: {
label: 'English',
},
zh: {
label: '简体中文',
},
},
},
themeConfig: {
algolia: {
appId: 'WIURGBNBPY',
@ -82,6 +94,10 @@ const config: Config = {
label: 'Demo',
position: 'right',
},
{
type: 'localeDropdown',
position: 'right',
},
{
href: 'https://github.com/blakeblackshear/frigate',
label: 'GitHub',

444
docs/i18n/zh/code.json Normal file
View File

@ -0,0 +1,444 @@
{
"theme.ErrorPageContent.title": {
"message": "页面崩溃",
"description": "页面崩溃时显示的标题"
},
"theme.blog.archive.title": {
"message": "归档",
"description": "博客归档页面的标题"
},
"theme.blog.archive.description": {
"message": "归档",
"description": "博客归档页面的描述"
},
"theme.BackToTopButton.buttonAriaLabel": {
"message": "返回顶部",
"description": "返回顶部按钮的ARIA标签"
},
"theme.blog.paginator.navAriaLabel": {
"message": "博客列表导航",
"description": "博客分页导航的ARIA标签"
},
"theme.blog.paginator.newerEntries": {
"message": "更新的文章",
"description": "导航到较新博客文章的标签"
},
"theme.blog.paginator.olderEntries": {
"message": "更早的文章",
"description": "导航到较旧博客文章的标签"
},
"theme.blog.post.paginator.navAriaLabel": {
"message": "博客文章导航",
"description": "博客文章分页导航的ARIA标签"
},
"theme.blog.post.paginator.newerPost": {
"message": "更新的文章",
"description": "导航到较新博客文章的按钮标签"
},
"theme.blog.post.paginator.olderPost": {
"message": "更早的文章",
"description": "导航到较旧博客文章的按钮标签"
},
"theme.colorToggle.ariaLabel": {
"message": "切换暗色/亮色模式(当前为{mode})",
"description": "导航栏颜色模式切换的ARIA标签"
},
"theme.colorToggle.ariaLabel.mode.dark": {
"message": "暗色模式",
"description": "暗色模式的名称"
},
"theme.colorToggle.ariaLabel.mode.light": {
"message": "亮色模式",
"description": "亮色模式的名称"
},
"theme.docs.breadcrumbs.navAriaLabel": {
"message": "面包屑导航",
"description": "面包屑导航的ARIA标签"
},
"theme.docs.DocCard.categoryDescription.plurals": {
"message": "1个项目|{count}个项目",
"description": "分类卡片默认描述,显示该分类包含的项目数量"
},
"theme.docs.paginator.navAriaLabel": {
"message": "文档页面导航",
"description": "文档分页导航的ARIA标签"
},
"theme.docs.paginator.previous": {
"message": "上一篇",
"description": "导航到上一篇文档的标签"
},
"theme.docs.paginator.next": {
"message": "下一篇",
"description": "导航到下一篇文档的标签"
},
"theme.tags.tagsPageLink": {
"message": "查看所有标签",
"description": "指向标签列表页面的链接标签"
},
"theme.docs.tagDocListPageTitle.nDocsTagged": {
"message": "1篇文档标记|{count}篇文档标记",
"description": "\"{count}篇文档标记\"的复数化标签"
},
"theme.docs.tagDocListPageTitle": {
"message": "{nDocsTagged} \"{tagName}\"",
"description": "文档标签页面的标题"
},
"theme.docs.versionBadge.label": {
"message": "版本: {versionLabel}"
},
"theme.docs.versions.unreleasedVersionLabel": {
"message": "这是{siteTitle} {versionLabel}版本的未发布文档。",
"description": "告知用户正在浏览未发布文档版本的标签"
},
"theme.docs.versions.unmaintainedVersionLabel": {
"message": "这是{siteTitle} {versionLabel}版本的文档,已不再积极维护。",
"description": "告知用户正在浏览未维护文档版本的标签"
},
"theme.docs.versions.latestVersionSuggestionLabel": {
"message": "查看最新文档,请访问{latestVersionLink}({versionLabel})。",
"description": "建议用户查看最新版本的标签"
},
"theme.docs.versions.latestVersionLinkLabel": {
"message": "最新版本",
"description": "最新版本建议链接的标签"
},
"theme.common.editThisPage": {
"message": "编辑此页",
"description": "编辑当前页面的链接标签"
},
"theme.common.headingLinkTitle": {
"message": "直达{heading}",
"description": "指向标题的链接标题"
},
"theme.lastUpdated.atDate": {
"message": "于{date}",
"description": "描述页面最后更新日期的词语"
},
"theme.lastUpdated.byUser": {
"message": "由{user}",
"description": "描述页面最后更新者的词语"
},
"theme.lastUpdated.lastUpdatedAtBy": {
"message": "最后更新{atDate}{byUser}",
"description": "显示页面最后更新时间和更新者的句子"
},
"theme.NotFound.title": {
"message": "页面未找到",
"description": "404页面的标题"
},
"theme.navbar.mobileVersionsDropdown.label": {
"message": "版本",
"description": "移动视图下导航栏版本下拉菜单的标签"
},
"theme.tags.tagsListLabel": {
"message": "标签:",
"description": "标签列表旁的标签"
},
"theme.AnnouncementBar.closeButtonAriaLabel": {
"message": "关闭",
"description": "公告栏关闭按钮的ARIA标签"
},
"theme.admonition.caution": {
"message": "注意",
"description": "Caution警告框(:::caution)的默认标签"
},
"theme.admonition.danger": {
"message": "危险",
"description": "Danger警告框(:::danger)的默认标签"
},
"theme.admonition.info": {
"message": "信息",
"description": "Info提示框(:::info)的默认标签"
},
"theme.admonition.note": {
"message": "备注",
"description": "Note提示框(:::note)的默认标签"
},
"theme.admonition.tip": {
"message": "提示",
"description": "Tip提示框(:::tip)的默认标签"
},
"theme.admonition.warning": {
"message": "警告",
"description": "Warning警告框(:::warning)的默认标签"
},
"theme.blog.sidebar.navAriaLabel": {
"message": "博客最新文章导航",
"description": "博客侧边栏最新文章的ARIA标签"
},
"theme.CodeBlock.copied": {
"message": "已复制",
"description": "代码块复制按钮的标签"
},
"theme.CodeBlock.copyButtonAriaLabel": {
"message": "复制代码到剪贴板",
"description": "代码块复制按钮的ARIA标签"
},
"theme.CodeBlock.copy": {
"message": "复制",
"description": "代码块复制按钮的标签"
},
"theme.CodeBlock.wordWrapToggle": {
"message": "切换自动换行",
"description": "代码块自动换行切换按钮的标题属性"
},
"theme.DocSidebarItem.expandCategoryAriaLabel": {
"message": "展开侧边栏分类'{label}'",
"description": "展开侧边栏分类的ARIA标签"
},
"theme.DocSidebarItem.collapseCategoryAriaLabel": {
"message": "折叠侧边栏分类'{label}'",
"description": "折叠侧边栏分类的ARIA标签"
},
"theme.NavBar.navAriaLabel": {
"message": "主导航",
"description": "主导航的ARIA标签"
},
"theme.NotFound.p1": {
"message": "找不到您要访问的内容。",
"description": "404页面的第一段文字"
},
"theme.NotFound.p2": {
"message": "请联系该网站所有者告知他们原始URL的链接已失效。",
"description": "404页面的第二段文字"
},
"theme.navbar.mobileLanguageDropdown.label": {
"message": "语言",
"description": "移动端语言切换下拉菜单的标签"
},
"theme.TOCCollapsible.toggleButtonLabel": {
"message": "本页目录",
"description": "可折叠目录组件的按钮标签"
},
"theme.blog.post.readMore": {
"message": "阅读更多",
"description": "博客文章摘要中链接到全文的标签"
},
"theme.blog.post.readMoreLabel": {
"message": "阅读更多关于{title}",
"description": "从摘要链接到完整博客文章的ARIA标签"
},
"theme.blog.post.readingTime.plurals": {
"message": "1分钟阅读|{readingTime}分钟阅读",
"description": "\"{readingTime}分钟阅读\"的复数化标签"
},
"theme.docs.breadcrumbs.home": {
"message": "首页",
"description": "面包屑导航中首页的ARIA标签"
},
"theme.docs.sidebar.collapseButtonTitle": {
"message": "收起侧边栏",
"description": "文档侧边栏收起按钮的标题属性"
},
"theme.docs.sidebar.collapseButtonAriaLabel": {
"message": "收起侧边栏",
"description": "文档侧边栏收起按钮的ARIA标签"
},
"theme.docs.sidebar.navAriaLabel": {
"message": "文档侧边栏",
"description": "侧边栏导航的ARIA标签"
},
"theme.docs.sidebar.closeSidebarButtonAriaLabel": {
"message": "关闭导航栏",
"description": "移动端侧边栏关闭按钮的ARIA标签"
},
"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": {
"message": "← 返回主菜单",
"description": "移动端导航栏二级菜单中返回主菜单的按钮标签"
},
"theme.docs.sidebar.toggleSidebarButtonAriaLabel": {
"message": "切换导航栏",
"description": "移动端导航汉堡菜单按钮的ARIA标签"
},
"theme.docs.sidebar.expandButtonTitle": {
"message": "展开侧边栏",
"description": "文档侧边栏展开按钮的标题和ARIA标签"
},
"theme.docs.sidebar.expandButtonAriaLabel": {
"message": "展开侧边栏",
"description": "文档侧边栏展开按钮的ARIA标签"
},
"theme.SearchBar.seeAll": {
"message": "查看全部{count}个结果"
},
"theme.SearchPage.documentsFound.plurals": {
"message": "找到1篇文档|找到{count}篇文档",
"description": "\"{count}篇文档\"的复数化标签"
},
"theme.SearchPage.existingResultsTitle": {
"message": "搜索\"{query}\"的结果",
"description": "非空查询的搜索页面标题"
},
"theme.SearchPage.emptyResultsTitle": {
"message": "搜索文档",
"description": "空查询的搜索页面标题"
},
"theme.SearchPage.inputPlaceholder": {
"message": "输入搜索内容",
"description": "搜索页面输入框的占位符"
},
"theme.SearchPage.inputLabel": {
"message": "搜索",
"description": "搜索页面输入框的ARIA标签"
},
"theme.SearchPage.algoliaLabel": {
"message": "由Algolia提供搜索",
"description": "Algolia标识的ARIA标签"
},
"theme.SearchPage.noResultsText": {
"message": "未找到结果",
"description": "空搜索结果的提示文本"
},
"theme.SearchPage.fetchingNewResults": {
"message": "正在获取新结果...",
"description": "获取新搜索结果的提示文本"
},
"theme.SearchBar.label": {
"message": "搜索",
"description": "搜索按钮的ARIA标签和占位符"
},
"theme.SearchModal.searchBox.resetButtonTitle": {
"message": "清空搜索",
"description": "搜索框重置按钮的标签和ARIA标签"
},
"theme.SearchModal.searchBox.cancelButtonText": {
"message": "取消",
"description": "搜索框取消按钮的标签和ARIA标签"
},
"theme.SearchModal.startScreen.recentSearchesTitle": {
"message": "最近搜索",
"description": "最近搜索的标题"
},
"theme.SearchModal.startScreen.noRecentSearchesText": {
"message": "无最近搜索记录",
"description": "无最近搜索时的提示文本"
},
"theme.SearchModal.startScreen.saveRecentSearchButtonTitle": {
"message": "保存此搜索",
"description": "保存最近搜索按钮的标签"
},
"theme.SearchModal.startScreen.removeRecentSearchButtonTitle": {
"message": "从历史记录中移除",
"description": "移除最近搜索按钮的标签"
},
"theme.SearchModal.startScreen.favoriteSearchesTitle": {
"message": "收藏搜索",
"description": "收藏搜索的标题"
},
"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": {
"message": "从收藏中移除",
"description": "移除收藏搜索按钮的标签"
},
"theme.SearchModal.errorScreen.titleText": {
"message": "无法获取结果",
"description": "搜索模态框错误界面的标题"
},
"theme.SearchModal.errorScreen.helpText": {
"message": "请检查您的网络连接。",
"description": "搜索模态框错误界面的帮助文本"
},
"theme.SearchModal.footer.selectText": {
"message": "选择",
"description": "回车键功能的说明文本"
},
"theme.SearchModal.footer.selectKeyAriaLabel": {
"message": "回车键",
"description": "选择功能的回车键ARIA标签"
},
"theme.SearchModal.footer.navigateText": {
"message": "导航",
"description": "上下箭头键功能的说明文本"
},
"theme.SearchModal.footer.navigateUpKeyAriaLabel": {
"message": "上箭头键",
"description": "向上导航的上箭头键ARIA标签"
},
"theme.SearchModal.footer.navigateDownKeyAriaLabel": {
"message": "下箭头键",
"description": "向下导航的下箭头键ARIA标签"
},
"theme.SearchModal.footer.closeText": {
"message": "关闭",
"description": "ESC键功能的说明文本"
},
"theme.SearchModal.footer.closeKeyAriaLabel": {
"message": "ESC键",
"description": "关闭模态框的ESC键ARIA标签"
},
"theme.SearchModal.footer.searchByText": {
"message": "搜索由",
"description": "Algolia搜索标识的说明文本"
},
"theme.SearchModal.noResultsScreen.noResultsText": {
"message": "没有找到",
"description": "无搜索结果时的提示文本前缀"
},
"theme.SearchModal.noResultsScreen.suggestedQueryText": {
"message": "尝试搜索",
"description": "无结果时建议查询的提示文本"
},
"theme.SearchModal.noResultsScreen.reportMissingResultsText": {
"message": "认为应该有搜索结果?",
"description": "报告缺失结果的问题文本"
},
"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": {
"message": "告诉我们。",
"description": "报告缺失结果的链接文本"
},
"theme.SearchModal.placeholder": {
"message": "搜索文档",
"description": "文档搜索弹出框输入框的占位符"
},
"theme.blog.post.plurals": {
"message": "1篇文章|{count}篇文章",
"description": "\"{count}篇文章\"的复数化标签"
},
"theme.blog.tagTitle": {
"message": "{nPosts}篇\"{tagName}\"标签的文章",
"description": "博客标签页面的标题"
},
"theme.blog.author.pageTitle": {
"message": "{authorName} - {nPosts}篇文章",
"description": "博客作者页面的标题"
},
"theme.blog.authorsList.pageTitle": {
"message": "作者列表",
"description": "作者列表页面的标题"
},
"theme.blog.authorsList.viewAll": {
"message": "查看所有作者",
"description": "博客作者列表页面的链接标签"
},
"theme.blog.author.noPosts": {
"message": "该作者尚未发表任何文章。",
"description": "作者无文章时的提示文本"
},
"theme.contentVisibility.unlistedBanner.title": {
"message": "未列出页面",
"description": "未列出内容横幅的标题"
},
"theme.contentVisibility.unlistedBanner.message": {
"message": "此页面未列出。搜索引擎不会索引它,只有拥有直接链接的用户可以访问。",
"description": "未列出内容横幅的消息"
},
"theme.contentVisibility.draftBanner.title": {
"message": "草稿页面",
"description": "草稿内容横幅的标题"
},
"theme.contentVisibility.draftBanner.message": {
"message": "此页面是草稿。仅在开发环境可见,不会包含在生产构建中。",
"description": "草稿内容横幅的消息"
},
"theme.ErrorPageContent.tryAgain": {
"message": "重试",
"description": "React错误边界捕获错误后重试渲染的按钮标签"
},
"theme.common.skipToMainContent": {
"message": "跳至主内容",
"description": "无障碍访问的跳过导航标签,允许通过键盘快速导航到主要内容"
},
"theme.tags.tagsPageTitle": {
"message": "标签",
"description": "标签列表页面的标题"
}
}

View File

@ -0,0 +1,662 @@
{
"version.label": {
"message": "Next",
"description": "当前版本标签"
},
"sidebar.docs.category.Frigate": {
"message": "Frigate",
"description": "文档侧边栏Frigate分类标签"
},
"sidebar.docs.category.Guides": {
"message": "指南",
"description": "文档侧边栏指南分类标签"
},
"sidebar.docs.category.Configuration": {
"message": "配置",
"description": "文档侧边栏配置分类标签"
},
"sidebar.docs.category.Configuration Files": {
"message": "配置文件",
"description": "文档侧边栏配置文件分类标签"
},
"sidebar.docs.category.Detectors": {
"message": "检测器",
"description": "文档侧边栏检测器分类标签"
},
"sidebar.docs.category.Enrichments": {
"message": "增强功能",
"description": "文档侧边栏增强功能分类标签"
},
"sidebar.docs.category.Cameras": {
"message": "摄像头",
"description": "文档侧边栏摄像头分类标签"
},
"sidebar.docs.category.Objects": {
"message": "对象检测",
"description": "文档侧边栏对象检测分类标签"
},
"sidebar.docs.category.Extra Configuration": {
"message": "扩展配置",
"description": "文档侧边栏扩展配置分类标签"
},
"sidebar.docs.category.Integrations": {
"message": "集成",
"description": "文档侧边栏集成分类标签"
},
"sidebar.docs.category.HTTP API": {
"message": "HTTP API",
"description": "文档侧边栏HTTP API分类标签"
},
"sidebar.docs.category.HTTP API.link.generated-index.title": {
"message": "Frigate HTTP API",
"description": "HTTP API分类索引页标题"
},
"sidebar.docs.category.HTTP API.link.generated-index.description": {
"message": "HTTP API接口文档",
"description": "HTTP API分类索引页描述"
},
"sidebar.docs.category.Auth": {
"message": "认证",
"description": "文档侧边栏认证分类标签"
},
"sidebar.docs.category.Events": {
"message": "事件",
"description": "文档侧边栏事件分类标签"
},
"sidebar.docs.category.Review": {
"message": "事件回顾",
"description": "文档侧边栏事件回顾分类标签"
},
"sidebar.docs.category.App": {
"message": "应用",
"description": "文档侧边栏应用分类标签"
},
"sidebar.docs.category.Logs": {
"message": "日志",
"description": "文档侧边栏日志分类标签"
},
"sidebar.docs.category.Preview": {
"message": "预览",
"description": "文档侧边栏预览分类标签"
},
"sidebar.docs.category.Notifications": {
"message": "通知",
"description": "文档侧边栏通知分类标签"
},
"sidebar.docs.category.Export": {
"message": "导出",
"description": "文档侧边栏导出分类标签"
},
"sidebar.docs.category.Media": {
"message": "媒体",
"description": "文档侧边栏媒体分类标签"
},
"sidebar.docs.category.Schemas": {
"message": "数据模型",
"description": "文档侧边栏数据模型分类标签"
},
"sidebar.docs.category.Frigate+": {
"message": "Frigate+",
"description": "文档侧边栏Frigate+分类标签"
},
"sidebar.docs.category.Troubleshooting": {
"message": "故障排除",
"description": "文档侧边栏故障排除分类标签"
},
"sidebar.docs.category.Development": {
"message": "开发",
"description": "文档侧边栏开发分类标签"
},
"sidebar.docs.link.Go2RTC Configuration Reference": {
"message": "Go2RTC配置参考",
"description": "侧边栏Go2RTC配置参考链接标签"
},
"sidebar.docs.doc.Auth": {
"message": "认证状态",
"description": "认证API文档标签"
},
"sidebar.docs.doc.Profile": {
"message": "用户资料",
"description": "用户资料API文档标签"
},
"sidebar.docs.doc.Logout": {
"message": "退出登录",
"description": "退出登录API文档标签"
},
"sidebar.docs.doc.Login": {
"message": "用户登录",
"description": "登录API文档标签"
},
"sidebar.docs.doc.Get Users": {
"message": "获取用户列表",
"description": "获取用户API文档标签"
},
"sidebar.docs.doc.Create User": {
"message": "创建用户",
"description": "创建用户API文档标签"
},
"sidebar.docs.doc.Delete User": {
"message": "删除用户",
"description": "删除用户API文档标签"
},
"sidebar.docs.doc.Update Password": {
"message": "更新密码",
"description": "更新密码API文档标签"
},
"sidebar.docs.doc.Update Role": {
"message": "更新角色",
"description": "更新角色API文档标签"
},
"sidebar.docs.doc.Get Faces": {
"message": "获取人脸数据",
"description": "获取人脸API文档标签"
},
"sidebar.docs.doc.Reclassify Face": {
"message": "重新分类人脸",
"description": "人脸重分类API文档标签"
},
"sidebar.docs.doc.Train Face": {
"message": "训练人脸模型",
"description": "人脸训练API文档标签"
},
"sidebar.docs.doc.Create Face": {
"message": "创建人脸数据",
"description": "创建人脸API文档标签"
},
"sidebar.docs.doc.Register Face": {
"message": "注册人脸特征",
"description": "人脸注册API文档标签"
},
"sidebar.docs.doc.Recognize Face": {
"message": "识别人脸",
"description": "人脸识别API文档标签"
},
"sidebar.docs.doc.Deregister Faces": {
"message": "注销人脸特征",
"description": "人脸注销API文档标签"
},
"sidebar.docs.doc.Reprocess License Plate": {
"message": "重新处理车牌",
"description": "车牌重处理API文档标签"
},
"sidebar.docs.doc.Reindex Embeddings": {
"message": "重建特征索引",
"description": "特征索引重建API文档标签"
},
"sidebar.docs.doc.Events": {
"message": "事件查询",
"description": "事件查询API文档标签"
},
"sidebar.docs.doc.Events Explore": {
"message": "事件探索",
"description": "事件探索API文档标签"
},
"sidebar.docs.doc.Event Ids": {
"message": "事件ID列表",
"description": "事件ID获取API文档标签"
},
"sidebar.docs.doc.Events Search": {
"message": "事件搜索",
"description": "事件搜索API文档标签"
},
"sidebar.docs.doc.Events Summary": {
"message": "事件摘要",
"description": "事件摘要API文档标签"
},
"sidebar.docs.doc.Event": {
"message": "事件详情",
"description": "单个事件详情API文档标签"
},
"sidebar.docs.doc.Delete Event": {
"message": "删除事件",
"description": "事件删除API文档标签"
},
"sidebar.docs.doc.Set Retain": {
"message": "设置保留标记",
"description": "事件保留标记设置API文档标签"
},
"sidebar.docs.doc.Delete Retain": {
"message": "清除保留标记",
"description": "事件保留标记清除API文档标签"
},
"sidebar.docs.doc.Send To Plus": {
"message": "发送至Plus",
"description": "事件发送至Plus服务API文档标签"
},
"sidebar.docs.doc.False Positive": {
"message": "误报标记",
"description": "标记事件为误报的API文档标签"
},
"sidebar.docs.doc.Set Sub Label": {
"message": "设置子标签",
"description": "设置事件子分类标签的API文档标签"
},
"sidebar.docs.doc.Set Description": {
"message": "设置描述",
"description": "设置事件描述的API文档标签"
},
"sidebar.docs.doc.Regenerate Description": {
"message": "重新生成描述",
"description": "重新生成事件描述的API文档标签"
},
"sidebar.docs.doc.Delete Events": {
"message": "批量删除事件",
"description": "批量删除事件的API文档标签"
},
"sidebar.docs.doc.Create Event": {
"message": "创建事件",
"description": "手动创建事件的API文档标签"
},
"sidebar.docs.doc.End Event": {
"message": "结束事件",
"description": "手动结束事件的API文档标签"
},
"sidebar.docs.doc.Review": {
"message": "审核列表",
"description": "获取待审核事件的API文档标签"
},
"sidebar.docs.doc.Review Ids": {
"message": "审核ID列表",
"description": "获取待审核事件ID的API文档标签"
},
"sidebar.docs.doc.Review Summary": {
"message": "审核摘要",
"description": "获取审核统计信息的API文档标签"
},
"sidebar.docs.doc.Set Multiple Reviewed": {
"message": "批量标记已审",
"description": "批量标记事件已审核的API文档标签"
},
"sidebar.docs.doc.Delete Reviews": {
"message": "批量删除审核",
"description": "批量删除审核记录的API文档标签"
},
"sidebar.docs.doc.Motion Activity": {
"message": "移动活动",
"description": "获取移动活动数据的API文档标签"
},
"sidebar.docs.doc.Get Review From Event": {
"message": "获取事件审核",
"description": "通过事件ID获取审核的API文档标签"
},
"sidebar.docs.doc.Get Review": {
"message": "获取审核详情",
"description": "获取单个审核详情的API文档标签"
},
"sidebar.docs.doc.Set Not Reviewed": {
"message": "标记未审核",
"description": "将审核状态改为未审的API文档标签"
},
"sidebar.docs.doc.Is Healthy": {
"message": "健康检查",
"description": "系统健康状态检查的API文档标签"
},
"sidebar.docs.doc.Config Schema": {
"message": "配置模式",
"description": "获取配置模式的API文档标签"
},
"sidebar.docs.doc.Go2Rtc Streams": {
"message": "Go2RTC流列表",
"description": "获取所有Go2RTC流的API文档标签"
},
"sidebar.docs.doc.Go2Rtc Camera Stream": {
"message": "摄像头Go2RTC流",
"description": "获取指定摄像头Go2RTC流的API文档标签"
},
"sidebar.docs.doc.Version": {
"message": "版本信息",
"description": "获取系统版本的API文档标签"
},
"sidebar.docs.doc.Stats": {
"message": "实时统计",
"description": "获取实时统计数据的API文档标签"
},
"sidebar.docs.doc.Stats History": {
"message": "历史统计",
"description": "获取历史统计数据的API文档标签"
},
"sidebar.docs.doc.Metrics": {
"message": "性能指标",
"description": "获取性能指标的API文档标签"
},
"sidebar.docs.doc.Config": {
"message": "获取配置",
"description": "获取当前配置的API文档标签"
},
"sidebar.docs.doc.Config Raw": {
"message": "原始配置",
"description": "获取原始配置文件的API文档标签"
},
"sidebar.docs.doc.Config Save": {
"message": "保存配置",
"description": "保存配置的API文档标签"
},
"sidebar.docs.doc.Config Set": {
"message": "设置配置",
"description": "设置配置项的API文档标签"
},
"sidebar.docs.doc.Ffprobe": {
"message": "FFprobe信息",
"description": "获取FFprobe信息的API文档标签"
},
"sidebar.docs.doc.Vainfo": {
"message": "VAAPI信息",
"description": "获取VAAPI硬件信息的API文档标签"
},
"sidebar.docs.doc.Nvinfo": {
"message": "NVDEC信息",
"description": "获取NVIDIA解码器信息的API文档标签"
},
"sidebar.docs.doc.Logs": {
"message": "日志查询",
"description": "查询系统日志的API文档标签"
},
"sidebar.docs.doc.Restart": {
"message": "重启服务",
"description": "重启系统服务的API文档标签"
},
"sidebar.docs.doc.Get Labels": {
"message": "获取标签列表",
"description": "获取所有检测标签的API文档标签"
},
"sidebar.docs.doc.Get Sub Labels": {
"message": "获取子标签",
"description": "获取子分类标签的API文档标签"
},
"sidebar.docs.doc.Plusmodels": {
"message": "Plus模型",
"description": "获取Plus模型列表的API文档标签"
},
"sidebar.docs.doc.Get Recognized License Plates": {
"message": "获取识别车牌",
"description": "获取已识别车牌列表的API文档标签"
},
"sidebar.docs.doc.Timeline": {
"message": "时间线数据",
"description": "获取事件时间线的API文档标签"
},
"sidebar.docs.doc.Hourly Timeline": {
"message": "小时时间线",
"description": "按小时统计时间线的API文档标签"
},
"sidebar.docs.doc.Preview Ts": {
"message": "时间戳预览",
"description": "按时间戳获取预览的API文档标签"
},
"sidebar.docs.doc.Preview Hour": {
"message": "小时预览",
"description": "按小时获取预览的API文档标签"
},
"sidebar.docs.doc.Get Preview Frames From Cache": {
"message": "从缓存获取预览帧",
"description": "从缓存获取预览帧序列的API文档标签"
},
"sidebar.docs.doc.Get Vapid Pub Key": {
"message": "获取VAPID公钥",
"description": "获取通知服务公钥的API文档标签"
},
"sidebar.docs.doc.Register Notifications": {
"message": "注册通知",
"description": "注册推送通知的API文档标签"
},
"sidebar.docs.doc.Get Exports": {
"message": "获取导出列表",
"description": "获取所有导出记录的API文档标签"
},
"sidebar.docs.doc.Export Recording": {
"message": "导出录像",
"description": "导出指定时段录像的API文档标签"
},
"sidebar.docs.doc.Export Rename": {
"message": "重命名导出",
"description": "重命名导出记录的API文档标签"
},
"sidebar.docs.doc.Export Delete": {
"message": "删除导出",
"description": "删除导出文件的API文档标签"
},
"sidebar.docs.doc.Get Export": {
"message": "获取导出详情",
"description": "获取单个导出详情的API文档标签"
},
"sidebar.docs.doc.Mjpeg Feed": {
"message": "MJPEG流",
"description": "获取摄像头MJPEG流的API文档标签"
},
"sidebar.docs.doc.Camera Ptz Info": {
"message": "摄像头PTZ信息",
"description": "获取摄像头云台信息的API文档标签"
},
"sidebar.docs.doc.Latest Frame": {
"message": "最新帧",
"description": "获取摄像头最新画面的API文档标签"
},
"sidebar.docs.doc.Get Snapshot From Recording": {
"message": "从录像获取快照",
"description": "从录像中提取快照的API文档标签"
},
"sidebar.docs.doc.Submit Recording Snapshot To Plus": {
"message": "提交录像快照至Plus",
"description": "向Plus服务提交快照的API文档标签"
},
"sidebar.docs.doc.Get Recordings Storage Usage": {
"message": "获取录像存储用量",
"description": "获取录像存储空间统计的API文档标签"
},
"sidebar.docs.doc.All Recordings Summary": {
"message": "全部录像摘要",
"description": "获取所有摄像头录像统计的API文档标签"
},
"sidebar.docs.doc.Recordings Summary": {
"message": "录像摘要",
"description": "获取单个摄像头录像统计的API文档标签"
},
"sidebar.docs.doc.Recordings": {
"message": "录像记录",
"description": "获取摄像头录像记录的API文档标签"
},
"sidebar.docs.doc.Recording Clip": {
"message": "录像片段",
"description": "获取指定时段录像片段的API文档标签"
},
"sidebar.docs.doc.Vod Ts": {
"message": "点播流(时间戳)",
"description": "按时间戳获取点播视频流的API文档标签"
},
"sidebar.docs.doc.Vod Hour No Timezone": {
"message": "点播流(小时/无时区)",
"description": "按小时获取无时区点播流的API文档标签"
},
"sidebar.docs.doc.Vod Hour": {
"message": "点播流(小时)",
"description": "按小时获取点播视频流的API文档标签"
},
"sidebar.docs.doc.Vod Event": {
"message": "事件点播流",
"description": "获取事件关联点播流的API文档标签"
},
"sidebar.docs.doc.Event Snapshot": {
"message": "事件快照",
"description": "获取事件JPG格式快照的API文档标签"
},
"sidebar.docs.doc.Event Thumbnail": {
"message": "事件缩略图",
"description": "获取事件缩略图的API文档标签"
},
"sidebar.docs.doc.Grid Snapshot": {
"message": "网格快照",
"description": "获取摄像头网格布局快照的API文档标签"
},
"sidebar.docs.doc.Event Snapshot Clean": {
"message": "事件纯净快照",
"description": "获取无标注事件快照的API文档标签"
},
"sidebar.docs.doc.Event Clip": {
"message": "事件片段",
"description": "获取事件MP4格式片段的API文档标签"
},
"sidebar.docs.doc.Event Preview": {
"message": "事件预览",
"description": "获取事件GIF预览的API文档标签"
},
"sidebar.docs.doc.Preview Gif": {
"message": "GIF预览",
"description": "获取指定时段GIF预览的API文档标签"
},
"sidebar.docs.doc.Preview Mp4": {
"message": "MP4预览",
"description": "获取指定时段MP4预览的API文档标签"
},
"sidebar.docs.doc.Review Preview": {
"message": "审核预览",
"description": "获取审核事件预览的API文档标签"
},
"sidebar.docs.doc.Preview Thumbnail": {
"message": "预览缩略图",
"description": "获取预览文件缩略图的API文档标签"
},
"sidebar.docs.doc.Label Thumbnail": {
"message": "标签缩略图",
"description": "获取最佳标签缩略图的API文档标签"
},
"sidebar.docs.doc.Label Clip": {
"message": "标签片段",
"description": "获取标签关联视频片段的API文档标签"
},
"sidebar.docs.doc.Label Snapshot": {
"message": "标签快照",
"description": "获取标签快照的API文档标签"
},
"sidebar.docs.doc.AppConfigSetBody": {
"message": "应用配置设置体",
"description": "应用配置设置数据结构的文档标签"
},
"sidebar.docs.doc.AppPostLoginBody": {
"message": "登录请求体",
"description": "登录请求数据结构的文档标签"
},
"sidebar.docs.doc.AppPostUsersBody": {
"message": "用户创建体",
"description": "用户创建数据结构的文档标签"
},
"sidebar.docs.doc.AppPutPasswordBody": {
"message": "密码更新体",
"description": "密码更新数据结构的文档标签"
},
"sidebar.docs.doc.AppPutRoleBody": {
"message": "角色更新体",
"description": "角色更新数据结构的文档标签"
},
"sidebar.docs.doc.Body_recognize_face_faces_recognize_post": {
"message": "人脸识别请求体",
"description": "人脸识别请求数据结构的文档标签"
},
"sidebar.docs.doc.Body_register_face_faces__name__register_post": {
"message": "人脸注册请求体",
"description": "人脸注册请求数据结构的文档标签"
},
"sidebar.docs.doc.DayReview": {
"message": "每日审核",
"description": "每日审核数据结构的文档标签"
},
"sidebar.docs.doc.EventCreateResponse": {
"message": "事件创建响应",
"description": "事件创建响应数据结构的文档标签"
},
"sidebar.docs.doc.EventMultiDeleteResponse": {
"message": "批量删除响应",
"description": "事件批量删除响应数据结构的文档标签"
},
"sidebar.docs.doc.EventResponse": {
"message": "事件响应",
"description": "事件响应数据结构的文档标签"
},
"sidebar.docs.doc.EventUploadPlusResponse": {
"message": "Plus上传响应",
"description": "事件上传Plus服务响应数据结构的文档标签"
},
"sidebar.docs.doc.EventsCreateBody": {
"message": "事件创建体",
"description": "事件创建请求数据结构的文档标签"
},
"sidebar.docs.doc.EventsDeleteBody": {
"message": "事件删除体",
"description": "事件删除请求数据结构的文档标签"
},
"sidebar.docs.doc.EventsDescriptionBody": {
"message": "事件描述体",
"description": "事件描述设置数据结构的文档标签"
},
"sidebar.docs.doc.EventsEndBody": {
"message": "事件结束体",
"description": "事件结束请求数据结构的文档标签"
},
"sidebar.docs.doc.EventsSubLabelBody": {
"message": "子标签设置体",
"description": "事件子标签设置数据结构的文档标签"
},
"sidebar.docs.doc.ExportRecordingsBody": {
"message": "录像导出体",
"description": "录像导出请求数据结构的文档标签"
},
"sidebar.docs.doc.ExportRenameBody": {
"message": "导出重命名体",
"description": "导出文件重命名数据结构的文档标签"
},
"sidebar.docs.doc.Extension": {
"message": "文件扩展名",
"description": "文件扩展名类型的文档标签"
},
"sidebar.docs.doc.GenericResponse": {
"message": "通用响应",
"description": "通用响应数据结构的文档标签"
},
"sidebar.docs.doc.HTTPValidationError": {
"message": "HTTP验证错误",
"description": "HTTP请求验证错误数据结构的文档标签"
},
"sidebar.docs.doc.Last24HoursReview": {
"message": "24小时审核",
"description": "最近24小时审核数据结构的文档标签"
},
"sidebar.docs.doc.PlaybackFactorEnum": {
"message": "播放倍速枚举",
"description": "视频播放倍速选项的文档标签"
},
"sidebar.docs.doc.PlaybackSourceEnum": {
"message": "播放源枚举",
"description": "视频播放源类型的文档标签"
},
"sidebar.docs.doc.RegenerateDescriptionEnum": {
"message": "描述再生枚举",
"description": "事件描述再生选项的文档标签"
},
"sidebar.docs.doc.ReviewActivityMotionResponse": {
"message": "移动活动响应",
"description": "审核移动活动响应数据结构的文档标签"
},
"sidebar.docs.doc.ReviewModifyMultipleBody": {
"message": "批量修改体",
"description": "审核批量修改请求数据结构的文档标签"
},
"sidebar.docs.doc.ReviewSegmentResponse": {
"message": "审核片段响应",
"description": "审核视频片段响应数据结构的文档标签"
},
"sidebar.docs.doc.ReviewSummaryResponse": {
"message": "审核摘要响应",
"description": "审核摘要响应数据结构的文档标签"
},
"sidebar.docs.doc.SeverityEnum": {
"message": "严重程度枚举",
"description": "事件严重程度等级的文档标签"
},
"sidebar.docs.doc.SubmitPlusBody": {
"message": "Plus提交体",
"description": "提交至Plus服务请求数据结构的文档标签"
},
"sidebar.docs.doc.ValidationError": {
"message": "验证错误",
"description": "数据验证错误数据结构的文档标签"
}
}

View File

@ -0,0 +1,211 @@
---
id: advanced
title: 高级配置选项
sidebar_label: 高级选项
---
### 日志配置
#### Frigate日志设置
可调整日志级别用于故障排查。
```yaml
logger:
# 可选:默认日志级别(默认如下)
default: info
# 可选:按模块设置日志级别
logs:
frigate.mqtt: error
```
可用日志级别:`debug`, `info`, `warning`, `error`, `critical`
可配置模块示例:
- `frigate.app`
- `frigate.mqtt`
- `frigate.object_detection`
- `detector.<检测器名称>`
- `watchdog.<摄像头名称>`
- `ffmpeg.<摄像头名称>.<角色>` 注意所有FFmpeg日志均以`error`级别记录
#### Go2RTC日志设置
参考[go2rtc文档](https://github.com/AlexxIT/go2rtc?tab=readme-ov-file#module-log)配置日志
```yaml
go2rtc:
streams:
# ...
log:
exec: trace
```
### 环境变量
此配置项适用于无法直接修改容器环境的情况如Home Assistant OS
示例:
```yaml
environment_vars:
变量名: 变量值
```
### 数据库配置
追踪对象和录像信息存储在`/config/frigate.db`的SQLite数据库中。若删除该数据库录像文件将变为孤立文件需手动清理且不会显示在Home Assistant的媒体浏览器中。
若使用网络存储SMB/NFS等启动时可能出现`database is locked`错误。可自定义数据库路径:
```yaml
database:
path: /自定义路径/frigate.db
```
### 模型配置
使用自定义模型时需指定宽高尺寸。
自定义模型可能需要不同的输入张量格式。支持RGB、BGR或YUV色彩空间转换。输入张量形状参数需与模型要求匹配。
| 张量维度 | 描述 |
|---------|-------------|
| N | 批量大小 |
| H | 模型高度 |
| W | 模型宽度 |
| C | 色彩通道数 |
| 可用输入张量形状 |
|----------------|
| "nhwc" |
| "nchw" |
```yaml
model:
path: /模型路径
width: 320
height: 320
input_tensor: "nhwc"
input_pixel_format: "bgr"
```
#### 标签映射
:::warning
自定义标签映射后需同步调整[警报标签](/configuration/review.md#限制警报的标签类型)配置
:::
可自定义标签映射常见场景是合并易混淆的物体类型如car/truck。默认已将truck重命名为car。
```yaml
model:
labelmap:
2: vehicle
3: vehicle
5: vehicle
7: vehicle
15: animal
16: animal
17: animal
```
:::warning
部分标签有特殊处理逻辑:
- `person`关联`face`和`amazon`
- `car`关联`license_plate`, `ups`, `fedex`, `amazon`
:::
## 网络配置
可通过绑定挂载nginx.conf文件修改内部网络配置
```yaml
services:
frigate:
volumes:
- /自定义路径/nginx.conf:/usr/local/nginx/conf/nginx.conf
```
### 启用IPv6
默认禁用IPv6需修改listen.gotmpl文件
原始配置:
```
listen 8971;
```
修改为:
```
listen [::]:8971 ipv6only=off;
```
## 基础路径
默认运行在根路径(`/`),反向代理场景可能需要自定义路径前缀(如`/frigate`)。
### 通过HTTP头设置
推荐方式是在反向代理中设置`X-Ingress-Path`头:
Nginx示例
```
location /frigate {
proxy_set_header X-Ingress-Path /frigate;
proxy_pass http://frigate_backend;
}
```
### 通过环境变量设置
```yaml
services:
frigate:
environment:
- FRIGATE_BASE_PATH=/frigate
```
## 自定义依赖
### 自定义FFmpeg
将静态编译的`ffmpeg`和`ffprobe`放入`/config/custom-ffmpeg/bin`
1. 下载FFmpeg并解压到`/config/custom-ffmpeg`
2. 更新配置:
```yaml
ffmpeg:
path: /config/custom-ffmpeg
```
3. 重启Frigate
### 自定义go2rtc版本
1. 下载go2rtc到`/config`目录
2. 重命名为`go2rtc`
3. 添加执行权限
4. 重启Frigate
## 配置文件验证
更新配置时可通过以下方式验证:
### 通过API验证
```bash
curl -X POST http://frigate_host:5000/api/config/save -d @config.json
```
或使用yq转换yaml
```bash
yq r -j config.yml | curl -X POST http://frigate_host:5000/api/config/save -d @-
```
### 命令行验证
```bash
docker run -v $(pwd)/config.yml:/config/config.yml \
--entrypoint python3 \
ghcr.io/blakeblackshear/frigate:stable \
-u -m frigate --validate-config
```

View File

@ -0,0 +1,77 @@
---
id: audio_detectors
title: 音频检测器
---
:::tip
本文使用DeepSeek AI进行翻译仅做参考。
:::
Frigate内置了音频检测功能该功能运行在CPU上。相比图像对象检测音频检测的计算量要小得多因此完全可以在CPU上高效运行。
## 配置
音频事件通过检测特定类型的音频并创建事件来工作,当该类型音频在配置的时间内未被检测到时,事件将结束。音频事件会在事件开始时保存快照,并在整个事件过程中保存录音。录音使用配置的录制保留设置进行保留。
### 启用音频事件
可以为所有摄像头或仅特定摄像头启用音频事件。
```yaml
audio: # <- 为所有摄像头启用音频事件
enabled: True
cameras:
front_camera:
ffmpeg:
...
audio:
enabled: True # <- 为front_camera启用音频事件
```
如果使用多个流,则必须在用于音频检测的流上设置`audio`角色,这可以是任何流,但该流必须包含音频。
:::note
用于捕获音频的ffmpeg进程将与分配给摄像头的其他角色一起建立到摄像头的单独连接因此建议使用go2rtc重新流式传输来实现此目的。更多信息请参阅[重新流式传输文档](/configuration/restream.md)。
:::
```yaml
cameras:
front_camera:
ffmpeg:
inputs:
- path: rtsp://.../main_stream
roles:
- record
- path: rtsp://.../sub_stream # <- 此流必须启用音频
roles:
- audio
- detect
```
### 配置最小音量
音频检测器使用音量级别的方式与摄像头画面中的运动用于对象检测的方式相同。这意味着除非音频音量高于配置的水平否则Frigate不会运行音频检测以减少资源使用。不同摄像头型号的音量水平可能有很大差异因此进行测试以了解音量水平非常重要。可以使用MQTT浏览器查看音频主题以了解检测到的音量水平。
:::tip
音量被视为录制的运动,这意味着当`record -> retain -> mode`设置为`motion`时,任何音频音量> min_volume的时刻该摄像头的录制片段都将被保留。
:::
### 配置音频事件
内置音频模型可以检测[500多种不同类型](https://github.com/blakeblackshear/frigate/blob/dev/audio-labelmap.txt)的音频,其中许多并不实用。默认情况下启用`bark`(狗叫)、`fire_alarm`(火警)、`scream`(尖叫)、`speech`(说话)和`yell`(喊叫),但这些可以自定义。
```yaml
audio:
enabled: True
listen:
- bark
- fire_alarm
- scream
- speech
- yell
```

View File

@ -0,0 +1,106 @@
---
id: authentication
title: 身份认证
---
# 身份认证
Frigate 将用户信息存储在数据库中,采用 PBKDF2-SHA256 算法60万次迭代生成密码哈希值。登录成功后系统会签发带有过期时间的 JWT 令牌并设置为 Cookie该 Cookie 会自动刷新。此 JWT 令牌也可通过 Authorization 头部的 Bearer Token 方式传递。
用户管理入口:设置 > 用户
Frigate Web UI 访问端口说明:
| 端口 | 描述 |
| ------ | ------------------------------------------------------------------- |
| `8971` | 需认证的 UI 和 API 端口,建议反向代理使用此端口 |
| `5000` | 内部免认证端口,应限制访问范围。专为 Docker 网络内无需认证的集成服务设计 |
## 初始设置
启动时会生成管理员账号密码并打印在日志中。首次登录后建议立即在"设置 > 用户"中修改默认密码。
## 重置管理员密码
若被锁定时,可通过配置文件强制重置密码(下次启动时生效):
```yaml
auth:
reset_admin_password: true
```
## 登录失败限流
为防止暴力破解,支持多级速率限制(基于 SlowApi 实现)。例如 `1/second;5/minute;20/hour` 表示:
- 每秒不超过 1 次失败
- 每分钟不超过 5 次失败
- 每小时不超过 20 次失败
重启服务会重置计数器。若使用反向代理,需配置可信代理 IP 段:
```yaml
auth:
failed_login_rate_limit: "1/second;5/minute;20/hour"
trusted_proxies:
- 172.18.0.0/16 # Docker 内部网络段
```
## JWT 密钥管理
安全要求:
1. 至少 64 位加密随机字符串
2. 生成命令:`python3 -c 'import secrets; print(secrets.token_hex(64))'`
密钥加载优先级:
1. 环境变量 `FRIGATE_JWT_SECRET`
2. Docker 密钥文件 `/run/secrets/FRIGATE_JWT_SECRET`
3. Home Assistant 插件配置
4. 配置文件目录下的 `.jwt_secret` 文件
(注:修改密钥会使现有令牌失效)
## 代理集成配置
### 基础配置
```yaml
auth:
enabled: False # 禁用内置认证
proxy:
auth_secret: "<随机密钥>" # 代理通信密钥
```
### 头映射
支持从代理头中提取用户信息:
```yaml
proxy:
header_map:
user: x-forwarded-user # 用户名头
role: x-forwarded-role # 角色头
```
端口差异:
- **8971 端口**强制角色验证admin/viewer
- **5000 端口**:始终视为 admin 权限
### 登录跳转
支持自动识别代理返回的 401/302/307 跳转地址。
### 自定义登出
```yaml
proxy:
logout_url: "https://example.com/logout" # 代理登出地址
```
## 用户角色体系
### 角色类型
- **admin**:完全控制权限(含用户管理)
- **viewer**:只读权限
### 权限控制
- 通过 8971 端口访问时强制验证角色
- 通过 5000 端口访问时默认获得 admin 权限
(角色管理入口:设置 > 用户)

View File

@ -0,0 +1,173 @@
---
id: autotracking
title: 摄像头自动追踪
---
支持ONVIF协议且具备PTZ(云台变焦)功能的摄像头,如果支持视野(FOV)内相对移动,可以配置为自动追踪移动对象并将其保持在画面中央。
![自动追踪示例(含变焦)](/img/frigate-autotracking-example.gif)
## 自动追踪行为
当Frigate确认对象不是误报且已进入指定区域后自动追踪器会移动PTZ摄像头将对象保持在画面中央直到对象移出画面、PTZ无法继续移动或Frigate丢失追踪目标。
丢失追踪后Frigate会在目标消失区域扫描`timeout`秒。如果发现同类型对象Frigate会继续追踪该新对象。
追踪结束后,摄像头会返回配置中`return_preset`指定的预设位置。
## 检查ONVIF摄像头支持
Frigate自动追踪功能需要PTZ摄像头支持视野内相对移动(符合[ONVIF规范](https://www.onvif.org/specs/srv/ptz/ONVIF-PTZ-Service-Spec-v1712.pdf)中的`RelativePanTiltTranslationSpace`和`TranslationSpaceFov`条目)。
许多廉价或老旧PTZ可能不支持此标准。如果您的PTZ不支持Frigate会在日志中报告错误并禁用自动追踪功能。
您也可以下载并运行[这个简单的Python脚本](https://gist.github.com/hawkeye217/152a1d4ba80760dac95d46e143d37112)替换第4行的摄像头IP地址、ONVIF端口、用户名和密码来检查您的摄像头。
用户报告支持Frigate自动追踪的摄像头品牌和型号列表可在[这里](cameras.md)查看。
## 配置方法
首先在摄像头固件中设置PTZ预设位置并命名。如果不确定如何操作请参考摄像头厂商的固件文档。常见品牌教程[Amcrest](https://www.youtube.com/watch?v=lJlE9-krmrM)、[Reolink](https://www.youtube.com/watch?v=VAnxHUY5i5w)、[Dahua](https://www.youtube.com/watch?v=7sNbc5U-k54)。
编辑Frigate配置文件填写摄像头的ONVIF参数。指定要追踪的对象类型、触发自动追踪的必需区域以及追踪结束后返回的预设位置名称。可选配置追踪结束前的延迟时间(秒)。
自动追踪功能需要[ONVIF连接](cameras.md)。建议为摄像头时间戳和任何叠加文本设置[运动掩膜](masks.md),确保摄像头移动时这些区域完全排除在场景变化计算之外。
注意`autotracking`默认禁用可通过配置文件或MQTT启用。
```yaml
cameras:
ptzcamera:
...
onvif:
# 必填: 摄像头主机地址
# 注意: 默认使用HTTP协议如需HTTPS需明确指定"https://0.0.0.0"
host: 0.0.0.0
# 可选: ONVIF端口(默认如下)
port: 8000
# 可选: 登录用户名
# 注意: 部分设备需要管理员权限访问ONVIF
user: admin
# 可选: 登录密码
password: admin
# 可选: 跳过ONVIF服务器的TLS验证(默认如下)
tls_insecure: False
# 可选: PTZ摄像头自动追踪功能
# 通过移动PTZ摄像头将移动对象保持在画面中央
autotracking:
# 可选: 启用/禁用对象自动追踪(默认如下)
enabled: False
# 可选: 启动时校准摄像头(默认如下)
# 校准会分步移动PTZ并测量移动时间
# 结果用于帮助估算摄像头移动后追踪对象的位置
# 校准完成后Frigate会自动更新配置文件
# 添加摄像头的"movement_weights"参数之后应将calibrate_on_startup设为False
calibrate_on_startup: False
# 可选: 自动追踪时的变焦模式(默认如下)
# 可用选项: disabled, absolute, relative
# disabled - 仅平移/倾斜,不变焦
# absolute - 使用绝对变焦(多数PTZ摄像头支持)
# relative - 使用相对变焦(非所有PTZ支持但可实现同步平移/倾斜/变焦)
zooming: disabled
# 可选: 改变自动追踪对象变焦行为的参数(默认如下)
# 较低值会在追踪对象周围保留更多场景
# 较高值会更大程度放大追踪对象,但可能更快丢失追踪
# 值应在0.1到0.75之间
zoom_factor: 0.3
# 可选: 要追踪的对象列表(来自labelmap.txt)(默认如下)
track:
- person
# 必填: 当对象进入以下任一区域时开始自动追踪
required_zones:
- zone_name
# 必填: 追踪结束后返回的ONVIF预设位置名称(默认如下)
return_preset: home
# 可选: 返回预设位置前的延迟秒数(默认如下)
timeout: 10
# 可选: 摄像头校准自动生成的值,请勿手动修改(默认如下)
movement_weights: []
```
## 校准流程
PTZ电机运行速度各不相同。执行校准会让Frigate测量各种移动的速度用这些测量值更好地预测保持自动追踪对象在画面中央所需的移动量。
校准是可选的但能极大帮助Frigate追踪在摄像头视野中快速移动的对象。
开始校准:将摄像头配置中的`calibrate_on_startup`设为`True`并重启Frigate。Frigate会让摄像头进行一系列小幅和大幅移动。校准过程中请勿手动移动PTZ。完成后摄像头移动将停止配置文件会自动更新`movement_weights`参数用于移动计算。请勿手动修改此参数。
校准结束后PTZ会移动到`return_preset`指定的预设位置。
:::note
校准过程中Frigate网页界面和其他摄像头将无响应。这是正常现象以避免校准时产生过多网络流量或CPU使用。大多数PTZ校准约需两分钟。Frigate日志会显示校准进度和任何错误。
:::
此时Frigate会继续运行并在PTZ自动追踪移动时不断获取测量值自动更新配置文件中的`movement_weights`参数。
重启Frigate前应将配置文件中的`calibrate_on_startup`设为`False`,否则您优化后的`movement_weights`会被覆盖,再次启动时会重新校准。
如需重新校准,可删除`movement_weights`参数,将`calibrate_on_startup`设为`True`后重启Frigate。如果自动追踪不稳定可能需要重新校准或完全删除配置中的`movement_weights`。如果更改了`return_preset`或摄像头的检测`fps`值,也建议重新校准。
如果初始校准时禁用变焦,之后启用变焦,也应重新校准。
## 最佳实践与注意事项
每款PTZ摄像头都不同自动追踪可能无法在所有情况下理想工作。此实验性功能最初基于EmpireTech/Dahua SD1A404XB-GNR开发。
Frigate中的对象追踪器会估算PTZ移动在摄像头移动时保持追踪对象。大多数情况下5fps足够但如需追踪更快移动的对象可适当提高帧率。过高帧率(>10fps)会拖慢Frigate和运动估算器可能导致丢帧特别是使用实验性变焦功能时。
建议使用快速的[检测器](object_detectors.md)。CPU检测器性能不佳或完全无法工作。可通过Frigate的调试视图查看当前自动追踪对象周围较厚的彩色边框。
![自动追踪调试视图](/img/autotracking-debug.gif)
不建议在`required_zones`中使用全画面区域,特别是摄像头已校准且配置中包含`movement_weights`时。Frigate会持续追踪已进入`required_zones`的对象,即使它移出该区域。
部分用户发现调整区域`inertia`值有帮助。详见[配置参考](index.md)。
## 变焦功能
变焦是非常实验性的功能,追踪对象时可能比仅平移/倾斜消耗更多CPU资源。
绝对变焦使变焦移动独立于平移/倾斜移动。多数PTZ摄像头支持绝对变焦。绝对变焦设计保守以适应各种摄像头和场景。绝对变焦通常只在对象停止或缓慢移动时进行。
相对变焦尝试在平移/倾斜移动同时进行变焦。测试适用于部分Dahua和Amcrest PTZ。但ONVIF规范指出使用相对变焦时通用变焦范围如何映射到放大倍数、视野或其他物理变焦尺寸没有标准。如果相对变焦行为不稳定或无效请尝试绝对变焦。
可在配置文件中调整摄像头的`zoom_factor`参数。较低值会在追踪对象周围保留更多场景空间较高值会让摄像头更大程度放大对象。但请注意Frigate需要追踪对象边界框外足够多的像素和场景细节来估算摄像头移动。如果对象占据画面过大Frigate将无法估算摄像头移动而丢失目标。
此参数范围0.1到0.75。默认值0.3较为保守适合多数用户。由于每款PTZ和场景不同您应实验确定最佳值。
## 应用场景
安防监控中,常将"观察"摄像头与PTZ配合使用。当固定观察摄像头检测到对象时可通过Home Assistant等自动化平台将PTZ移动到特定预设位置使Frigate开始自动追踪。例如住宅东西两侧安装固定摄像头监控街道当西侧观察摄像头检测到人员时Home Assistant自动化可将PTZ转向西方预设位置。对象进入指定区域后Frigate自动追踪器可继续追踪离开固定摄像头视野的人员。
## 故障排除与常见问题
### 自动追踪丢失目标,为什么?
可能原因很多。如果使用实验性变焦,`zoom_factor`值可能过高、对象移动过快、场景太暗、场景细节不足(如PTZ俯视单调背景的车道缺乏足够边缘或角落)或场景不理想导致Frigate难以维持追踪。
摄像头快门速度可能设置过低导致运动模糊。检查摄像头固件能否提高快门速度。
查看Frigate调试视图有助于确定原因。自动追踪对象会有较厚的彩色边框。
### 日志显示摄像头"仍处于ONVIF'MOVING'状态"错误,什么意思?
两个已知原因(可能还有其他未知原因)PTZ电机过慢或摄像头固件有bug。Frigate使用摄像头提供的ONVIF参数`MoveStatus`判断PTZ电机移动或空闲状态。据部分用户反馈Hikvision PTZ(即使最新固件)在PTZ移动后不更新此值。由于Hikvision固件此bug无法解决自动追踪功能无法正常工作应在配置中禁用。使用Hikvision固件的其他品牌摄像头可能也有此问题。
### 尝试校准摄像头但日志显示卡在0%且Frigate无法启动
通常原因同上 - 由于摄像头固件bug`MoveStatus` ONVIF参数未变化。另请注意校准过程中Frigate网页界面和其他摄像头无响应是正常现象。但如果日志中未每隔几秒显示校准进度则您的摄像头不兼容自动追踪功能。
### 日志显示错误:"Autotracker: motion estimator couldn't get transformations",什么意思?
为在PTZ移动时维持对象追踪Frigate基于画面细节追踪摄像头移动。出现此消息可能因为`zoom_factor`设置过高、检测对象周围场景细节不足(如缺乏明显边缘或色彩变化),或摄像头快门速度过慢导致运动模糊。尝试降低`zoom_factor`、改变对象周围场景或调整摄像头快门速度。
### 校准似乎已完成,但摄像头未实际追踪对象,为什么?
部分摄像头固件报告支持FOV RelativeMove(即Frigate用于自动追踪的ONVIF命令)但如果对象进入必需区域后摄像头不平移或倾斜说明固件实际不支持FOV RelativeMove。例如Uniview IPC672LR-AX4DUPK摄像头它实际移动的是变焦电机而非平移/倾斜完全不符合ONVIF标准。
### Frigate报告校准失败错误为什么
校准测量Frigate让PTZ进行一系列移动所需时间。如果这些值过高导致Frigate无法支持校准后的自动追踪日志会记录此错误。通常原因是摄像头电机或网络连接过慢或固件未及时报告电机状态。可尝试不校准运行(删除配置中的`movement_weights`行并重启),但如果校准失败,通常意味着自动追踪会表现不稳定。

View File

@ -0,0 +1,72 @@
---
id: bird_classification
title: 鸟类识别功能
---
鸟类识别功能使用量化Tensorflow模型识别已知鸟类品种。当识别到已知鸟类时其通用名称将作为`sub_label`(子标签)添加。该信息会显示在用户界面、过滤器以及通知中。
## 最低系统要求
鸟类识别在CPU上运行轻量级tflite模型系统要求与运行Frigate本身无显著差异。
## 识别模型
使用的分类模型是MobileNet INat鸟类识别模型[可识别物种列表见此](https://raw.githubusercontent.com/google-coral/test_data/master/inat_bird_labels.txt)。
## 基础配置
鸟类识别功能默认禁用,需在配置文件中启用。此为全局配置选项。
```yaml
classification:
bird:
enabled: true # 启用鸟类识别
```
## 高级配置选项
可通过以下参数微调识别精度:
- `threshold`: 设定鸟类子标签所需的最低置信度分数
- 默认值: `0.9`
- 建议范围: 0.8-0.95(值越高误报越少,但可能漏识部分品种)
- `top_k`: 每次检测返回的最可能物种数量
- 默认值: `3`
- 较高值可增加识别多样性,但会降低运行效率
- `cache`: 启用识别结果缓存(减少重复计算)
- 默认值: `true`
- 建议在设备性能有限时保持启用
完整配置示例:
```yaml
classification:
bird:
enabled: true
threshold: 0.85
top_k: 5
cache: false
```
## 使用建议
1. 庭院观鸟场景建议阈值设为0.8-0.85
2. 科研监测场景可提高top_k至5-10
3. 树莓派等设备建议启用cache
4. 识别结果可通过MQTT/webhook转发
## 性能优化
若识别延迟过高:
1. 降低top_k值
2. 确保未启用debug日志
3. 检查CPU温度是否过高
4. 考虑使用更高效硬件
:::tip
常见问题:
- 识别为"unknown_bird"表示置信度低于阈值
- 品种名称显示为拉丁学名属正常现象
- 夜间拍摄可能无法触发识别
:::

View File

@ -0,0 +1,114 @@
---
id: birdseye
title: 鸟瞰视图
---
# 鸟瞰视图
除了Frigate的实时摄像头仪表板外鸟瞰视图提供了一个便携的全局视角让您无需逐个查看可能没有活动的摄像头就能掌握整个监控区域的动态。鸟瞰视图提供多种智能显示模式可根据您关注的场景自动调整显示内容。
您可以通过在Web界面中将"Birdseye"摄像头添加到摄像头组来查看鸟瞰视图。在实时页面点击"+"图标创建摄像头组,并选择"Birdseye"作为其中一个摄像头。
鸟瞰视图也可用于Home Assistant仪表板、投屏到媒体设备等场景。
## 鸟瞰视图行为模式
### 显示模式
鸟瞰视图提供多种模式来自定义不同情况下显示的摄像头:
- **continuous(持续模式)**:始终显示所有摄像头
- **motion(运动模式)**仅显示最近30秒内检测到运动的摄像头
- **objects(对象模式)**仅显示最近30秒内有活动对象被追踪的摄像头
### 自定义图标
您可以在Frigate的`media`文件夹中添加名为`custom.png`的180x180图片来自定义鸟瞰视图背景图标。图片必须是透明背景的PNG格式所有非透明像素在鸟瞰视图中将显示为白色。
### 摄像头级别覆盖设置
如果希望特定摄像头只在特定情况下显示在鸟瞰视图中,或者完全不显示,可以在摄像头级别进行配置:
```yaml
# 默认所有摄像头都显示在鸟瞰视图中
birdseye:
enabled: True
mode: continuous
cameras:
front:
# 仅当检测到对象时才显示前门摄像头
birdseye:
mode: objects
back:
# 不显示后门摄像头
birdseye:
enabled: False
```
### 非活动时间阈值
默认情况下鸟瞰视图会显示过去30秒内有配置活动的摄像头此时间可调整
```yaml
birdseye:
enabled: True
inactivity_threshold: 15 # 改为15秒
```
## 鸟瞰视图布局
### 分辨率设置
可以配置鸟瞰视图的分辨率和宽高比。分辨率影响画质但不影响布局,而宽高比会影响摄像头的排列方式。
```yaml
birdseye:
enabled: True
width: 1280 # 宽度
height: 720 # 高度
```
### 摄像头排序
可以覆盖鸟瞰视图中摄像头的显示顺序。需要在摄像头级别设置排序值。
```yaml
birdseye:
enabled: True
mode: continuous
cameras:
front:
birdseye:
order: 1 # 显示在第一位
back:
birdseye:
order: 2 # 显示在第二位
```
_注意_默认情况下摄像头按名称排序以确保鸟瞰视图布局稳定。
### 最大摄像头数限制
可以限制鸟瞰视图一次显示的摄像头数量。启用此功能后,鸟瞰视图将显示最近活动的摄像头。设有冷却时间以防止摄像头切换过于频繁。
例如以下配置仅显示最近活动的1个摄像头
```yaml
birdseye:
enabled: True
layout:
max_cameras: 1 # 最多显示1个摄像头
```
### 缩放系数
默认情况下鸟瞰视图尝试每行排列2个摄像头然后按倍数缩放直到找到合适的布局。缩放系数可在1.0到5.0之间调整。
```yaml
birdseye:
enabled: True
layout:
scaling_factor: 3.0 # 缩放系数设为3.0
```

View File

@ -0,0 +1,232 @@
---
id: camera_specific
title: 摄像头品牌特定配置
---
:::note
本页面使用了FFmpeg参数的预设。有关预设的更多信息请参阅[FFmpeg预设](/configuration/ffmpeg_presets)页面。
:::
:::note
许多摄像头支持影响实时视图体验的编码选项,更多信息请参阅[实时视图](/configuration/live)页面。
:::
## MJPEG摄像头
注意MJPEG摄像头需要将视频编码为H264才能用于录制和重流角色。这将比直接支持H264的摄像头消耗更多CPU资源。建议使用重流角色创建H264重流然后将其作为ffmpeg的输入源。
```yaml
go2rtc:
streams:
mjpeg_cam: "ffmpeg:http://your_mjpeg_stream_url#video=h264#hardware" # <- 使用硬件加速创建可用于其他组件的H264流
cameras:
...
mjpeg_cam:
ffmpeg:
inputs:
- path: rtsp://127.0.0.1:8554/mjpeg_cam
roles:
- detect
- record
```
## JPEG流摄像头
使用实时变化JPEG图像的摄像头需要如下输入参数
```yaml
input_args: preset-http-jpeg-generic
```
流输出参数和注意事项与[MJPEG摄像头](#mjpeg-cameras)相同
## RTMP摄像头
RTMP摄像头需要调整输入参数
```yaml
ffmpeg:
input_args: preset-rtmp-generic
```
## 仅支持UDP的摄像头
如果您的摄像头不支持RTSP的TCP连接可以使用UDP。
```yaml
ffmpeg:
input_args: preset-rtsp-udp
```
## 品牌/型号特定设置
### Amcrest & Dahua
Amcrest和Dahua摄像头应使用以下格式通过RTSP连接
```
rtsp://用户名:密码@摄像头IP/cam/realmonitor?channel=1&subtype=0 # 主码流
rtsp://用户名:密码@摄像头IP/cam/realmonitor?channel=1&subtype=1 # 子码流,通常仅支持低分辨率
rtsp://用户名:密码@摄像头IP/cam/realmonitor?channel=1&subtype=2 # 高端摄像头支持第三码流,中等分辨率(1280x720, 1920x1080)
rtsp://用户名:密码@摄像头IP/cam/realmonitor?channel=1&subtype=3 # 新款高端摄像头支持第四码流,另一中等分辨率(1280x720, 1920x1080)
```
### Annke C800
此摄像头仅支持H.265。要在某些设备(如MacOS或iPhone)上播放片段,需要使用`apple_compatibility`配置调整H.265流。
```yaml
cameras:
annkec800: # <------ 摄像头名称
ffmpeg:
apple_compatibility: true # <- 增加与MacOS和iPhone的兼容性
output_args:
record: preset-record-generic-audio-aac
inputs:
- path: rtsp://用户名:密码@摄像头IP/H264/ch1/main/av_stream # <----- 根据您的摄像头更新
roles:
- detect
- record
detect:
width: # <- 可选默认Frigate会尝试自动检测分辨率
height: # <- 可选默认Frigate会尝试自动检测分辨率
```
### Blue Iris RTSP摄像头
Blue Iris RTSP摄像头需要移除`nobuffer`标志
```yaml
ffmpeg:
input_args: preset-rtsp-blue-iris
```
### Hikvision摄像头
Hikvision摄像头应使用以下格式通过RTSP连接
```
rtsp://用户名:密码@摄像头IP/streaming/channels/101 # 主码流
rtsp://用户名:密码@摄像头IP/streaming/channels/102 # 子码流,通常仅支持低分辨率
rtsp://用户名:密码@摄像头IP/streaming/channels/103 # 高端摄像头支持第三码流,中等分辨率(1280x720, 1920x1080)
```
:::note
[部分用户报告](https://www.reddit.com/r/frigate_nvr/comments/1hg4ze7/hikvision_security_settings)新款Hikvision摄像头需要调整安全设置
```
RTSP认证 - digest/basic
RTSP摘要算法 - MD5
WEB认证 - digest/basic
WEB摘要算法 - MD5
```
:::
### Reolink摄像头
Reolink有旧款摄像头(如410和520)和新款摄像头(如520a和511wa)支持不同的选项子集。两种情况下都建议使用HTTP流。
Frigate与配置了以下选项的新款Reolink摄像头配合使用效果更好
如果可用,推荐设置:
- `开启,流畅优先` - 这将摄像头设置为CBR(恒定比特率)
- `帧间空间1x` - 这将I帧间隔设置为与帧率相同
根据[此讨论](https://github.com/blakeblackshear/frigate/issues/3235#issuecomment-1135876973)HTTP视频流似乎是Reolink最可靠的选择。
通过Reolink NVR连接的摄像头可以使用HTTP流在流URL中使用`channel[0..15]`表示附加通道。
主码流也可以通过RTSP设置但并非在所有硬件版本上都可靠。以下示例配置适用于最老的RLN16-410设备和多种类型的摄像头。
:::warning
以下配置仅适用于流分辨率为5MP或更低的Reolink摄像头8MP+摄像头需要使用RTSP因为这种情况下不支持http-flv。
:::
```yaml
go2rtc:
streams:
your_reolink_camera:
- "ffmpeg:http://reolink_ip/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=username&password=password#video=copy#audio=copy#audio=opus"
your_reolink_camera_sub:
- "ffmpeg:http://reolink_ip/flv?port=1935&app=bcs&stream=channel0_ext.bcs&user=username&password=password"
your_reolink_camera_via_nvr:
- "ffmpeg:http://reolink_nvr_ip/flv?port=1935&app=bcs&stream=channel3_main.bcs&user=username&password=password" # 通道号为0-15
- "ffmpeg:your_reolink_camera_via_nvr#audio=aac"
your_reolink_camera_via_nvr_sub:
- "ffmpeg:http://reolink_nvr_ip/flv?port=1935&app=bcs&stream=channel3_ext.bcs&user=username&password=password"
cameras:
your_reolink_camera:
ffmpeg:
inputs:
- path: rtsp://127.0.0.1:8554/your_reolink_camera
input_args: preset-rtsp-restream
roles:
- record
- path: rtsp://127.0.0.1:8554/your_reolink_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
reolink_via_nvr:
ffmpeg:
inputs:
- path: rtsp://127.0.0.1:8554/your_reolink_camera_via_nvr?video=copy&audio=aac
input_args: preset-rtsp-restream
roles:
- record
- path: rtsp://127.0.0.1:8554/your_reolink_camera_via_nvr_sub?video=copy
input_args: preset-rtsp-restream
roles:
- detect
```
#### Reolink门铃
Reolink门铃支持通过go2rtc和其他应用实现双向音频。重要的是为了稳定性仍要使用http-flv流可以添加一个仅用于双向音频的辅助RTSP流。
确保在摄像头的高级网络设置中启用了HTTP。要使用Frigate的双向通话功能请参阅[实时视图文档](/configuration/live#双向通话)。
```yaml
go2rtc:
streams:
your_reolink_doorbell:
- "ffmpeg:http://reolink_ip/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=username&password=password#video=copy#audio=copy#audio=opus"
- rtsp://reolink_ip/Preview_01_sub
your_reolink_doorbell_sub:
- "ffmpeg:http://reolink_ip/flv?port=1935&app=bcs&stream=channel0_ext.bcs&user=username&password=password"
```
### Unifi Protect摄像头
Unifi Protect摄像头需要使用rtspx流与go2rtc配合。
要使用Unifi Protect摄像头将rtsps链接修改为以rtspx开头。
此外从Unifi链接末尾移除"?enableSrtp"。
```yaml
go2rtc:
streams:
front:
- rtspx://192.168.1.1:7441/abcdefghijk
```
[更多信息请参阅go2rtc文档](https://github.com/AlexxIT/go2rtc/tree/v1.9.9#source-rtsp)
在Unifi 2.0更新中Unifi Protect摄像头的音频采样率发生了变化导致ffmpeg出现问题。如果直接与Unifi Protect配合使用需要为录制设置输入采样率。
```yaml
ffmpeg:
output_args:
record: preset-record-ubiquiti
```
### TP-Link VIGI摄像头
TP-Link VIGI摄像头需要调整主码流设置以避免问题。需要将流配置为`H264`,并将`智能编码`设置为`关闭`。没有这些设置在尝试观看录制片段时可能会出现问题。例如Firefox会在播放几秒后停止并显示以下错误信息`媒体播放因损坏问题或媒体使用了浏览器不支持的功能而中止。`。

View File

@ -0,0 +1,139 @@
---
id: cameras
title: 摄像头配置
---
## 设置摄像头输入源
可以为每个摄像头配置多个输入源,并根据需求混合搭配每个输入源的角色。这样您可以使用低分辨率视频流进行物体检测,同时使用高分辨率视频流进行录像,反之亦然。
默认情况下摄像头是启用的,但可以通过设置`enabled: False`来禁用。通过配置文件禁用的摄像头不会出现在Frigate用户界面中也不会消耗系统资源。
每个角色在每个摄像头中只能分配给一个输入源。可用的角色选项如下:
| 角色 | 描述 |
| -------- | ----------------------------------------------------------------------------------- |
| `detect` | 用于物体检测的主视频流。[文档](object_detectors.md) |
| `record` | 根据配置设置保存视频片段。[文档](record.md) |
| `audio` | 用于基于音频的检测。[文档](audio_detectors.md) |
```yaml
mqtt:
host: mqtt.server.com
cameras:
back: # <- 摄像头名称暂时只支持英文数字和下划线
enabled: True
ffmpeg:
inputs:
# 摄像头rtsp流地址可查阅摄像头文档或互联网其他人分享的教程下面的地址仅为范例
- path: rtsp://viewer:{FRIGATE_RTSP_PASSWORD}@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
roles:
- detect # <- 用于物体检测
# 可以设置不同的流用于不同功能,例如上面的流为子码流,节省带宽,适合检测,能够降低检测器负担
# 主码流画面清晰,适合录制
- path: rtsp://viewer:{FRIGATE_RTSP_PASSWORD}@10.0.10.10:554/live
roles:
- record # <- 用于录像
detect:
width: 1280 # <- 可选默认Frigate会尝试自动检测分辨率
height: 720 # <- 可选默认Frigate会尝试自动检测分辨率
```
只需在配置文件的`cameras`条目下添加更多摄像头即可。
```yaml
mqtt: ...
cameras:
back: ...
front: ...
side: ...
```
:::note
如果您只定义了一个视频流输入且没有为其分配`detect`角色Frigate会自动将其分配为`detect`角色。即使您在配置的`detect`部分中通过`enabled: False`禁用了物体检测Frigate仍会解码视频流以支持运动检测、鸟瞰图、API图像端点和其他功能。
如果您计划仅使用Frigate进行录像仍建议为低分辨率视频流定义`detect`角色,以减少所需视频流解码的资源消耗。
:::
关于特定摄像头型号的设置,请查看[摄像头特定](camera_specific.md)信息。
## 设置摄像头PTZ控制
:::warning
并非所有PTZ摄像头都支持ONVIF这是Frigate用来与您的摄像头通信的标准协议。请检查[官方ONVIF兼容产品列表](https://www.onvif.org/conformant-products/)、您的摄像头文档或制造商网站以确保您的PTZ支持ONVIF。同时请确保您的摄像头运行最新的固件。
:::
在配置文件的摄像头部分添加onvif配置
```yaml
cameras:
back: # <- 为名为back的摄像头配置ONVIF
ffmpeg: ...
onvif:
host: 10.0.10.10
port: 8000
user: admin
password: password
```
如果ONVIF连接成功PTZ控制将在摄像头的Web界面中可用。
:::tip
如果您的ONVIF摄像头不需要认证凭据您可能仍需要为`user`和`password`指定空字符串,例如:`user: ""`和`password: ""`。
:::
支持视野(FOV)内相对移动的ONVIF摄像头还可以配置为自动跟踪移动物体并将其保持在画面中央。关于自动跟踪的设置请参阅[自动跟踪](autotracking.md)文档。
## ONVIF PTZ摄像头推荐
以下工作与非工作PTZ摄像头列表基于用户反馈。
| 品牌或具体型号 | PTZ控制 | 自动跟踪 | 备注 |
| ---------------------------- | :----------: | :----------: | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| Amcrest | ✅ | ✅ | ⛔️ 一般来说Amcrest应该可以工作但一些旧型号(如常见的IP2M-841)不支持自动跟踪 |
| Amcrest ASH21 | ✅ | ❌ | ONVIF服务端口: 80 |
| Amcrest IP4M-S2112EW-AI | ✅ | ❌ | 不支持FOV相对移动。 |
| Amcrest IP5M-1190EW | ✅ | ❌ | ONVIF端口: 80。不支持FOV相对移动。 |
| Ctronics PTZ | ✅ | ❌ | |
| Dahua | ✅ | ✅ | |
| Dahua DH-SD2A500HB | ✅ | ❌ | |
| Foscam R5 | ✅ | ❌ | |
| Hanwha XNP-6550RH | ✅ | ❌ | |
| Hikvision | ✅ | ❌ | ONVIF支持不完整(即使是最新固件MoveStatus也不会更新) - 在HWP-N4215IH-DE和DS-2DE3304W-DE型号上报告但可能还有其他型号 |
| Hikvision DS-2DE3A404IWG-E/W | ✅ | ✅ | |
| Reolink 511WA | ✅ | ❌ | 仅支持缩放 |
| Reolink E1 Pro | ✅ | ❌ | |
| Reolink E1 Zoom | ✅ | ❌ | |
| Reolink RLC-823A 16x | ✅ | ❌ | |
| Speco O8P32X | ✅ | ❌ | |
| Sunba 405-D20X | ✅ | ❌ | 原始型号和4k型号报告ONVIF支持不完整。怀疑所有型号都不兼容。 |
| Tapo | ✅ | ❌ | 支持多种型号ONVIF服务端口: 2020 |
| Uniview IPC672LR-AX4DUPK | ✅ | ❌ | 固件声称支持FOV相对移动但在发送ONVIF命令时摄像头实际上不会移动 |
| Uniview IPC6612SR-X33-VG | ✅ | ✅ | 保持`calibrate_on_startup`为`False`。有用户报告使用`absolute`缩放是有效的。 |
| Vikylin PTZ-2804X-I2 | ❌ | ❌ | ONVIF支持不完整 |
## 设置摄像头分组
:::tip
建议使用用户界面设置摄像头分组。
:::
摄像头可以分组并分配名称和图标,这样可以一起查看和筛选。始终会有一个包含所有摄像头的默认分组。
```yaml
camera_groups:
front: # <- 分组名称暂时只支持英文数字和下划线
cameras:
- driveway_cam # <- 摄像头名称
- garage_cam # <- 摄像头名称
icon: LuCar
order: 0
```

View File

@ -0,0 +1,142 @@
---
id: face_recognition
title: 人脸识别
---
人脸识别功能通过将检测到的人脸与预先学习的人脸数据进行匹配,来识别已知个体。当识别出已知人员时,他们的姓名将作为`sub_label`添加。这些信息会显示在UI界面、过滤器中也会包含在通知中。
## 模型要求
### 人脸检测
当运行Frigate+模型(或任何原生支持人脸检测的自定义模型)时,应确保在[跟踪对象列表](../plus/#available-label-types)中添加`face`标签,可以是全局设置或针对特定摄像头。这将允许人脸检测与物体检测同时运行,提高效率。
当运行默认的COCO模型或其他不包含`face`作为可检测标签的模型时人脸检测将通过CV2使用运行在CPU上的轻量级DNN模型进行。在这种情况下您不应在跟踪对象列表中定义`face`。
### 人脸识别
Frigate支持两种人脸识别模型类型
- **small(小型)**: Frigate将运行FaceNet嵌入模型进行人脸识别该模型在CPU上本地运行。此模型针对效率进行了优化但准确性较低。
- **large(大型)**: Frigate将运行大型ArcFace嵌入模型该模型针对准确性进行了优化。建议仅在拥有集成或独立显卡时使用。
在这两种情况下,都会使用轻量级的人脸关键点检测模型在运行识别前对齐人脸。
## 最低系统要求
`small`模型针对效率进行了优化可在CPU上运行大多数CPU都能高效运行该模型。
`large`模型针对准确性进行了优化强烈建议使用集成或独立GPU。
## 配置
人脸识别默认禁用必须在UI界面或配置文件中启用后才能使用。人脸识别是全局配置设置。
```yaml
face_recognition:
enabled: true
```
## 高级配置
可通过以下可选参数微调人脸识别:
### 检测
- `detection_threshold`: 运行识别前所需的人脸检测置信度分数:
- 默认值: `0.7`
- 注意: 此字段仅适用于独立的人脸检测模型,对于内置人脸检测的模型应使用`min_score`进行过滤。
- `min_area`: 定义运行识别前人脸的最小尺寸(以像素为单位)。
- 默认值: `500`像素。
- 根据摄像头`detect`流的分辨率,可以增加此值以忽略过小或过远的人脸。
### 识别
- `model_size`: 使用的模型大小,可选`small`或`large`
- `unknown_score`: 将人员标记为潜在匹配的最低分数,低于此分数的匹配将被标记为未知。
- 默认值: `0.8`
- `recognition_threshold`: 将人脸添加为对象子标签所需的识别置信度分数。
- 默认值: `0.9`
- `save_attempts`: 保存用于训练的已识别人脸图像数量。
- 默认值: `100`
- `blur_confidence_filter`: 启用计算人脸模糊程度并据此调整置信度的过滤器。
- 默认值: `True`
## 创建完备的训练集
人脸识别所需的足够训练集图像数量取决于多个因素:
- 数据集的多样性:包含光照、姿态和面部表情变化的多样化数据集,每个人所需的图像数量会比多样性较低的数据集少。
- 期望的准确性:期望的准确性越高,通常需要的图像越多。
以下是一些通用指导原则:
- 最低要求对于基本人脸识别任务通常建议每人至少5-10张图像。
- 推荐对于更健壮和准确的系统每人20-30张图像是一个良好的起点。
- 理想情况为了获得最佳性能特别是在具有挑战性的条件下每人50-100张图像会更有益。
人脸识别的准确性很大程度上取决于训练数据的质量。建议分阶段构建人脸训练库。
:::tip
选择包含在人脸训练集中的图像时,建议始终遵循以下建议:
- 如果难以辨认人物面部的细节,则对训练没有帮助。
- 避免曝光过度/不足的图像。
- 避免模糊/像素化的图像。
- 避免使用红外线(灰度)图像进行训练。模型是在彩色图像上训练的,能够从灰度图像中提取特征。
- 使用戴帽子/太阳镜的人物图像可能会混淆模型。
- 不要一次性上传过多相似的图像建议每人训练不超过4-6张相似图像以避免过拟合。
:::
### 第一步 - 建立坚实基础
首次启用人脸识别时建立高质量的图像基础非常重要。建议首先为每个人上传1-5张"肖像"照片。确保照片中人物的面部是正面的,没有侧转,这将提供一个良好的起点。
然后建议使用Frigate中的`Face Library`选项卡,在检测到每个人时选择和训练图像。在建立坚实基础时,强烈建议仅训练正面图像。忽略从识别侧面人脸的摄像头获取的图像。
目标是平衡图像质量的同时,也要包含各种条件(白天/夜晚、不同天气、不同时间段等)的图像,以确保每个人的训练图像具有多样性,避免过拟合。
当一个人物在正面图像上能够被持续正确识别时,就可以进入下一步。
### 第二步 - 扩展数据集
当正面图像的识别表现良好后,开始选择稍微有角度的图像进行训练。重要的是仍然选择那些能看到足够面部细节以识别某人的图像。
## 常见问题
### 为什么不能批量上传照片?
有方法地添加照片到库中非常重要,批量导入照片(特别是来自普通照片库)会导致特定场景下的过拟合,降低识别性能。
### 为什么不能批量重新处理人脸?
人脸嵌入模型的工作原理是将人脸分解为不同的特征。这意味着当重新处理图像时,只有角度相似的图像才会影响其分数。
### 为什么未知人员的分数与已知人员相似?
这可能由几个不同原因引起,但通常表明训练集需要改进。这通常与过拟合有关:
- 如果每个人只训练少量图像,特别是这些图像非常相似时,识别模型会过度专门化于这些特定图像。
- 当提供不同姿态、光照和表情的图像时,算法会提取这些变化中一致的特征。
- 通过在多样化的图像集上训练,算法对输入图像中的微小变化和噪声变得不那么敏感。
### 在训练选项卡中看到分数超过阈值,但没有分配子标签?
Frigate会考虑每个人物对象的所有识别尝试的分数。分数会根据人脸区域持续加权只有当一个人物被持续自信地识别时才会为其分配子标签。这避免了单次高置信度识别影响结果的情况。
### 可以同时使用其他人脸识别软件(如DoubleTake)和内置的人脸识别吗?
不可以使用其他人脸识别服务会干扰Frigate内置的人脸识别。当使用double-take时如果还希望使用内置的人脸识别功能必须禁用sub_label功能。
### 人脸识别会在录制流上运行吗?
人脸识别不会在录制流上运行,这有很多不利原因:
1. 访问录制的延迟意味着通知中不会包含已识别人员的姓名,因为识别要到之后才能完成。
2. 使用的嵌入模型在固定图像尺寸上运行,因此较大的图像会被缩小以匹配。
3. 运动清晰度比额外像素重要得多,过度压缩和运动模糊对结果的影响比分辨率更大。
### 直接用iPhone拍照时出现未知错误
默认情况下iOS设备会使用HEIC(高效图像容器)格式存储图像,但此格式不支持上传。选择`large`格式而非`original`将使用JPG格式这样可以正常工作。

View File

@ -0,0 +1,79 @@
---
id: ffmpeg_presets
title: FFmpeg预设参数
---
Frigate默认提供了一些FFmpeg参数预设以简化配置流程。所有预设参数可在[此文件](https://github.com/blakeblackshear/frigate/blob/master/frigate/ffmpeg_presets.py)中查看。
### 硬件加速预设
强烈建议在配置中使用硬件加速预设。这些预设不仅能替代冗长的参数还能让Frigate了解可用硬件信息从而进行其他GPU优化如鸟瞰图重流编码或非原生分辨率缩放
详见[硬件加速文档](/configuration/hardware_acceleration.md)获取GPU/iGPU设置指南。
| 预设名称 | 适用场景 | 注意事项 |
|---------------------|---------------------------|--------------------------|
| preset-rpi-64-h264 | 64位树莓派+h264流 | |
| preset-rpi-64-h265 | 64位树莓派+h265流 | |
| preset-vaapi | Intel/AMD VAAPI | 需确保选择正确的驱动程序 |
| preset-intel-qsv-h264 | Intel QSV+h264流 | 遇到问题建议改用vaapi预设 |
| preset-intel-qsv-h265 | Intel QSV+h265流 | 遇到问题建议改用vaapi预设 |
| preset-nvidia | NVIDIA显卡 | |
| preset-jetson-h264 | NVIDIA Jetson+h264流 | |
| preset-jetson-h265 | NVIDIA Jetson+h265流 | |
| preset-rk-h264 | 瑞芯微MPP+h264流 | 需使用*-rk后缀镜像和特权模式 |
| preset-rk-h265 | 瑞芯微MPP+h265流 | 需使用*-rk后缀镜像和特权模式 |
### 输入参数预设
输入参数预设可提升配置可读性,并针对不同类型的视频流提供最佳兼容性方案。
详见[摄像头特定配置文档](/configuration/camera_specific.md)获取非标摄像头使用建议。
| 预设名称 | 适用场景 | 注意事项 |
|--------------------------|-----------------------|------------------------------------------------------------------------|
| preset-http-jpeg-generic | HTTP实时JPEG流 | 建议改用重流方式处理 |
| preset-http-mjpeg-generic | HTTP MJPEG流 | 建议改用重流方式处理 |
| preset-http-reolink | Reolink HTTP-FLV流 | 仅适用于原生HTTP流不适用于RTSP重流 |
| preset-rtmp-generic | RTMP流 | |
| preset-rtsp-generic | RTSP流 | 未指定时的默认预设 |
| preset-rtsp-restream | RTSP重流源 | 适用于作为Frigate输入源的RTSP重流 |
| preset-rtsp-restream-low-latency | RTSP低延迟重流源 | 可降低延迟,但部分摄像头可能不兼容 |
| preset-rtsp-udp | UDP协议RTSP流 | 适用于仅支持UDP的摄像头 |
| preset-rtsp-blue-iris | Blue Iris RTSP流 | 适用于Blue Iris视频源 |
:::warning
使用重流时需特别注意输入参数,不同协议不可混用。`http`和`rtmp`预设不能用于`rtsp`流。例如当使用Reolink摄像头的RTSP重流作为录制源时若误用preset-http-reolink会导致崩溃。此时需要在流级别单独设置预设参考以下示例
:::
```yaml
go2rtc:
streams:
reolink_cam: http://192.168.0.139/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=admin&password=password
cameras:
reolink_cam:
ffmpeg:
inputs:
- path: http://192.168.0.139/flv?port=1935&app=bcs&stream=channel0_ext.bcs&user=admin&password=password
input_args: preset-http-reolink
roles:
- detect
- path: rtsp://127.0.0.1:8554/reolink_cam
input_args: preset-rtsp-generic
roles:
- record
```
### 输出参数预设
输出参数预设可优化录制文件的生成逻辑,确保录制内容的一致性。
| 预设名称 | 适用场景 | 注意事项 |
|-----------------------------|-------------------------|------------------------------------------------------------------------|
| preset-record-generic | 无音频录制 | 未指定时的默认预设 |
| preset-record-generic-audio-copy | 保留原始音频录制 | 启用音频录制时使用 |
| preset-record-generic-audio-aac | 转码为AAC音频录制 | 源已是AAC编码时应改用preset-record-generic-audio-copy避免重复编码 |
| preset-record-mjpeg | MJPEG流录制 | 建议改用重流方式处理 |
| preset-record-jpeg | 实时JPEG录制 | 建议改用重流方式处理 |
| preset-record-ubiquiti | Ubiquiti非标音频流录制 | 适用于Ubiquiti设备的特殊音频格式 |

View File

@ -0,0 +1,230 @@
---
id: genai
title: 生成式AI
---
生成式AI可用于根据跟踪对象的缩略图自动生成描述性文本。这有助于Frigate中的[语义搜索](/configuration/semantic_search)为跟踪对象提供更多上下文信息。描述可通过Frigate界面中的**浏览**页面访问,点击跟踪对象的缩略图即可查看。
描述请求会在跟踪对象生命周期结束时自动发送给您的AI提供商也可以选择在帧发生显著变化后提前发送例如用于更实时的通知场景。描述也可以通过Frigate界面手动重新生成。请注意如果您在跟踪对象结束前手动输入描述该描述将被生成的响应覆盖。
## 配置
生成式AI可以为所有摄像头启用或仅为特定摄像头启用。目前有3种原生提供商可与Frigate集成。支持OpenAI标准API的其他提供商也可使用。请参阅下面的OpenAI部分。
要使用生成式AI您必须在Frigate配置的全局层级定义一个提供商。如果您选择的提供商需要API密钥可以直接将其粘贴在配置中或存储在环境变量中(以`FRIGATE_`为前缀)。
```yaml
genai:
enabled: True
provider: gemini
api_key: "{FRIGATE_GEMINI_API_KEY}"
model: gemini-1.5-flash
cameras:
front_camera: ...
indoor_camera:
genai: # <- 为室内摄像头禁用GenAI
enabled: False
```
## Ollama
:::warning
不建议在CPU上使用Ollama高推理时间会使生成式AI变得不实用。
:::
[Ollama](https://ollama.com/)允许您自托管大型语言模型并保持所有内容在本地运行。它在[llama.cpp](https://github.com/ggerganov/llama.cpp)上提供了一个很好的API。强烈建议在配备Nvidia显卡的机器或Apple silicon Mac上托管此服务器以获得最佳性能。
大多数7b参数的4位视觉模型都能在8GB显存中运行。也有可用的[Docker容器](https://hub.docker.com/r/ollama/ollama)。
并行请求也有一些注意事项。您需要设置`OLLAMA_NUM_PARALLEL=1`并选择适合您硬件和偏好的`OLLAMA_MAX_QUEUE`和`OLLAMA_MAX_LOADED_MODELS`值。请参阅[Ollama文档](https://github.com/ollama/ollama/blob/main/docs/faq.md#how-does-ollama-handle-concurrent-requests)。
### 支持的模型
您必须使用支持视觉的图生文模型。当前模型变体可在[其模型库](https://ollama.com/library)中找到。在撰写本文时,这包括`llava`、`llava-llama3`、`llava-phi3`和`moondream`。请注意Frigate不会自动下载您在配置中指定的模型您必须先将模型下载到您的Ollama本地实例例如在Ollama服务器/Docker容器上运行`ollama pull llava:7b`。请注意Frigate配置中指定的模型必须与下载的模型标签匹配。
:::note
您应至少有8GB可用RAM(或在GPU上运行时为显存)来运行7B模型16GB运行13B模型32GB运行33B模型。
:::
### 配置
```yaml
genai:
enabled: True
provider: ollama
base_url: http://localhost:11434
model: llava:7b
```
## Google Gemini
Google Gemini有一个免费层级允许每分钟[15次查询](https://ai.google.dev/pricing)到API这对于标准Frigate使用来说已经足够。
### 支持的模型
您必须使用支持视觉的图生文模型。当前模型变体可在[其文档](https://ai.google.dev/gemini-api/docs/models/gemini)中找到。在撰写本文时,这包括`gemini-1.5-pro`和`gemini-1.5-flash`。
### 获取API密钥
要开始使用Gemini您必须首先从[Google AI Studio](https://aistudio.google.com)获取API密钥。
1. 接受服务条款
2. 从右侧导航栏点击"获取API密钥"
3. 点击"在新项目中创建API密钥"
4. 复制API密钥用于您的配置
### 配置
```yaml
genai:
enabled: True
provider: gemini
api_key: "{FRIGATE_GEMINI_API_KEY}"
model: gemini-1.5-flash
```
## OpenAI
OpenAI没有为其API提供免费层级。随着gpt-4o的发布价格已经降低如果您选择此路线每次生成应该只需几分钱。
:::warning
请注意,如果您的摄像头位于公共领域(例如过道)等会检测过多对象的地方,过多的对象可能会很快耗尽您的资源包。请**务必不要开启**后付费模式!
:::
### 支持的模型
您必须使用支持视觉的图生文模型。当前模型变体可在[其文档](https://platform.openai.com/docs/models)中找到。在撰写本文时 `gpt-4o``gpt-4-turbo` 都支持图生文功能。
:::note
如果您选择国内兼容OpenAI API的大模型提供商请注意选择支持**图生文**的模型。例如腾讯云的`hunyuan-vision`模型。DeepSeek官方目前未提供其图生文[`DeepSeek-VL2`](https://github.com/deepseek-ai/DeepSeek-VL2)模型的API但可以在第三方服务商处获取由他们部署的版本。
:::
### 获取API密钥
要开始使用OpenAI您必须首先[创建API密钥](https://platform.openai.com/api-keys)并[配置计费](https://platform.openai.com/settings/organization/billing/overview)。
### 配置
```yaml
genai:
enabled: True
provider: openai
api_key: "{FRIGATE_OPENAI_API_KEY}"
model: gpt-4o
```
:::note
要使用兼容OpenAI API的其他服务商例如阿里云和腾讯云等国内云厂商需要设置**环境变量** `OPENAI_BASE_URL` 为您的服务商的API endpoint。
例如腾讯云请设置为https://api.hunyuan.cloud.tencent.com/v1
:::
## Azure OpenAI
微软通过Azure OpenAI提供了几种视觉模型。需要订阅。
### 支持的模型
您必须使用支持视觉的图生文模型。当前模型变体可在[其文档](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models)中找到。在撰写本文时,这包括`gpt-4o`和`gpt-4-turbo`。
### 创建资源并获取API密钥
要开始使用Azure OpenAI您必须首先[创建资源](https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource?pivots=web-portal#create-a-resource)。您需要您的API密钥和资源URL其中必须包含`api-version`参数(参见下面的示例)。配置中不需要模型字段,因为模型是您部署资源时选择的部署名称的一部分。
### 配置
```yaml
genai:
enabled: True
provider: azure_openai
base_url: https://example-endpoint.openai.azure.com/openai/deployments/gpt-4o/chat/completions?api-version=2023-03-15-preview
api_key: "{FRIGATE_OPENAI_API_KEY}"
```
## 使用方法和最佳实践
Frigate的缩略图搜索擅长识别跟踪对象的特定细节 - 例如,使用"图像标题"方法查找"穿黄色背心的人"、"在草坪上奔跑的白狗"或"住宅街道上的红色汽车"。为了进一步增强这一点Frigate的默认提示设计为询问您的AI提供商有关对象行为背后的意图而不仅仅是描述其外观。
虽然生成检测对象的简单描述很有用但理解意图提供了更深层次的洞察。Frigate的默认提示不仅识别场景中的"什么",还旨在推断"为什么"它可能在那里或"什么"它可能会做下一步。描述告诉您发生了什么,但意图提供了上下文。例如,一个人走向门可能看起来像访客,但如果他们在下班后快速移动,您可以推断潜在的闯入企图。检测到一个人在夜间在门附近徘徊可以比简单地注意到"一个人站在门旁"更快触发警报,帮助您根据情况上下文做出响应。
### 使用生成式AI进行通知
Frigate提供了一个[MQTT主题](/integrations/mqtt)`frigate/tracked_object_update`当您的AI提供商返回跟踪对象的描述时它会更新包含`event_id`和`description`的JSON有效负载。此描述可直接用于通知例如发送警报到您的手机或进行音频公告。如果需要来自跟踪对象的其他详细信息您可以使用[HTTP API](/integrations/api/event-events-event-id-get)查询`event_id`,例如:`http://frigate_ip:5000/api/events/<event_id>`。
如果希望在对象停止被跟踪之前获得通知,可以配置`after_significant_updates`的附加发送触发器。
```yaml
genai:
send_triggers:
tracked_object_end: true # 默认
after_significant_updates: 3 # 在发送图像前跟踪对象的更新次数
```
## 自定义提示
Frigate将来自跟踪对象的多帧图像与提示一起发送给您的生成式AI提供商要求其生成描述。默认提示如下
```
请分析以下监控摄像头画面中的 “{label}” 元素,如果可以,请尽可能描述 “{label}” 的动作、以及它接下来可能会做什么,而不是描述其外观或周围环境。请注意引号内的名称可能为英文,请输出时将其翻译为中文。
```
:::tip
提示可以使用变量替换,如`{label}`、`{sub_label}`和`{camera}`,以将跟踪对象的信息替换为提示的一部分。
:::
您也可以在配置中定义自定义提示。
```yaml
genai:
enabled: True
provider: ollama
base_url: http://localhost:11434
model: llava
prompt: "分析来自{camera}安全摄像头的这些图像中的{label}。重点关注{label}的动作、行为和潜在意图,而不仅仅是描述其外观。"
object_prompts:
person: "请查看该监控画面中的主要人物。他们在做什么,他们的行为可能暗示什么意图(例如,接近门、离开区域、站立不动)?不要描述周围环境或静态细节。"
car: "观察这些图像中的主要车辆。重点关注其移动、方向或目的(例如,停车、接近、绕行)。如果是送货车辆,请提及公司名称。"
```
提示也可以在摄像头级别覆盖,以便为模型提供关于您特定摄像头的更详细提示(如果您希望)。默认情况下,将为所有跟踪对象和所有区域生成描述。但您也可以选择指定`objects`和`required_zones`,仅生成某些跟踪对象或区域的描述。
可选地,您可以通过将`use_snapshot`设置为`True`来使用快照生成描述(如果启用)。默认情况下,此设置为`False`,它会将对象生命周期内从`detect`流收集的未压缩图像发送给模型。一旦对象生命周期结束仅保存一个压缩和裁剪的缩略图与跟踪对象。当您想要_重新生成_跟踪对象的描述时使用快照可能很有用因为它将为AI提供比裁剪/压缩的缩略图更高质量的图像(通常由AI本身缩小)。否则使用快照有一个权衡,即只向您的提供商发送单个图像,这将限制模型确定对象移动或方向的能力。
```yaml
cameras:
front_door:
genai:
use_snapshot: True
prompt: "分析来自{camera}前门安全摄像头的这些图像中的“{label}”。重点关注“{label}”的动作和潜在意图。请注意引号内的名称可能为英文,请输出时将其翻译为中文。"
object_prompts:
person: "检查这些图像中的人物。他们在做什么,他们的行为可能暗示什么目的(例如,递送东西、接近、离开)?如果他们携带或与包裹互动,请包括有关其来源或目的地的详细信息。"
cat: "观察这些图像中的猫。重点关注其移动和意图(例如,徘徊、狩猎、与物体互动)。如果猫靠近花盆或进行任何特定动作,请提及。"
objects:
- person
- cat
required_zones:
- steps
```
### 尝试不同的提示
许多提供商还为其模型提供公开的聊天界面。从Frigate下载几个不同的缩略图或快照并在他们的聊天页面中尝试新内容然后再更新Frigate中的提示以获得您喜欢的描述。
海外:
- OpenAI - [ChatGPT](https://chatgpt.com)
- Gemini - [Google AI Studio](https://aistudio.google.com)
- Ollama - [Open WebUI](https://docs.openwebui.com/)
国内:
- 千问 - [阿里百炼](https://bailian.console.aliyun.com/)
- 豆包 - [火山引擎](https://console.volcengine.com/ark)

View File

@ -0,0 +1,348 @@
---
id: hardware_acceleration
title: 硬件加速
---
# 硬件加速
强烈建议在Frigate中使用GPU进行硬件加速。某些类型的硬件加速会被自动检测并使用但您可能需要更新配置以在ffmpeg中启用硬件加速解码。
根据您的系统这些参数可能不兼容。更多关于ffmpeg硬件加速解码的信息请参考https://trac.ffmpeg.org/wiki/HWAccelIntro
# 官方支持
## 树莓派3/4
确保为GPU分配至少128MB内存通过`raspi-config` > 性能选项 > GPU内存设置
如果使用Home Assistant插件可能需要使用完全访问版本并关闭"保护模式"以启用硬件加速。
```yaml
# 解码h264流
ffmpeg:
hwaccel_args: preset-rpi-64-h264
# 解码h265(hevc)流
ffmpeg:
hwaccel_args: preset-rpi-64-h265
```
:::note
如果通过Docker运行Frigate需要以特权模式运行或将`/dev/video*`设备映射到Frigate。使用Docker Compose添加
```yaml
services:
frigate:
...
devices:
- /dev/video11:/dev/video11
```
或使用`docker run`
```bash
docker run -d \
--name frigate \
...
--device /dev/video11 \
ghcr.io/blakeblackshear/frigate:stable
```
`/dev/video11`是正确的设备树莓派4B。可以通过以下命令检查
```bash
for d in /dev/video*; do
echo -e "---\n$d"
v4l2-ctl --list-formats-ext -d $d
done
```
或者映射所有`/dev/video*`设备。
:::
## Intel显卡
:::info
**推荐硬件加速预设**
| CPU代数 | Intel驱动 | 推荐预设 | 说明 |
|---------|------------|----------|------|
| 1-7代 | i965 | preset-vaapi | 不支持qsv |
| 8-12代 | iHD | preset-vaapi | 也可使用preset-intel-qsv-* |
| 13代+ | iHD/Xe | preset-intel-qsv-* | |
| Intel Arc显卡 | iHD/Xe | preset-intel-qsv-* | |
:::
:::note
默认驱动是`iHD`。如需要改为i965驱动可能需要通过添加环境变量`LIBVA_DRIVER_NAME=i965`在docker-compose文件中或[HA插件的config.yml](advanced.md#environment_vars)中)。
参考[Intel文档](https://www.intel.com/content/www/us/en/support/articles/000005505/processors.html)确认您的CPU是第几代的。
:::
### 通过VAAPI
VAAPI支持自动配置文件选择可自动处理H.264和H.265流。
```yaml
ffmpeg:
hwaccel_args: preset-vaapi
```
### 通过QuickSync
:::warning
部分用户反馈使用`preset-intel-qsv-*`可能无法正常启动Frigate这种情况建议使用VAAPI
:::
#### H.264流
```yaml
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
```
#### H.265流
```yaml
ffmpeg:
hwaccel_args: preset-intel-qsv-h265
```
### Docker中配置Intel GPU统计
需要额外配置才能使Docker容器访问`intel_gpu_top`命令获取GPU统计信息。有两种方法
1. 以特权模式运行容器
2. 添加`CAP_PERFMON`能力(注意:可能需要降低`perf_event_paranoid`值)
#### 特权模式运行
这种方法有效但会赋予容器过多权限。
##### Docker Compose - 特权模式
```yaml
services:
frigate:
...
privileged: true
```
##### Docker Run CLI - 特权模式
```bash
docker run -d \
--name frigate \
...
--privileged \
ghcr.io/blakeblackshear/frigate:stable
```
#### CAP_PERFMON
只有较新版本的Docker支持`CAP_PERFMON`能力。可通过运行测试:`docker run --cap-add=CAP_PERFMON hello-world`
##### Docker Compose - CAP_PERFMON
```yaml
services:
frigate:
...
cap_add:
- CAP_PERFMON
```
##### Docker Run CLI - CAP_PERFMON
```bash
docker run -d \
--name frigate \
...
--cap-add=CAP_PERFMON \
ghcr.io/blakeblackshear/frigate:stable
```
#### perf_event_paranoid
_注意此设置需针对整个系统修改。_
关于不同发行版的值参考https://askubuntu.com/questions/1400874/what-does-perf-paranoia-level-four-do
临时修改(重启后失效):
```bash
sudo sh -c 'echo 2 >/proc/sys/kernel/perf_event_paranoid'
```
永久修改:
```bash
sudo sh -c 'echo kernel.perf_event_paranoid=2 >> /etc/sysctl.d/local.conf'
```
#### SR-IOV设备统计
使用SR-IOV虚拟化GPU时需要额外参数才能使GPU统计正常工作
```yaml
telemetry:
stats:
sriov: True
```
## AMD/ATI显卡Radeon HD 2000及更新
VAAPI支持自动配置文件选择可自动处理H.264和H.265流。
:::note
需要通过环境变量`LIBVA_DRIVER_NAME=radeonsi`将驱动改为radeonsi在docker-compose文件中或[HA插件的config.yml](advanced.md#environment_vars)中)。
:::
```yaml
ffmpeg:
hwaccel_args: preset-vaapi
```
## NVIDIA显卡
建议使用现代支持的GPU。NVIDIA提供了[支持的GPU和功能矩阵](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new)。如果您的显卡在列表中且支持CUVID/NVDEC则很可能可用于解码。但必须使用[与FFmpeg兼容的驱动版本](https://github.com/FFmpeg/nv-codec-headers/blob/master/README)。
更完整的显卡和驱动兼容列表见[驱动发布说明](https://download.nvidia.com/XFree86/Linux-x86_64/525.85.05/README/supportedchips.html)。
### Docker中配置NVIDIA显卡
需要安装[NVIDIA容器工具包](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker)并指定GPU。
#### Docker Compose - NVIDIA显卡
```yaml
services:
frigate:
...
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ['0'] # 仅需在多GPU时指定
count: 1 # GPU数量
capabilities: [gpu]
```
#### Docker Run CLI - NVIDIA显卡
```bash
docker run -d \
--name frigate \
...
--gpus=all \
ghcr.io/blakeblackshear/frigate:stable
```
### 设置解码器
使用`preset-nvidia`时ffmpeg会自动选择适合的配置文件如果不支持会记录错误。
```yaml
ffmpeg:
hwaccel_args: preset-nvidia
```
验证硬件解码是否工作,运行`nvidia-smi`应显示`ffmpeg`进程:
:::note
由于Docker限制`nvidia-smi`在容器内运行时可能不显示`ffmpeg`进程。
:::
这些说明基于[Jellyfin文档](https://jellyfin.org/docs/general/administration/hardware-acceleration.html#nvidia-hardware-acceleration-on-docker-linux)。
# 社区支持
## NVIDIA Jetson系列
提供基于Jetpack/L4T的专用Docker镜像包含使用Jetson专用媒体引擎的ffmpeg构建。Jetpack 6.0+主机使用`stable-tensorrt-jp6`标签镜像。注意Orin Nano没有视频编码器将使用软件编码。
### Docker Run CLI - Jetson
```bash
docker run -d \
...
--runtime nvidia
ghcr.io/blakeblackshear/frigate:stable-tensorrt-jp6
```
### Docker Compose - Jetson
```yaml
services:
frigate:
...
image: ghcr.io/blakeblackshear/frigate:stable-tensorrt-jp6
runtime: nvidia
```
:::note
旧版docker-compose不支持`runtime:`标签。可改为在`/etc/docker/daemon.json`中添加`"default-runtime": "nvidia"`
```json
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
```
:::
### 设置解码器
根据输入视频选择解码器(在容器内运行`ffmpeg -decoders | grep nvmpi`查看支持的解码器):
```yaml
ffmpeg:
hwaccel_args: preset-jetson-h264
```
验证硬件解码是否工作,运行`jtop``sudo pip3 install -U jetson-stats`应显示NVDEC/NVDEC1在使用。
## Rockchip平台
所有Rockchip SoC都支持使用[Nyanmisaka的FFmpeg 6.1分支](https://github.com/nyanmisaka/ffmpeg-rockchip)进行硬件加速编解码。
### 前提条件
按照[Rockchip特定安装说明](/frigate/installation#rockchip平台)操作。
### 配置
在`config.yml`中添加以下预设之一:
```yaml
# 解码h264流
ffmpeg:
hwaccel_args: preset-rk-h264
# 解码h265(hevc)流
ffmpeg:
hwaccel_args: preset-rk-h265
```
:::note
确保您的SoC支持输入流的硬件加速。例如如果摄像头以h265编码和4K分辨率流式传输您的SoC必须能够以4K或更高分辨率编解码h265。如果不确定请查阅SoC数据手册。
:::

View File

@ -0,0 +1,263 @@
---
id: index
title: Frigate 配置
---
对于Home Assistant插件安装配置文件应该位于`/addon_configs/<addon_directory>/config.yml`,其中`<addon_directory`是特定于你正在运行的Frigate插件变体的请参见[此处](#accessing-add-on-config-dir)的目录列表
对于所有其他类型的安装,配置文件应该映射到容器内的`/config/config.yml`。
文件可以命名为`config.yml`或`config.yaml`,但如果两个文件都存在,将优先使用`config.yml`并忽略`config.yaml`。
建议从最小配置开始,按照[本指南](../guides/getting_started.md)中的描述添加内容并使用Frigate UI中内置的支持验证的配置编辑器。
```yaml
mqtt:
enabled: False
cameras:
dummy_camera: # <--- 这将稍后更改为你的实际摄像头
enabled: False
ffmpeg:
inputs:
- path: rtsp://127.0.0.1:554/rtsp
roles:
- detect
```
## 访问Home Assistant插件配置目录 {#accessing-add-on-config-dir}
当通过HA插件运行Frigate时Frigate的`/config`目录被映射到主机上的`/addon_configs/<addon_directory>`,其中`<addon_directory>`是特定于你正在运行的Frigate插件变体的。
| 插件变体 | 配置目录 |
| -------------------------- | -------------------------------------------- |
| Frigate | `/addon_configs/ccab4aaf_frigate` |
| Frigate (完全访问) | `/addon_configs/ccab4aaf_frigate-fa` |
| Frigate Beta | `/addon_configs/ccab4aaf_frigate-beta` |
| Frigate Beta (完全访问) | `/addon_configs/ccab4aaf_frigate-fa-beta` |
**当你在文档中看到`/config`时,它指的是这个目录。**
例如,如果你正在运行标准插件变体并使用[VS Code插件](https://github.com/hassio-addons/addon-vscode)浏览文件你可以点击_文件_ > _打开文件夹..._并导航到`/addon_configs/ccab4aaf_frigate`来访问Frigate的`/config`目录并编辑`config.yaml`文件。你也可以使用Frigate UI中内置的文件编辑器来编辑配置文件。
## VS Code配置模式
VS Code支持JSON模式来自动验证配置文件。你可以通过在配置文件开头添加`# yaml-language-server: $schema=http://frigate_host:5000/api/config/schema.json`来启用此功能。将`frigate_host`替换为你的Frigate服务器的IP地址或主机名。如果你同时使用VS Code和Frigate作为插件你应该使用`ccab4aaf-frigate`。当从另一台机器上的VS Code访问配置时确保暴露内部未认证端口`5000`。
## 环境变量替换
Frigate仅在[参考配置](./reference.md)中特别指出的地方支持使用以`FRIGATE_`开头的环境变量。例如,以下值可以在运行时通过使用环境变量替换:
```yaml
mqtt:
user: "{FRIGATE_MQTT_USER}"
password: "{FRIGATE_MQTT_PASSWORD}"
```
```yaml
- path: rtsp://{FRIGATE_RTSP_USER}:{FRIGATE_RTSP_PASSWORD}@10.0.10.10:8554/unicast
```
```yaml
onvif:
host: 10.0.10.10
port: 8000
user: "{FRIGATE_RTSP_USER}"
password: "{FRIGATE_RTSP_PASSWORD}"
```
```yaml
go2rtc:
rtsp:
username: "{FRIGATE_GO2RTC_RTSP_USERNAME}"
password: "{FRIGATE_GO2RTC_RTSP_PASSWORD}"
```
```yaml
genai:
api_key: "{FRIGATE_GENAI_API_KEY}"
```
## 常见配置示例
以下是一些常见的入门配置示例。有关所有配置值的详细信息,请参阅[参考配置](./reference.md)。
### 带USB Coral的树莓派Home Assistant插件
- 单个摄像头720p5fps检测流
- MQTT连接到Home Assistant Mosquitto插件
- 用于解码视频的硬件加速
- USB Coral检测器
- 保存所有包含任何可检测运动的视频7天无论是否检测到任何对象
- 如果视频符合警报或检测条件继续保留30天
- 保存快照30天
- 摄像头时间戳的运动遮罩
```yaml
mqtt:
host: core-mosquitto
user: mqtt-user
password: xxxxxxxxxx
ffmpeg:
hwaccel_args: preset-rpi-64-h264
detectors:
coral:
type: edgetpu
device: usb
record:
enabled: True
retain:
days: 7
mode: motion
alerts:
retain:
days: 30
detections:
retain:
days: 30
snapshots:
enabled: True
retain:
default: 30
cameras:
name_of_your_camera:
detect:
width: 1280
height: 720
fps: 5
ffmpeg:
inputs:
- path: rtsp://10.0.10.10:554/rtsp
roles:
- detect
motion:
mask:
- 0.000,0.427,0.002,0.000,0.999,0.000,0.999,0.781,0.885,0.456,0.700,0.424,0.701,0.311,0.507,0.294,0.453,0.347,0.451,0.400
```
### 带USB Coral的独立Intel迷你PC
- 单个摄像头720p5fps检测流
- MQTT禁用未与home assistant集成
- VAAPI硬件加速用于解码视频
- USB Coral检测器
- 保存所有包含任何可检测运动的视频7天无论是否检测到任何对象
- 如果视频符合警报或检测条件继续保留30天
- 保存快照30天
- 摄像头时间戳的运动遮罩
```yaml
mqtt:
enabled: False
ffmpeg:
hwaccel_args: preset-vaapi
detectors:
coral:
type: edgetpu
device: usb
record:
enabled: True
retain:
days: 7
mode: motion
alerts:
retain:
days: 30
detections:
retain:
days: 30
snapshots:
enabled: True
retain:
default: 30
cameras:
name_of_your_camera:
detect:
width: 1280
height: 720
fps: 5
ffmpeg:
inputs:
- path: rtsp://10.0.10.10:554/rtsp
roles:
- detect
motion:
mask:
- 0.000,0.427,0.002,0.000,0.999,0.000,0.999,0.781,0.885,0.456,0.700,0.424,0.701,0.311,0.507,0.294,0.453,0.347,0.451,0.400
```
### 带OpenVino的Home Assistant集成Intel迷你PC
- 单个摄像头720p5fps检测流
- MQTT连接到与home assistant相同的mqtt服务器
- VAAPI硬件加速用于解码视频
- OpenVino检测器
- 保存所有包含任何可检测运动的视频7天无论是否检测到任何对象
- 如果视频符合警报或检测条件继续保留30天
- 保存快照30天
- 摄像头时间戳的运动遮罩
```yaml
mqtt:
host: 192.168.X.X # <---- 与home assistant使用相同的mqtt代理
user: mqtt-user
password: xxxxxxxxxx
ffmpeg:
hwaccel_args: preset-vaapi
detectors:
ov:
type: openvino
device: AUTO
model:
width: 300
height: 300
input_tensor: nhwc
input_pixel_format: bgr
path: /openvino-model/ssdlite_mobilenet_v2.xml
labelmap_path: /openvino-model/coco_91cl_bkgr.txt
record:
enabled: True
retain:
days: 7
mode: motion
alerts:
retain:
days: 30
detections:
retain:
days: 30
snapshots:
enabled: True
retain:
default: 30
cameras:
name_of_your_camera:
detect:
width: 1280
height: 720
fps: 5
ffmpeg:
inputs:
- path: rtsp://10.0.10.10:554/rtsp
roles:
- detect
motion:
mask:
- 0.000,0.427,0.002,0.000,0.999,0.000,0.999,0.781,0.885,0.456,0.700,0.424,0.701,0.311,0.507,0.294,0.453,0.347,0.451,0.400
```

View File

@ -0,0 +1,308 @@
---
id: license_plate_recognition
title: 车牌识别(LPR)
---
:::warning
车牌识别功能目前对中国大陆的车牌识别的支持并不完善我们会在后面优化该功能。目前将不会对该文档进行精翻本文使用DeepSeek AI进行翻译仅做参考。
:::
Frigate能够识别车辆上的车牌并自动将检测到的字符添加到`recognized_license_plate`字段,或将已知名称作为`sub_label`添加到`car`类型的跟踪对象中。常见用例包括识别驶入车道的车辆或街道上经过车辆的车牌。
当车牌清晰可见时LPR效果最佳。对于移动车辆Frigate会持续优化识别过程保留置信度最高的结果。但LPR不会对静止车辆运行。
当识别到车牌时,识别结果会:
- 作为`sub_label`(已知车牌)或`recognized_license_plate`字段(未知车牌)添加到跟踪对象
- 在核查的 核查项细节 面板中可见(sub labels)
- 在浏览的 探测对象细节 面板中可见(sub labels和recognized_license_plate)
- 可通过浏览中的 更多筛选项 菜单进行过滤
- 通过MQTT主题`frigate/events`发布,作为`car`跟踪对象的`sub_label`(已知)或`recognized_license_plate`(未知)
## 模型要求
使用Frigate+模型(或任何原生支持车牌检测的自定义模型)的用户应确保在[跟踪对象列表](https://docs.frigate.video/plus/#available-label-types)中添加`license_plate`标签可以是全局设置或针对特定摄像头。这将提高LPR模型的准确性和性能。
没有车牌检测模型的用户仍可运行LPR。Frigate使用轻量级YOLOv9车牌检测模型可配置在CPU或GPU上运行。这种情况下您不应在跟踪对象列表中定义`license_plate`。
:::note
在默认模式下Frigate的LPR需要先检测到`car`才能识别车牌。如果您使用专用LPR摄像头且视图放大到无法检测`car`的程度仍可运行LPR但配置参数与默认模式不同。详见下文[专用LPR摄像头](#专用lpr摄像头)部分。
:::
## 最低系统要求
车牌识别通过在系统本地运行AI模型实现。这些模型相对轻量可根据配置在CPU或GPU上运行。至少需要4GB内存。
## 配置
车牌识别默认禁用。在配置文件中启用:
```yaml
lpr:
enabled: True
```
与其他Frigate增强功能一样LPR必须全局启用。如果不想在某些摄像头上运行LPR可在摄像头级别禁用
```yaml
cameras:
garage:
...
lpr:
enabled: False
```
对于非专用LPR摄像头请确保摄像头配置为检测`car`类型对象且Frigate确实检测到了车辆。否则LPR不会运行。
与其他实时处理器一样,车牌识别运行在配置中`detect`角色定义的摄像头流上。为确保最佳性能,请在摄像头固件中选择适合您场景和需求的分辨率。
## 高级配置
在配置的全局层级使用这些可选参数微调LPR功能。唯一应在摄像头级别设置的可选参数是`enabled`、`min_area`和`enhancement`。
### 检测
- **`detection_threshold`**: 运行识别前所需的车牌检测置信度分数
- 默认: `0.7`
- 注意: 此字段仅适用于独立车牌检测模型,对于内置车牌检测的模型(如Frigate+)应使用`threshold`和`min_score`对象过滤器
- **`min_area`**: 定义运行识别前车牌的最小面积(像素单位)
- 默认: `1000`像素。注意:这是面积测量(长×宽)1000像素代表图像中约32×32像素的正方形
- 根据摄像头`detect`流的分辨率,可增加此值以忽略过小或过远的车牌
- **`device`**: 运行车牌识别模型的设备
- 默认: `CPU`
- 可选`CPU`或`GPU`。对于没有原生车牌检测模型的用户使用GPU可能提高模型性能特别是YOLOv9车牌检测器模型
- **`model_size`**: 用于检测车牌上文字的模型大小
- 默认: `small`
- 可选`small`或`large`。`large`模型使用增强的文本检测器,能更准确地找到车牌上的文字但比`small`模型慢。对大多数用户推荐small模型。对于车牌有多行文字的国家推荐large模型。注意使用large模型不会改进文字识别但可能改进文字检测
### 识别
- **`recognition_threshold`**: 将车牌作为`recognized_license_plate`和/或`sub_label`添加到对象所需的识别置信度分数
- 默认: `0.9`
- **`min_plate_length`**: 指定检测到的车牌必须具有的最小字符数才能作为`recognized_license_plate`和/或`sub_label`添加到对象
- 用于过滤短、不完整或不正确的检测
- **`format`**: 定义预期车牌格式的正则表达式。不匹配此格式的车牌将被丢弃
- `"^[A-Z]{1,3} [A-Z]{1,2} [0-9]{1,4}$"`匹配如"B AB 1234"或"M X 7"的车牌
- `"^[A-Z]{2}[0-9]{2} [A-Z]{3}$"`匹配如"AB12 XYZ"或"XY68 ABC"的车牌
- 可使用https://regex101.com/等网站测试正则表达式
### 匹配
- **`known_plates`**: 字符串或正则表达式列表,当识别到的车牌匹配已知值时,为`car`对象分配自定义`sub_label`
- 这些标签会显示在UI、过滤器和通知中
- 未知车牌仍会保存,但添加到`recognized_license_plate`字段而非`sub_label`
- **`match_distance`**: 允许在匹配检测到的车牌与已知车牌时有微小变化(缺失/错误字符)
- 例如设置`match_distance: 1`允许车牌`ABCDE`匹配`ABCBE`或`ABCD`
- 此参数不适用于定义为正则表达式的已知车牌。要使用`match_distance`,应在`known_plates`中定义车牌的完整字符串
### 图像增强
- **`enhancement`**: 0到10之间的值调整在识别前对捕获车牌应用的图像增强级别。此预处理步骤有时可提高准确性但也可能适得其反
- 默认: `0`(无增强)
- 较高值会增加对比度、锐化细节并减少噪点但过度增强会使字符模糊或失真实际上使Frigate更难识别
- 如果在多个摄像头上运行LPR最好在摄像头级别调整此设置
- 如果Frigate已能正确识别车牌保持此设置为默认值`0`。但如果经常遇到字符问题或不完整车牌而您自己已能轻松阅读车牌可尝试从5开始逐步增加此值。您应观察不同增强级别对车牌的影响。使用`debug_save_plates`配置选项(见下文)
### 调试
- **`debug_save_plates`**: 设为`True`保存检测到的车牌文字图像用于调试。这些图像存储在`/media/frigate/clips/lpr`,按`<摄像头>/<事件ID>`分子目录,基于捕获时间戳命名
- 这些保存的图像不是完整车牌而是检测到的文字区域。文字检测模型有时会在车牌上找到多个文字区域是正常的。用它们分析Frigate识别了什么文字以及图像增强如何影响检测
- 注意: Frigate不会自动删除这些调试图像。一旦LPR正常运行应禁用此选项并手动删除保存的文件以释放存储空间
## 配置示例
这些配置参数可在配置的全局层级使用。唯一应在摄像头级别设置的可选参数是`enabled`、`min_area`和`enhancement`。
```yaml
lpr:
enabled: True
min_area: 1500 # 忽略面积小于1500像素的车牌
min_plate_length: 4 # 仅识别4个或更多字符的车牌
known_plates:
Wife's Car:
- "ABC-1234"
- "ABC-I234" # 考虑数字1(1)和大写字母I可能混淆的情况
Johnny:
- "J*N-*234" # 匹配JHN-1234和JMN-I234注意"*"匹配任意数量字符
Sally:
- "[S5]LL 1234" # 匹配SLL 1234和5LL 1234
Work Trucks:
- "EMP-[0-9]{3}[A-Z]" # 匹配如EMP-123A, EMP-456Z的车牌
```
```yaml
lpr:
enabled: True
min_area: 4000 # 仅对较大车牌运行识别(4000像素代表图像中约63×63像素的正方形)
recognition_threshold: 0.85
format: "^[A-Z]{2} [A-Z][0-9]{4}$" # 仅识别两个字母后跟空格、单个字母和4个数字的车牌
match_distance: 1 # 允许车牌匹配中一个字符的变化
known_plates:
Delivery Van:
- "RJ K5678"
- "UP A1234"
Supervisor:
- "MN D3163"
```
:::note
如果想在摄像头上检测车辆但不想消耗资源在这些车辆上运行LPR应禁用这些特定摄像头的LPR。
```yaml
cameras:
side_yard:
lpr:
enabled: False
...
```
:::
## 专用LPR摄像头
专用LPR摄像头是具有强大光学变焦的单用途摄像头用于捕捉远处车辆的车牌通常具有精细调校的设置以在夜间捕捉车牌。
要将摄像头标记为专用LPR摄像头在摄像头配置中添加`type: "lpr"`。
用户可根据是否使用Frigate+(或原生`license_plate`检测)模型以两种不同方式配置Frigate的专用LPR模式
### 使用Frigate+(或原生`license_plate`检测)模型
使用Frigate+模型(或任何能原生检测`license_plate`的模型)的用户可利用`license_plate`检测功能。这使得车牌在专用LPR模式下被视为标准对象意味着警报、检测、快照、区域和其他Frigate功能正常工作车牌通过配置的对象检测器高效检测。
使用`license_plate`检测模型的专用LPR摄像头配置示例
```yaml
# LPR全局配置
lpr:
enabled: True
device: CPU # 也可用GPU(如果可用)
# 专用LPR摄像头配置
cameras:
dedicated_lpr_camera:
type: "lpr" # 必需以使用专用LPR摄像头模式
ffmpeg: ... # 添加您的流
detect:
enabled: True
fps: 5 # 如果车辆快速移动可增至10。高于15不必要也不推荐
min_initialized: 2
width: 1920
height: 1080
objects:
track:
- license_plate
filters:
license_plate:
threshold: 0.7
motion:
threshold: 30
contour_area: 60 # 使用增大值过滤小的运动变化
improve_contrast: false
mask: 0.704,0.007,0.709,0.052,0.989,0.055,0.993,0.001 # 确保摄像头时间戳被遮罩
record:
enabled: True # 如果只想要快照可禁用录制
snapshots:
enabled: True
review:
detections:
labels:
- license_plate
```
此设置下:
- 车牌被视为Frigate中的正常对象
- 分数、警报、检测、快照、区域和对象遮罩按预期工作
- 快照上会有车牌边界框
- MQTT主题`frigate/events`会发布跟踪对象更新
- 调试视图会显示`license_plate`边界框
- 如果使用Frigate+模型并想提交专用LPR摄像头图像用于模型训练和微调在Frigate+网站上标注快照中的`car`和`license_plate`,即使车辆几乎不可见
### 使用次级LPR管道(无Frigate+)
如果没有使用Frigate+模型可使用Frigate内置的次级专用LPR管道。在此模式下Frigate绕过标准对象检测管道在检测到运动时对全帧运行本地车牌检测器模型。
使用次级管道的专用LPR摄像头配置示例
```yaml
# LPR全局配置
lpr:
enabled: True
device: CPU # 也可用GPU(如果可用)
detection_threshold: 0.7 # 必要时更改
# 专用LPR摄像头配置
cameras:
dedicated_lpr_camera:
type: "lpr" # 必需以使用专用LPR摄像头模式
lpr:
enabled: True
enhancement: 3 # 可选,在尝试识别字符前增强图像
ffmpeg: ... # 添加您的流
detect:
enabled: False # 禁用Frigate标准对象检测管道
fps: 5 # 必要时增加但高值可能减慢Frigate增强管道并使用大量CPU
width: 1920
height: 1080
objects:
track: [] # 无Frigate+模型的专用LPR模式必需
motion:
threshold: 30
contour_area: 60 # 使用增大值过滤小的运动变化
improve_contrast: false
mask: 0.704,0.007,0.709,0.052,0.989,0.055,0.993,0.001 # 确保摄像头时间戳被遮罩
record:
enabled: True # 如果只想要快照可禁用录制
review:
detections:
enabled: True
retain:
default: 7
```
此设置下:
- 绕过标准对象检测管道。专用LPR摄像头上检测到的任何车牌在Frigate中类似于手动事件处理。您必须不指定`license_plate`作为跟踪对象
- 检测到运动时,车牌检测器在全帧上运行,并根据检测`fps`设置处理帧
- Review项目始终分类为`detection`
- 始终保存快照
- 不使用区域和对象遮罩
- MQTT主题`frigate/events`不会发布带车牌边界框和分数的跟踪对象更新,但如果启用录制,`frigate/reviews`会发布。如果识别为已知车牌,会发布带更新`sub_label`字段的消息;如果识别出字符,会发布带更新`recognized_license_plate`字段的消息
- 车牌快照在得分最高时刻保存并出现在Explore中
- 调试视图不显示`license_plate`边界框
### 总结
| 功能 | 原生`license_plate`检测模型(如Frigate+) | 次级管道(无原生模型或Frigate+) |
|----------------------|----------------------------------------|------------------------------------------|
| 车牌检测 | 使用`license_plate`作为跟踪对象 | 运行专用LPR管道 |
| FPS设置 | 5(快速移动车辆可增加) | 5(快速移动车辆可增加但可能使用更多CPU) |
| 对象检测 | 应用标准Frigate+检测 | 绕过标准对象检测 |
| 区域和对象遮罩 | 支持 | 不支持 |
| 调试视图 | 可能显示`license_plate`边界框 | 可能不显示`license_plate`边界框 |
| MQTT `frigate/events` | 发布跟踪对象更新 | 发布有限更新 |
| Explore | 识别的车牌在More Filters中可用 | 识别的车牌在More Filters中可用 |
通过选择适当的配置用户可根据是否使用Frigate+模型或次级LPR管道优化专用LPR摄像头。
### 使用专用LPR摄像头模式的最佳实践
- 调整运动检测并增加`contour_area`,直到只有车辆通过时创建较大的运动框(对于1920×1080检测流可能在50-90之间)。增加`contour_area`过滤小的运动区域,防止在没有车辆通过的帧中寻找车牌浪费资源
- 禁用`improve_contrast`运动设置特别是在夜间运行LPR且画面大部分黑暗时。这将防止小像素变化和小的运动区域触发车牌检测
- 确保用运动遮罩覆盖摄像头时间戳,防止其被误检测为车牌
- 对于非Frigate+用户,可能需要更改摄像头设置以获得更清晰的图像,或如果夜间车牌识别不准确,降低全局`recognition_threshold`配置
- 次级管道模式在CPU或GPU(取决于`device`配置)上运行本地AI模型检测车牌。增加检测`fps`将按比例增加资源使用
## 常见问题
### 为什么我的车牌没有被检测和识别?
确保:
- 摄像头有清晰、人眼可读、光照良好的车牌视图。如果您自己都看不清车牌字符Frigate肯定也做不到即使模型识别到了`license_plate`。根据场景和车辆速度,可能需要更改视频大小、质量或帧率设置
- 车牌在图像中足够大(尝试调整`min_area`)或增加摄像头流的分辨率
- 您的`enhancement`级别(如果已从默认值`0`更改)不过高。过度增强会进行过多降噪,导致车牌字符模糊难读
如果使用Frigate+模型或自定义车牌检测模型,确保在跟踪对象列表

View File

@ -0,0 +1,242 @@
---
id: live
title: 实时视图
---
Frigate智能地在实时视图仪表板上显示您的摄像头流。默认情况下Frigate采用"智能流媒体"技术,当没有检测到活动时,摄像头图像每分钟更新一次以节省带宽和资源。一旦检测到任何运动或活动对象,摄像头会无缝切换到实时流。
### 实时视图技术
Frigate智能地使用三种不同的流媒体技术在仪表板和单摄像头视图上显示您的摄像头流根据网络带宽、播放器错误或双向通话等功能需求在不同可用模式间切换。要获得最高质量和流畅度的实时视图需要按照[逐步指南](/guides/configuring_go2rtc)配置内置的`go2rtc`。
jsmpeg实时视图会消耗更多浏览器和客户端GPU资源。强烈推荐使用go2rtc它能提供更优质的体验。
| 来源 | 帧率 | 分辨率 | 音频 | 需要go2rtc | 说明 |
| ---- | --------------------------------- | ------ | ---------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| jsmpeg | 与`detect -> fps`相同上限10fps | 720p | 无 | 否 | 分辨率可配置但如需更高分辨率和更好帧率推荐使用go2rtc。未配置go2rtc时是Frigate的默认选项。 |
| mse | 原生 | 原生 | 是(取决于音频编解码器) | 是 | iPhone需要iOS 17.1+Firefox仅支持h.264。配置go2rtc后是Frigate的默认选项。 |
| webrtc | 原生 | 原生 | 是(取决于音频编解码器) | 是 | 需要额外配置不支持h.265。当MSE失败或使用摄像头双向通话功能时Frigate会尝试使用WebRTC。 |
### 摄像头设置建议
如果使用go2rtc应在摄像头固件中调整以下设置以获得最佳实时视图体验
- 视频编解码器:**H.264** - 提供与所有实时视图技术和浏览器最兼容的视频编解码器。避免使用任何"智能编解码器"或"+"编解码器如_H.264+_或_H.265+_这些非标准编解码器会移除关键帧(见下文)。
- 音频编解码器:**AAC** - 提供与所有支持音频的实时视图技术和浏览器最兼容的音频编解码器。
- I帧间隔(有时称为关键帧间隔、帧间空间或GOP长度):匹配摄像头的帧率,或选择"1x"(对于Reolink摄像头的帧间空间)。例如如果您的流输出20fpsI帧间隔应为20(或Reolink上的1x)。高于帧率的值会导致流开始播放时间更长。有关关键帧的更多信息,请参阅[此页面](https://gardinal.net/understanding-the-keyframe-interval/)。对于许多用户来说这可能不是问题但应注意1x I帧间隔会导致更多存储使用(如果同时将该流用于`record`角色)。
摄像头的默认视频和音频编解码器可能不总是与您的浏览器兼容这就是为什么建议将它们设置为H.264和AAC。有关编解码器支持信息请参阅[go2rtc文档](https://github.com/AlexxIT/go2rtc?tab=readme-ov-file#codecs-madness)。
### 音频支持
MSE需要PCMA/PCMU或AAC音频WebRTC需要PCMA/PCMU或opus音频。如果想同时支持MSE和WebRTC则需要在重流配置中确保两者都启用。
```yaml
go2rtc:
streams:
rtsp_cam: # <- RTSP流
- rtsp://192.168.1.5:554/live0 # <- 支持视频和AAC音频的流
- "ffmpeg:rtsp_cam#audio=opus" # <- 将音频转码为缺失编解码器(通常是opus)的流副本
http_cam: # <- HTTP流
- http://192.168.50.155/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=user&password=password # <- 支持视频和AAC音频的流
- "ffmpeg:http_cam#audio=opus" # <- 将音频转码为缺失编解码器(通常是opus)的流副本
```
如果摄像头不支持AAC音频或实时视图有问题尝试直接转码为AAC音频
```yaml
go2rtc:
streams:
rtsp_cam: # <- RTSP流
- "ffmpeg:rtsp://192.168.1.5:554/live0#video=copy#audio=aac" # <- 复制视频流并将音频转码为AAC
- "ffmpeg:rtsp_cam#audio=opus" # <- 提供WebRTC支持
```
如果摄像头没有音频且实时视图有问题应让go2rtc仅发送视频
```yaml
go2rtc:
streams:
no_audio_camera:
- ffmpeg:rtsp://192.168.1.5:554/live0#video=copy
```
### 为实时页面设置视频流
可以配置Frigate允许手动选择要在实时页面中查看的视频流。例如您可能想在移动设备上查看摄像头的子流而在桌面设备上查看全分辨率流。设置`live -> streams`列表将在页面的实时视图中填充一个下拉菜单让您可以选择不同的流。此流设置是_每设备_的并保存在浏览器的本地存储中。
此外,在界面中创建和编辑摄像头组时,可以选择要用于摄像头组实时仪表板的视频流。
:::note
Frigate的默认仪表板("所有摄像头")在播放摄像头实时流时将始终使用您在`streams:`中定义的第一个条目。
:::
使用"友好名称"后跟go2rtc流名称来配置`streams`选项。
使用Frigate内置版本的go2rtc是使用此功能的必要条件。不能在`streams`配置中指定路径只能指定go2rtc流名称。
```yaml
go2rtc:
streams:
test_cam:
- rtsp://192.168.1.5:554/live_main # <- 支持视频和AAC音频的流
- "ffmpeg:test_cam#audio=opus" # <- 将音频转码为opus以支持webrtc的流副本
test_cam_sub:
- rtsp://192.168.1.5:554/live_sub # <- 支持视频和AAC音频的流
test_cam_another_sub:
- rtsp://192.168.1.5:554/live_alt # <- 支持视频和AAC音频的流
cameras:
test_cam:
ffmpeg:
output_args:
record: preset-record-generic-audio-copy
inputs:
- path: rtsp://127.0.0.1:8554/test_cam # <--- 这里的名称必须与重流中的摄像头名称匹配
input_args: preset-rtsp-restream
roles:
- record
- path: rtsp://127.0.0.1:8554/test_cam_sub # <--- 这里的名称必须与重流中的camera_sub名称匹配
input_args: preset-rtsp-restream
roles:
- detect
live:
streams: # <--- Frigate 0.16及更高版本支持多流
主流: test_cam # <--- 指定"友好名称"后跟go2rtc流名称
子流: test_cam_sub
特殊流: test_cam_another_sub
```
### WebRTC额外配置
WebRTC通过在端口`8555`上创建TCP或UDP连接工作。但是它需要额外配置
- 对于外部访问(通过互联网),设置路由器将端口`8555`(TCP和UDP)转发到Frigate设备的端口`8555`。
- 对于内部/本地访问除非通过HA插件运行否则还需要在go2rtc配置中设置WebRTC候选列表。例如如果`192.168.1.10`是运行Frigate设备的本地IP
```yaml title="config.yml"
go2rtc:
streams:
test_cam: ...
webrtc:
candidates:
- 192.168.1.10:8555
- stun:8555
```
- 对于通过Tailscale的访问必须将Frigate系统的Tailscale IP添加为WebRTC候选。Tailscale IP都以`100.`开头,并保留在`100.64.0.0/10` CIDR块中。
- 注意WebRTC不支持H.265。
:::tip
如果Frigate已作为Home Assistant插件安装可能不需要此额外配置因为Frigate使用Supervisor的API生成WebRTC候选。
但是如果出现问题建议手动定义候选。如果Frigate插件未能生成有效候选您应该这样做。如果发生错误您将在初始化期间的插件日志页面中看到类似以下的警告
```log
[WARN] 无法从supervisor获取IP地址
[WARN] 无法从supervisor获取WebRTC端口
```
:::
:::note
如果在让WebRTC工作时遇到困难并且您正在使用docker运行Frigate可以尝试更改容器网络模式
- `network: host`在此模式下不需要转发任何端口。Frigate容器内的服务将完全访问主机机器的网络接口就像它们原生运行而不是在容器中一样。任何端口冲突都需要解决。go2rtc推荐此网络模式但我们建议仅在必要时使用。
- `network: bridge`是默认网络驱动程序桥接网络是转发网络段间流量的链路层设备。需要转发任何希望从主机IP访问的端口。
如果不在主机模式下运行需要为容器映射端口8555
docker-compose.yml
```yaml
services:
frigate:
...
ports:
- "8555:8555/tcp" # WebRTC over tcp
- "8555:8555/udp" # WebRTC over udp
```
:::
有关更多信息,请参阅[go2rtc WebRTC文档](https://github.com/AlexxIT/go2rtc/tree/v1.8.3#module-webrtc)。
### 双向通话
对于支持双向通话的设备可以配置Frigate从Web UI的摄像头实时视图中使用该功能。您应该
- 设置go2rtc与[WebRTC](#webrtc-extra-configuration)。
- 确保通过https访问Frigate(可能需要[打开端口8971](/frigate/installation/#端口))。
- 对于Home Assistant Frigate卡片[按照文档](https://github.com/dermotduffy/frigate-hass-card?tab=readme-ov-file#using-2-way-audio)获取正确的源。
要使用Reolink门铃的双向通话应使用[推荐的Reolink配置](/configuration/camera_specific#reolink摄像头)
### 摄像头组仪表板上的流媒体选项
Frigate在摄像头组编辑面板中提供了一个对话框其中包含几个用于摄像头组仪表板上流媒体的选项。这些设置是_每设备_的并保存在您设备的本地存储中。
- 使用`live -> streams`配置选项选择流(见上文_为实时UI设置流_)
- 流媒体类型:
- _无流媒体_:摄像头图像每分钟仅更新一次,不会进行实时流媒体。
- _智能流媒体_(默认,推荐设置):当没有检测到活动时,智能流媒体每分钟更新一次摄像头图像以节省带宽和资源,因为静态图像与没有运动或对象的流媒体图像相同。当检测到运动或对象时,图像无缝切换到实时流。
- _连续流媒体_:当在仪表板上可见时,摄像头图像始终是实时流,即使没有检测到活动。连续流媒体可能导致高带宽使用和性能问题。**谨慎使用。**
- _兼容模式_:仅当摄像头的实时流显示颜色伪影且图像右侧有对角线时才启用此选项。在启用之前,尝试将摄像头的`detect`宽度和高度设置为标准宽高比(例如640x352变为640x360800x443变为800x4502688x1520变为2688x1512等)。根据您的浏览器和设备,可能不支持同时使用兼容模式的多个摄像头,因此只有在更改配置无法解决颜色伪影和对角线时才使用此选项。
:::note
默认仪表板("所有摄像头")将始终使用智能流媒体和您在`streams`配置中设置的第一个条目(如果已定义)。如果想更改这些默认设置中的任何一个,请使用摄像头组。
:::
### 禁用摄像头
可以通过Frigate页面和[MQTT](/integrations/mqtt#frigatecamera_nameenabledset)临时禁用摄像头以节省系统资源。禁用时Frigate的ffmpeg进程终止 - 停止录制暂停对象检测实时仪表板显示禁用消息的空白图像。仍可通过UI访问禁用摄像头的回放条目、追踪对象和历史录像。
对于重流摄像头go2rtc保持活动状态但除非有外部客户端使用(如Home Assistant中的高级摄像头卡片使用go2rtc源),否则不会使用系统资源进行解码或处理。
注意通过配置文件禁用摄像头(`enabled: False`)会移除所有相关UI元素包括历史录像访问。要保留访问权限同时禁用摄像头请在配置中保持启用状态并使用UI或MQTT临时禁用它。
## 实时视图常见问题
1. **为什么我的实时视图中没有音频?**
必须使用go2rtc才能在实时流中听到音频。如果已配置go2rtc需要确保摄像头发送PCMA/PCMU或AAC音频。如果无法更改摄像头的音频编解码器需要使用go2rtc[转码音频](https://github.com/AlexxIT/go2rtc?tab=readme-ov-file#source-ffmpeg)。
请注意低带宽模式播放器是仅视频流。即使已设置go2rtc也不应期望在低带宽模式下听到音频。
2. **Frigate显示我的实时流处于"低带宽模式"。这是什么意思?**
Frigate根据多种因素(用户选择的模式如双向通话、摄像头设置、浏览器功能、可用带宽)智能选择实时流媒体技术,并优先尽可能快地显示摄像头流的最新实时视图。
配置go2rtc后实时视图最初尝试使用更清晰、流畅的流媒体技术(MSE)加载和播放流。初始超时、会导致流缓冲的低带宽条件或流中的解码错误将导致Frigate切换到由`detect`角色定义的流使用jsmpeg格式。这就是UI标记为"低带宽模式"的内容。在实时仪表板上当配置智能流媒体且活动停止时模式会自动重置。连续流媒体模式没有自动重置机制但可以使用_重置_选项强制重新加载流。
如果使用连续流媒体或在仪表板上同时加载多个高分辨率流浏览器可能在超时前难以开始播放流。Frigate始终优先尽可能快地显示实时流即使是较低质量的jsmpeg流。可以使用"重置"链接/按钮尝试再次加载高分辨率流。
如果Frigate仍然回退到低带宽模式可能需要根据[上述建议](#camera_settings_recommendations)调整摄像头设置。
3. **我的摄像头似乎没有在实时仪表板上实时播放。为什么?**
在默认实时仪表板("所有摄像头")上,当没有检测到活动时,摄像头图像每分钟更新一次以节省带宽和资源。一旦检测到任何活动,摄像头无缝切换到全分辨率实时流。如果想自定义此行为,请使用摄像头组。
4. **我在实时视图上看到一条奇怪的对角线,但我的录像看起来很好。如何修复?**
这是由于`detect`宽度或高度设置不正确(或自动检测不正确)导致的导致jsmpeg播放器的渲染引擎显示略微失真的图像。应将`detect`分辨率放大到标准宽高比(例如640x352变为640x360800x443变为800x4502688x1520变为2688x1512等)。如果将分辨率更改为匹配标准(4:3、16:9或32:9等)宽高比无法解决问题,可以在摄像头组仪表板的流设置中启用"兼容模式"。根据您的浏览器和设备,可能不支持同时使用兼容模式的多个摄像头,因此只有在更改`detect`宽度和高度无法解决颜色伪影和对角线时才使用此选项。
5. **"智能流媒体"如何工作?**
因为场景的静态图像看起来与没有运动或活动的实时流完全相同,智能流媒体在没有检测到活动时每分钟更新一次摄像头图像以节省带宽和资源。一旦发生任何活动(运动或对象/音频检测),摄像头无缝切换到实时流。
此静态图像从配置中`detect`角色定义的流中提取。当检测到活动时,`detect`流的图像立即开始以约5帧/秒的速度更新以便您可以看到活动直到实时播放器加载并开始播放。这通常只需要一两秒钟。如果实时播放器超时、缓冲或有流媒体错误则加载jsmpeg播放器并从`detect`角色播放仅视频流。当活动结束时,销毁播放器并显示静态图像,直到再次检测到活动,然后重复此过程。
智能流媒体依赖于正确调整摄像头的运动`threshold`和`contour_area`配置值。使用UI设置中的运动调谐器实时调整这些值。
这是Frigate的默认和推荐设置因为它能显著节省带宽特别是对于高分辨率摄像头。
6. **我已取消静音某些仪表板上的摄像头,但听不到声音。为什么?**
如果您的摄像头正在流媒体(如右上角的红点所示,或设置为连续流媒体模式),您的浏览器可能会在您与页面交互前阻止音频播放。这是浏览器有意设计的限制。详见[这篇文章](https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide#autoplay_availability)。许多浏览器都有白名单功能可以更改此行为。

View File

@ -0,0 +1,85 @@
---
id: masks
title: 遮罩功能
---
## 运动遮罩
运动遮罩用于防止不需要的运动类型触发检测。可以打开调试视图(设置 --> 调试)并启用"运动框"选项观察哪些区域经常被误检测为运动。例如您可能需要遮罩掉时间戳、天空、屋顶等区域。请注意这种遮罩仅阻止运动检测如果对象检测是由未遮罩区域的运动触发的它不会阻止对象被检测到。运动信息也会在对象追踪过程中用于优化下一帧的对象检测区域。_过度使用遮罩会使对象追踪变得更加困难。_
关于为何可能不需要使用运动遮罩的[进一步说明](#进一步说明)见下文。
## 对象过滤遮罩
对象过滤遮罩用于根据位置过滤特定对象类型的误报。这些遮罩应该用于过滤掉不可能出现某类对象的区域。系统会评估检测对象边界框的底部中心点是否位于遮罩区域内。如果在遮罩区域内则会被视为误报。例如您可能需要对人物检测遮罩屋顶、墙壁、天空、树顶等区域。对于车辆遮罩掉街道或车道以外的区域可以告诉Frigate院子里的任何检测都是误报。
对象过滤遮罩可用于过滤固定位置顽固的误报。例如,某棵树的底部可能经常被误检测为人。下图展示了一个对象过滤遮罩示例(红色阴影区域),覆盖了通常检测到底部中心点的位置,以精确过滤该位置的人物检测。
![对象遮罩](/img/bottom-center-mask.jpg)
## 使用遮罩创建工具
创建多边形遮罩的步骤:
1. 访问Web界面
2. 点击齿轮图标打开"设置"
3. 选择"遮罩/区域编辑器"
4. 在右上角选择要创建遮罩或区域的摄像头
5. 点击要创建的遮罩或区域类型下的加号图标
6. 在摄像头最新画面上点击创建遮罩区域的多边形顶点。点击第一个顶点闭合多边形。
7. 完成遮罩创建后,点击保存
8. 重启Frigate应用更改
配置文件将更新为遮罩/区域的相对坐标:
```yaml
motion:
mask: "0.000,0.427,0.002,0.000,0.999,0.000,0.999,0.781,0.885,0.456,0.700,0.424,0.701,0.311,0.507,0.294,0.453,0.347,0.451,0.400"
```
配置中可以列出多个遮罩:
```yaml
motion:
mask:
- 0.239,1.246,0.175,0.901,0.165,0.805,0.195,0.802
- 0.000,0.427,0.002,0.000,0.999,0.000,0.999,0.781,0.885,0.456
```
### 进一步说明
这是对[Reddit上提出问题](https://www.reddit.com/r/homeautomation/comments/ppxdve/replacing_my_doorbell_with_a_security_camera_a_6/hd876w4?utm_source=share&utm_medium=web2x&context=3)的回应:
了解Frigate如何结合使用运动检测和对象检测会很有帮助。
首先Frigate使用运动检测作为初步检查判断画面中是否有值得进行对象检测的活动。
一旦检测到运动,它会尝试将附近的运动区域分组,希望能识别出画面中值得检测的矩形区域。这些就是您在调试视图中看到的红色"运动框"。
确定运动区域后Frigate会创建一个"区域"(调试视图中的绿色框)来运行对象检测。模型是在方形图像上训练的,所以这些区域总是正方形。它会在运动区域周围添加边距,希望能捕捉到填充大部分检测图像的运动对象裁剪视图,同时不会切断任何部分。如果正在追踪对象,它还会考虑前一帧边界框的位置。
运行对象检测后如果检测到似乎被切断的对象Frigate会重新调整区域并在同一帧上再次运行对象检测以获得更好的视角。
所有这些处理都会针对每个运动区域和追踪对象进行。
> 您是否只是说任何类型的检测的初始触发只会发生在未遮罩区域,但一旦触发发生,遮罩就变得无关紧要,对象检测优先?
基本上是的。不过我不会描述为对象检测优先。运动遮罩只是阻止这些区域被计为运动。这些遮罩不会以任何方式修改传递给对象检测的区域,因此您绝对可以在运动遮罩区域中检测到对象。
> 如果是这样,这对我来说是完全预期和直观的行为。因为显然如果一只"脚"开始运动检测,相机应该能够检查它是否是一个完整的人,然后它完全进入区域。文档暗示这是行为,所以我也不能理解为什么这总体上对对象检测有害。
当只有一只脚触发运动时Frigate会放大并只查看这只脚。如果这甚至符合一个人的特征它会确定对象被切断并再次查看直到放大到足以找到整个人。
这对Frigate追踪移动对象的方式也有害。前一帧边界框附近的运动用于智能确定下一帧中区域应该在哪里。遮罩过多会阻碍追踪如果对象从未遮罩区域进入完全遮罩区域它们基本上会消失如果离开遮罩区域将被视为"新"对象。这很重要因为Frigate在追踪对象时使用分数历史记录来判断是否是误报。Frigate至少需要3帧才能确定它认为的对象类型且中位数分数必须大于阈值。如果一个人在进入您的门廊前在人行道上达到此阈值您将在他们单脚踏入区域的瞬间收到警报。
> 我认为这个功能的主要目的是减少不必要区域发生运动时的CPU使用。
是的,但"不必要"的定义各不相同。我想忽略那些我知道绝对不是由感兴趣对象触发的运动区域。时间戳、树木、天空、屋顶。我不想忽略我想要追踪并知道去向的对象的运动。
> 对我来说,给我的遮罩任何填充都会导致很多我不感兴趣的人物检测。我住在城市里,相机捕捉到很多人行道。人们经常走过我的前门,人行道和实际走上我的门廊之间的边缘非常薄,所以我基本上遮罩掉了门廊精确轮廓之外的所有区域。这导致非常整洁的检测,但这些信息一直让我困惑。我只是想太多了吗?
这就是`必需区域`的用途。您应该定义一个区域记住这是基于边界框底部中心评估的并将其设为保存快照和片段所必需的在0.9.0到0.13.0中称为事件在0.14.0及以后称为回放条目)。您也可以在通知条件中使用它。
> 也许我的具体情况就需要这样。我一直很难理解这些信息的相关性 - 似乎这正是"遮罩"任何图像区域时所期望的。
对您来说可能是这样。Frigate肯定会更努力地追踪人行道上的人以确保不会错过任何踏上您门廊的人。您现在的方式的权衡是对象识别速度较慢和可能的遗漏。根据您的需求这可能是可以接受的。此外如果您的检测流分辨率足够低您的区域可能已经足够大可以直接捕捉整个对象。

View File

@ -0,0 +1,99 @@
---
id: metrics
title: 监控指标
---
# 监控指标
Frigate 在 `/api/metrics` 端点提供 Prometheus 格式的监控指标,可用于监测 Frigate 实例的性能和运行状态。
## 可用指标
### 系统指标
- `frigate_cpu_usage_percent{pid="", name="", process="", type="", cmdline=""}` - 进程CPU使用率百分比
- `frigate_mem_usage_percent{pid="", name="", process="", type="", cmdline=""}` - 进程内存使用率百分比
- `frigate_gpu_usage_percent{gpu_name=""}` - GPU利用率百分比
- `frigate_gpu_mem_usage_percent{gpu_name=""}` - GPU显存使用率百分比
### 摄像头指标
- `frigate_camera_fps{camera_name=""}` - 摄像头帧率
- `frigate_detection_fps{camera_name=""}` - 每秒检测次数
- `frigate_process_fps{camera_name=""}` - 每秒处理帧数
- `frigate_skipped_fps{camera_name=""}` - 每秒跳过的帧数
- `frigate_detection_enabled{camera_name=""}` - 摄像头检测功能启用状态
- `frigate_audio_dBFS{camera_name=""}` - 音频dBFS值
- `frigate_audio_rms{camera_name=""}` - 音频RMS值
### 检测器指标
- `frigate_detector_inference_speed_seconds{name=""}` - 目标检测耗时(秒)
- `frigate_detection_start{name=""}` - 检测器启动时间(Unix时间戳)
### 存储指标
- `frigate_storage_free_bytes{storage=""}` - 存储剩余空间(字节)
- `frigate_storage_total_bytes{storage=""}` - 存储总容量(字节)
- `frigate_storage_used_bytes{storage=""}` - 存储已用空间(字节)
- `frigate_storage_mount_type{mount_type="", storage=""}` - 存储挂载类型信息
### 服务指标
- `frigate_service_uptime_seconds` - 服务运行时间(秒)
- `frigate_service_last_updated_timestamp` - 指标更新时间(Unix时间戳)
- `frigate_device_temperature{device=""}` - 设备温度
### 事件指标
- `frigate_camera_events{camera="", label=""}` - 自指标收集器启动以来的摄像头事件计数
## Prometheus配置
在Prometheus中添加以下配置来收集Frigate指标
```yaml
scrape_configs:
- job_name: 'frigate'
metrics_path: '/api/metrics'
static_configs:
- targets: ['frigate:5000']
scrape_interval: 15s
```
## 查询示例
以下是几个实用的PromQL查询示例
```promql
# 所有进程的平均CPU使用率
avg(frigate_cpu_usage_percent)
# GPU显存总使用率
sum(frigate_gpu_mem_usage_percent)
# 指定摄像头的检测帧率(5分钟滑动窗口)
rate(frigate_detection_fps{camera_name="前门摄像头"}[5m])
# 存储空间使用百分比
(frigate_storage_used_bytes / frigate_storage_total_bytes) * 100
# 过去1小时各摄像头的事件计数
increase(frigate_camera_events[1h])
```
## Grafana仪表板
您可以使用这些指标创建Grafana仪表板来监控Frigate实例建议监控以下内容
- CPU、内存和GPU使用率趋势
- 摄像头帧率和检测频率
- 存储空间使用情况和趋势
- 各摄像头事件计数
- 系统温度监控
我们将在后续更新中提供示例Grafana仪表板的JSON配置。
## 指标类型
Frigate提供的指标采用以下Prometheus指标类型
- **计数器(Counter)**:只增不减的累计值(如`frigate_camera_events`)
- **仪表盘(Gauge)**:可升降的瞬时值(如`frigate_cpu_usage_percent`)
- **信息(Info)**:用于元数据的键值对(如`frigate_storage_mount_type`)
有关Prometheus指标类型的更多信息请参阅[Prometheus官方文档](https://prometheus.io/docs/concepts/metric_types/)。

View File

@ -0,0 +1,105 @@
---
id: motion_detection
title: 运动检测
---
# 调优运动检测
Frigate使用运动检测作为第一道检查判断画面中是否有值得进行物体检测的活动。
一旦检测到运动,它会尝试将附近的运动区域分组,希望能识别出画面中值得检测的矩形区域。这些就是您在调试视图中看到的红色"运动框"。
## 目标
默认的运动设置应该适用于大多数摄像头,但在某些情况下,调优运动检测可以获得更好更优化的结果。每个摄像头都有不同的环境变量会影响运动检测,这意味着相同的运动设置并不适用于所有摄像头。
在调优运动检测前理解目标很重要。在最优配置中应该能检测到人和车的运动但不会检测到草叶摇动、光线变化、时间戳等。如果运动检测过于敏感您会遇到更高的CPU负载和更多的误报。如果不够敏感您会错过想要追踪的对象。
## 创建运动遮罩
首先,屏蔽那些由您不想检测的对象引起的常规运动区域。找到运动遮罩候选区域的最佳方法是观看启用了运动框的调试流。运动遮罩的典型用例包括时间戳或经常因风移动的树枝和大灌木。尽可能避免创建会阻挡您想要追踪的对象的运动遮罩,即使这些对象位于您不想要警报或检测的区域。运动遮罩不应该用于避免在特定区域检测对象。更多细节请参阅[遮罩文档](/configuration/masks.md)。
## 准备测试
调优运动检测最简单的方法是使用Frigate UI中的"设置 > 运动调优器"。这个界面允许实时更改运动检测值,方便立即看到对检测结果的影响。
## 白天调优运动检测
现在一切准备就绪,找一个代表正常情况的时间进行调优。例如,如果您在阳光明媚且有风的日子调优运动检测,可能会发现后来在多云无风的日子里运动设置不够敏感。
:::note
记住运动检测仅用于决定何时应该使用物体检测。您的目标应该是让运动检测足够敏感,不会错过您想要用物体检测的对象。目的是防止物体检测为画面中的每个微小像素变化而持续运行。大风天仍然会导致检测到大量运动。
:::
### 阈值
阈值决定了一个像素的亮度需要变化多少才会被视为运动。
```yaml
# 默认阈值
motion:
# 可选传递给cv2.threshold的值用于确定像素变化是否足够大被视为运动(默认如下)
# 增加此值会使运动检测不那么敏感,减少则会使运动检测更敏感
# 值应在1到255之间
threshold: 30
```
较低的值意味着运动检测对颜色变化更敏感,例如当棕色狗与棕色栅栏混在一起,或穿红衬衫的人与红色汽车混在一起时更容易检测到运动。但如果阈值太低,可能会检测到草叶摇动、阴影等变化。
观察调试视图中的运动框,增加阈值直到只看到肉眼可见的运动。完成后,重要的是测试并确保仍能检测到需要的运动。
### 轮廓面积
```yaml
# 默认轮廓面积
motion:
# 可选:在调整大小的运动图像中视为运动的最小像素尺寸(默认如下)
# 增加此值会阻止检测较小的运动区域
# 减少会使运动检测对小移动物体更敏感
# 经验法则:
# - 10 - 高灵敏度
# - 30 - 中等灵敏度
# - 50 - 低灵敏度
contour_area: 10
```
运行阈值计算后,将变化的像素分组。轮廓面积值用于决定哪些像素组有资格被视为运动。较小的值更敏感,意味着远处的人、小动物等更可能被检测为运动,但也意味着阴影、树叶等的微小变化会被检测为运动。较大的值不太敏感,意味着这些不会被检测为运动,但风险是需要的运动可能要到物体更靠近摄像头时才会被检测到。
观察调试视图中的运动框调整轮廓面积直到没有比您期望Frigate检测到的最小运动更小的运动框。
### 改善对比度
如果此时运动检测如预期工作,则无需继续白天的调优。如果无法在检测到需要的运动和不需要的运动之间找到平衡,可以尝试禁用改善对比度并回到阈值和轮廓面积步骤。
## 夜间调优运动检测
一旦白天运动检测调优完成,这些设置可能也适用于夜间运动检测。如果是这种情况,可以将首选设置写入配置文件并保持不变。
然而如果白天的首选设置在夜间效果不佳建议使用Home Assistant或其他解决方案来自动更改设置。这样可以为白天和夜间运动检测使用完全不同的设置组。
## 调优大范围运动变化
```yaml
# 默认闪电阈值
motion:
# 可选:用于检测闪电或其他需要重新校准运动检测的实质性变化的图像百分比(默认如下)
# 增加此值会使运动检测更可能将闪电或红外模式变化视为有效运动
# 减少此值会使运动检测更可能忽略大量运动,如有人接近门铃摄像头
lightning_threshold: 0.8
```
:::warning
某些像门铃摄像头这样的设备,当有人直接走到摄像头前时,可能会因为闪电阈值导致运动检测重新校准而错过检测。在这种情况下,可能需要增加`lightning_threshold`以确保不会错过这些对象。
:::
:::note
闪电阈值不会阻止基于运动的录像被保存。
:::
像PTZ移动和摄像头在彩色与红外模式间切换这样的大范围运动变化应该不会导致运动检测。这是通过`lightning_threshold`配置实现的。它定义为用于检测闪电或其他需要运动检测重新校准的实质性变化的图像百分比。增加此值会使运动检测更可能将闪电或红外模式变化视为有效运动。减少此值会使运动检测更可能忽略大量运动,如有人接近门铃摄像头。

View File

@ -0,0 +1,75 @@
---
id: notifications
title: 通知功能
---
# 通知功能
:::warning
注意受限于Google相关服务在中国大陆地区被屏蔽该功能可能**无法在中国大陆地区使用**。
如有手机通知的需求建议使用MQTT配合Home Assistant 通知功能。
:::
Frigate 采用 [WebPush 协议](https://web.dev/articles/push-notifications-web-push-protocol)实现原生通知功能,该协议使用 [VAPID 规范](https://tools.ietf.org/html/draft-thomson-webpush-vapid)通过加密方式向网页应用推送通知。
## 设置通知功能
使用通知功能需满足以下条件:
- 必须通过安全的 `https` 连接访问 Frigate参见[认证文档](/configuration/authentication)
- 需使用支持的浏览器(目前已知 Chrome、Firefox 和 Safari 支持)
- 如需外部接收通知Frigate 必须可从外部访问
- iOS 设备需在「设置 > Safari > 高级 > 实验性功能」中启用通知权限
### 配置方法
1. 访问 Frigate 网页界面:设置 > 通知
2. 启用通知功能并填写相关字段
3. 保存配置
可通过配置文件修改默认通知冷却时间(单位:秒),该参数也可按摄像头单独设置。
以下情况将阻止通知发送:
- 全局冷却时间内收到过任意摄像头的通知
- 特定摄像头的冷却时间未结束
```yaml
notifications:
enabled: True
email: "johndoe@gmail.com"
cooldown: 10 # 全局冷却时间10秒
```
```yaml
cameras:
doorbell:
...
notifications:
enabled: True
cooldown: 30 # 该摄像头单独设置30秒冷却
```
### 设备注册
启用通知后,需在所有接收设备上点击「注册通知」按钮,注册后台工作进程。完成后重启 Frigate 即可开始接收通知。
## 支持的通知类型
当前仅支持回放警报通知,更多类型将在未来版本中添加。
:::note
目前仅 Chrome 支持带图片的通知Safari 和 Firefox 仅显示标题和文字内容。
:::
## 降低通知延迟
不同平台处理通知的方式各异,可能需要调整设置以获得最佳效果。
### Android 设备
多数安卓手机具有电池优化设置。为确保可靠接收通知,建议:
1. 为浏览器Chrome/Firefox禁用电池优化
2. 若以 PWA 形式运行 Frigate需同时禁用 Frigate 应用的电池优化

View File

@ -0,0 +1,57 @@
---
id: object_filters
title: 对象过滤器
---
Frigate提供了多种对象过滤器来降低误报率。
## 对象分数
在配置中设置对象过滤器时,任何低于`min_score`(最低分数)的检测都会被忽略为误报。`threshold`(阈值)基于被追踪对象分数历史记录的中位数计算(补零至3个值)。假设`min_score`设为0.6`threshold`设为0.85,以下是各帧的检测情况:
| 帧数 | 当前分数 | 分数历史记录 | 计算分数 | 是否检测到对象 |
| ---- | -------- | -------------------------- | -------- | -------------- |
| 1 | 0.7 | 0.0, 0, 0.7 | 0.0 | 否 |
| 2 | 0.55 | 0.0, 0.7, 0.0 | 0.0 | 否 |
| 3 | 0.85 | 0.7, 0.0, 0.85 | 0.7 | 否 |
| 4 | 0.90 | 0.7, 0.85, 0.95, 0.90 | 0.875 | 是 |
| 5 | 0.88 | 0.7, 0.85, 0.95, 0.90, 0.88| 0.88 | 是 |
| 6 | 0.95 | 0.7, 0.85, 0.95, 0.90, 0.88, 0.95 | 0.89 | 是 |
在第2帧中分数低于`min_score`值因此Frigate会忽略它并记为0.0。计算分数是分数历史记录的中位数(至少补零至3个值),只有当这个计算分数超过`threshold`时对象才会被标记为真实检测。在上例中这种情况发生在第4帧。
### 最低分数
任何低于`min_score`的检测都会立即被丢弃且不会被追踪,因为它被视为误报。如果`min_score`设置过低,可能会导致误报被检测和追踪,从而干扰对象追踪器并浪费资源。如果`min_score`设置过高,则可能会丢弃分数较低的真实检测,如距离较远或被部分遮挡的对象,这也可能干扰追踪器并导致有效追踪对象丢失或断开。
### 阈值
`threshold`用于确定对象是否为真实检测。当对象检测分数 >= `threshold`时,该对象被视为真实检测。如果`threshold`设置过低,一些高分误报可能会创建追踪对象。如果`threshold`设置过高,则可能会错过真实检测,因为对象分数可能永远达不到足够高的值。
## 对象形状
也可以通过对象的形状特征来过滤误报。
### 对象面积
`min_area`和`max_area`根据对象边界框的面积进行过滤,可用于排除超出预期大小范围的误报。例如,当一片叶子被检测为狗,或一棵大树被检测为人时,可以通过添加`min_area`/`max_area`过滤器来减少这类误报。这些值可以以像素为单位,也可以表示为帧的百分比(例如0.12表示帧的12%)。
### 对象比例
`min_ratio`和`max_ratio`值与检测对象的宽高比(以像素为单位)进行比较。如果比例超出此范围,对象将被忽略为误报。这可以忽略比例过高(又矮又宽)或过低(又高又窄)的对象。
:::info
从概念上讲比例为1表示正方形0.5表示"高瘦"的框2表示"矮胖"的框。如果`min_ratio`设为1.0,任何高度大于宽度的对象都会被忽略。同样,如果`max_ratio`设为1.0,则任何宽度大于高度的对象都会被忽略。
:::
## 其他工具
### 区域
[必需区域](/configuration/zones.md)是减少误报的强大工具,特别是对于天空中或其他不感兴趣区域的误报。必需区域只会为进入该区域的对象创建追踪对象。
### 对象遮罩
[对象过滤器遮罩](/configuration/masks)是最后的手段,但当误报出现在相对固定的位置且无法通过大小或形状过滤时,它们会很有用。

View File

@ -0,0 +1,28 @@
---
id: objects
title: 支持检测的对象类型
---
import labels from "../../../../../../labelmap.txt";
Frigate 默认支持检测以下来自 Google Coral 测试数据的对象类型:
请注意:
- `car`(汽车)被列出两次,因为默认配置已将`truck`(卡车)重命名为`car`。这两类对象经常被混淆检测。
- 默认情况下,只有`person`(人员)会被追踪。如需扩展追踪对象列表,请参考[完整配置参考](reference.md)中的示例。
<ul>
{labels.split("\n").map((label) => (
<li>{label.replace(/^\d+\s+/, "")}</li>
))}
</ul>
## 自定义模型
镜像中已包含适用于 CPU 和 EdgeTPUCoral的默认模型。您可以通过挂载以下文件来使用自定义模型
- CPU 模型:`/cpu_model.tflite`
- EdgeTPU 模型:`/edgetpu_model.tflite`
- 标签文件:`/labelmap.txt`
如果自定义模型与默认配置不同,您还需要更新[模型配置](advanced.md#model)。

View File

@ -0,0 +1,24 @@
---
id: pwa
title: 安装Frigate应用
---
Frigate支持作为[渐进式网页应用(PWA)](https://web.dev/explore/progressive-web-apps)安装在桌面端、Android和iOS设备上。
此方式可获得包括深度链接在内的多项功能增强。
## 安装要求
要将Frigate安装为PWA需满足以下条件
- 必须通过安全上下文访问Frigate如localhost、https安全连接等
- Android设备需使用Firefox、Chrome、Edge、Opera或三星互联网浏览器等支持PWA的浏览器
- iOS 16.4及以上版本可通过Safari、Chrome、Edge、Firefox或Orion浏览器的分享菜单安装
## 安装方法
不同设备的安装方式略有差异:
- **桌面端**:通常使用地址栏右侧的安装按钮
- **Android设备**:通过浏览器菜单中的"安装为应用"选项
- **iOS设备**:通过分享菜单中的"添加到主屏幕"功能

View File

@ -0,0 +1,192 @@
---
id: record
title: 录像功能
---
启用录像功能后,视频将存储在`/media/frigate/recordings`目录下。录像的文件结构为`YYYY-MM-DD/HH/<摄像头名称>/MM.SS.mp4`使用UTC时间。这些录像直接从摄像头流写入不经过重新编码。每个摄像头支持可配置的保留策略。当决定是否删除录像时Frigate会选择录像保留和追踪对象保留中较大的匹配值。
新的录像片段会从摄像头流写入缓存,只有符合设置的录像保留策略时才会移动到磁盘存储。
H265编码的录像只能在Chrome 108+、Edge和Safari浏览器中播放。其他浏览器需要H264编码的录像。
## 常见录像配置
### 最保守方案:保存所有视频
对于需要在没有检测到运动时也保存连续视频的环境以下配置将保存3天内的所有视频。3天后只有包含运动且与警报或检测重叠的视频会保留30天。
```yaml
record:
enabled: True
retain:
days: 3
mode: all
alerts:
retain:
days: 30
mode: motion
detections:
retain:
days: 30
mode: motion
```
### 减少存储:仅保存检测到运动的视频
为了减少存储需求,可以调整配置只保留检测到运动的视频。
```yaml
record:
enabled: True
retain:
days: 3
mode: motion
alerts:
retain:
days: 30
mode: motion
detections:
retain:
days: 30
mode: motion
```
### 最小方案:仅保存警报视频
如果只想保留追踪对象期间的视频,此配置将丢弃非警报期间的视频。
```yaml
record:
enabled: True
retain:
days: 0
alerts:
retain:
days: 30
mode: motion
```
## 存储空间不足时Frigate会删除旧录像吗
从Frigate 0.12开始当剩余存储空间不足1小时时系统会自动删除最早的2小时录像。
## 配置录像保留策略
Frigate支持连续录像和基于追踪对象的录像具有独立的保留模式和保留期限。
:::tip
保留配置支持小数,例如可以设置为保留`0.5`天。
:::
### 连续录像
可以通过以下配置设置保留连续录像的天数X为数字默认情况下连续录像被禁用。
```yaml
record:
enabled: True
retain:
days: 1 # <- 保留连续录像的天数
```
连续录像支持不同的保留模式,[详见下文](#不同保留模式的含义)
### 对象录像
可以为分类为警报和检测的回放条目分别指定保留天数。
```yaml
record:
enabled: True
alerts:
retain:
days: 10 # <- 保留警报录像的天数
detections:
retain:
days: 10 # <- 保留检测录像的天数
```
此配置将保留与警报和检测重叠的录像片段10天。由于多个追踪对象可能引用相同的录像片段这样可以避免存储重复内容并减少总体存储需求。
**警告**:必须在配置中启用录像功能。如果摄像头在配置中禁用了录像,通过上述方法启用将不会生效。
## 不同保留模式的含义
Frigate以10秒为片段保存具有`record`角色的视频流。这些选项决定了哪些录像片段会被保留(也会影响追踪对象)。
假设您配置门铃摄像头保留最近2天的连续录像
- 使用`all`选项会保留这2天内的全部48小时录像
- 使用`motion`选项只会保留Frigate检测到运动的部分片段。这是折中方案不会保留全部48小时但可能会保留所有感兴趣的片段以及一些额外内容
- 使用`active_objects`选项只会保留存在真实活动对象(非静止)的片段
警报和检测也有相同的选项,但只会保存与相应类型回放条目重叠的录像。
以下配置示例将保存所有运动片段7天活动对象片段保存14天
```yaml
record:
enabled: True
retain:
days: 7
mode: motion
alerts:
retain:
days: 14
mode: active_objects
detections:
retain:
days: 14
mode: active_objects
```
上述配置可以全局应用或针对单个摄像头设置。
## 可以只在特定时间进行"连续"录像吗?
通过Frigate页面、Home Assistant或MQTT可以设置摄像头只在特定情况或时间进行录像。
## 如何导出录像?
可以通过在回放面板中右键点击(桌面)或长按(移动设备)回放条目,或在历史视图中点击导出按钮来导出录像。导出的录像会通过主导航栏中的导出视图进行组织和搜索。
### 延时摄影导出
延时摄影导出只能通过[HTTP API](../integrations/api/export-recording-export-camera-name-start-start-time-end-end-time-post.api.mdx)实现。
默认情况下延时摄影以25倍速和30FPS导出。这意味着每25秒的实际录像会被压缩为1秒的延时视频无音频
要配置加速倍数、帧率等参数,可以使用`timelapse_args`配置参数。以下示例将延时速度改为60倍1小时录像压缩为1分钟帧率25FPS
```yaml
record:
enabled: True
export:
timelapse_args: "-vf setpts=PTS/60 -r 25"
```
:::tip
当全局使用`hwaccel_args`时,延时生成会使用硬件编码。编码器会自行决定行为,可能导致输出文件过大。
可以使用ffmpeg参数`-qp n`n代表量化参数值来减小输出文件大小调整该值可以在质量和文件大小之间取得平衡。
:::
## 录像与磁盘同步
在某些情况下录像文件可能被删除但Frigate不知情。可以启用录像同步功能让Frigate检查文件系统并删除数据库中不存在的文件记录。
```yaml
record:
sync_recordings: True
```
此功能用于修复文件差异,而非完全删除数据库条目。如果删除了所有媒体文件,不要使用`sync_recordings`而是停止Frigate删除`frigate.db`数据库后重新启动。
:::warning
同步操作会占用大量CPU资源大多数情况下不需要启用仅在必要时使用。
:::

View File

@ -0,0 +1,912 @@
---
id: reference
title: 完整配置参考
---
### 完整配置参考:
:::warning
不建议直接复制这个完整的配置文件。只需指定与默认值不同的值。配置选项和默认值可能会在未来版本中发生变化。
:::
```yaml
mqtt:
# 可选启用mqtt服务器默认值如下所示
enabled: True
# 必需:主机名
host: mqtt.server.com
# 可选:端口(默认值:如下所示)
port: 1883
# 可选:主题前缀(默认值:如下所示)
# 注意:如果运行多个实例,必须是唯一的
topic_prefix: frigate
# 可选客户端ID默认值如下所示
# 注意:如果运行多个实例,必须是唯一的
client_id: frigate
# 可选:用户名
# 注意MQTT用户可以通过以'FRIGATE_'开头的环境变量或docker secrets指定
# 例如user: '{FRIGATE_MQTT_USER}'
user: mqtt_user
# 可选:密码
# 注意MQTT密码可以通过以'FRIGATE_'开头的环境变量或docker secrets指定
# 例如password: '{FRIGATE_MQTT_PASSWORD}'
password: password
# 可选用于启用TLS的自签名证书的CA证书默认值
tls_ca_certs: /path/to/ca.crt
# 可选:用于使用自签名客户端证书的客户端证书和密钥
# (默认值:无)
# 注意:证书不能有密码保护
# 使用客户端证书时不要设置用户名和密码
tls_client_cert: /path/to/client.crt
tls_client_key: /path/to/client.key
# 可选tls_insecuretrue/false用于启用服务器证书中
# 主机名的TLS验证默认值
tls_insecure: false
# 可选:发布统计信息的时间间隔(秒)(默认值:如下所示)
stats_interval: 60
# 可选订阅和发布的QoS级别默认值如下所示
# 0 = 最多一次
# 1 = 至少一次
# 2 = 恰好一次
qos: 0
# 可选检测器配置。默认为单个CPU检测器
detectors:
# 必需:检测器名称
detector_name:
# 必需:检测器类型
# Frigate提供多种类型详见 https://docs.frigate.video/configuration/object_detectors默认值如下所示
# 也可以插入其他类型的检测器。
# 检测器可能需要额外的配置。
# 更多信息请参考检测器配置页面。
type: cpu
# 可选:数据库配置
database:
# SQLite数据库文件的存储路径默认值如下所示
path: /config/frigate.db
# 可选TLS配置
tls:
# 可选为8971端口启用TLS默认值如下所示
enabled: True
# 可选:代理配置
proxy:
# 可选上游代理的请求头映射。仅在Frigate的身份验证被禁用时使用。
# 注意:许多身份验证代理会在下游传递一个包含已验证用户名的请求头。
# 并非所有值都受支持。必须是白名单中的请求头。
# 更多信息请参见文档。
header_map:
user: x-forwarded-user
# 可选用户登出的URL。这设置了UI中登出URL的位置。
logout_url: /api/logout
# 可选用于检查代理发送的X-Proxy-Secret请求头的认证密钥。
# 如果未设置,则不考虑来源信任所有请求。
auth_secret: None
# 可选:身份验证配置
auth:
# 可选:启用身份验证
enabled: True
# 可选:在启动时重置管理员用户密码(默认值:如下所示)
# 新密码会打印在日志中
reset_admin_password: False
# 可选存储原生身份验证JWT令牌的Cookie名称默认值如下所示
cookie_name: frigate_token
# 可选设置cookie的secure标志默认值如下所示
# 注意如果你使用TLS应该将此设置为True
cookie_secure: False
# 可选:会话长度(秒)(默认值:如下所示)
session_length: 86400 # 24小时
# 可选:刷新时间(秒)(默认值:如下所示)
# 当会话将在小于此设置的时间内过期时,
# 它将被刷新回session_length的时长。
refresh_time: 43200 # 12小时
# 可选:登录失败的速率限制,用于防止暴力破解
# 登录攻击(默认值:如下所示)
# 有关有效值的更多信息,请参见文档
failed_login_rate_limit: None
# 可选用于确定IP地址进行速率限制的受信任代理
# 注意:这仅用于限制登录尝试的速率,不会绕过
# 身份验证。更多详情请参见身份验证文档。
trusted_proxies: []
# 可选:用户密码的哈希迭代次数
# 截至2023年2月OWASP建议PBKDF2-SHA256使用600000次迭代
# 注意:更改此值不会自动更新密码哈希,你
# 需要更改每个用户的密码才能使其生效
hash_iterations: 600000
# 可选:模型修改
# 注意默认值是针对EdgeTPU检测器的。
# 其他检测器需要设置模型配置。
model:
# 必需模型路径。Frigate+模型使用 plus://<model_id>(默认值:根据检测器自动设置)
path: /edgetpu_model.tflite
# 必需:标签映射文件路径(默认值:如下所示)
labelmap_path: /labelmap.txt
# 必需:对象检测模型输入宽度(默认值:如下所示)
width: 320
# 必需:对象检测模型输入高度(默认值:如下所示)
height: 320
# 必需:对象检测模型输入颜色空间
# 有效值为 rgb、bgr 或 yuv默认值如下所示
input_pixel_format: rgb
# 必需:对象检测模型输入张量格式
# 有效值为 nhwc 或 nchw默认值如下所示
input_tensor: nhwc
# 必需对象检测模型类型目前仅用于OpenVINO检测器
# 有效值为 ssd、yolox、yolonas默认值如下所示
model_type: ssd
# 必需:标签名称修改。这些会合并到标准标签映射中。
labelmap:
2: vehicle
# 可选:对象标签到其属性标签的映射(默认值:取决于模型)
attributes_map:
person:
- amazon
- face
car:
- amazon
- fedex
- license_plate
- ups
# 可选:音频事件配置
# 注意:可以在摄像头级别重写
audio:
# 可选:启用音频事件(默认值:如下所示)
enabled: False
# 可选:配置在没有检测到音频后结束事件的秒数(默认值:如下所示)
max_not_heard: 30
# 可选配置运行音频检测所需的最小RMS音量默认值如下所示
# 参考标准:
# - 200 - 高灵敏度
# - 500 - 中等灵敏度
# - 1000 - 低灵敏度
min_volume: 500
# 可选:要监听的音频类型(默认值:如下所示)
listen:
- bark # 狗叫
- fire_alarm # 火警
- scream # 尖叫
- speech # 说话
- yell # 喊叫
# 可选:配置检测过滤器
filters:
# 与listen配置中标签匹配的标签
speech:
# 触发音频事件的最小分数(默认值:如下所示)
threshold: 0.8
# 可选:日志记录器详细程度设置
logger:
# 可选:默认日志详细程度(默认值:如下所示)
default: info
# 可选:特定组件的日志记录器覆盖
logs:
frigate.event: debug
# 可选:设置环境变量
environment_vars:
EXAMPLE_VAR: value
# 可选:鸟瞰图配置
# 注意可以在摄像头级别重写enabled和mode参数
birdseye:
# 可选:启用鸟瞰视图(默认值:如下所示)
enabled: True
# 可选通过RTSP重新串流鸟瞰视图默认值如下所示
# 注意启用此功能将使鸟瞰视图全天候运行可能会略微增加CPU使用率。
restream: False
# 可选:输出分辨率的宽度(默认值:如下所示)
width: 1280
# 可选:输出分辨率的高度(默认值:如下所示)
height: 720
# 可选mpeg1视频流的编码质量默认值如下所示
# 1是最高质量31是最低质量。较低的质量会减少CPU资源使用。
quality: 8
# 可选视图模式。可用选项有objects、motion和continuous
# objects - 如果摄像头在过去30秒内有被跟踪的对象则包含该摄像头
# motion - 如果摄像头在过去30秒内检测到运动则包含该摄像头
# continuous - 始终包含所有摄像头
mode: objects
# 可选:停止显示摄像头的活动阈值(默认值:如下所示)
inactivity_threshold: 30
# 可选:配置鸟瞰视图布局
layout:
# 可选布局计算器的缩放因子范围1.0-5.0(默认值:如下所示)
scaling_factor: 2.0
# 可选:一次最多显示的摄像头数量,显示最近的摄像头(默认值:显示所有摄像头)
max_cameras: 1
# 可选ffmpeg配置
# 关于预设的更多信息请访问 https://docs.frigate.video/configuration/ffmpeg_presets
ffmpeg:
# 可选ffmpeg二进制文件路径默认值如下所示
# 可以设置为`7.0`或`5.0`以指定其中一个包含的版本
# 或者可以设置为任何包含`bin/ffmpeg`和`bin/ffprobe`的路径
path: "default"
# 可选全局ffmpeg参数默认值如下所示
global_args: -hide_banner -loglevel warning -threads 2
# 可选:全局硬件加速参数(默认值:自动检测)
# 注意:请参阅特定设备的硬件加速文档
hwaccel_args: "auto"
# 可选:全局输入参数(默认值:如下所示)
input_args: preset-rtsp-generic
# 可选:全局输出参数
output_args:
# 可选:检测流的输出参数(默认值:如下所示)
detect: -threads 2 -f rawvideo -pix_fmt yuv420p
# 可选:录制流的输出参数(默认值:如下所示)
record: preset-record-generic
# 可选ffmpeg重试连接摄像头前等待的秒数默认值如下所示
# 如果设置太低frigate会过于频繁地重试连接摄像头流消耗摄像头同时允许的有限流数
# 如果设置太高那么当ffmpeg崩溃或摄像头流超时时你可能会丢失最多retry_interval秒的录像
# 注意:这对于无线/电池供电的摄像头来说是一个有用的设置,可以减少连接超时期间潜在丢失的录像量
retry_interval: 10
# 可选在HEVCH.265录制流上设置标签以提高与Apple播放器的兼容性默认值如下所示
apple_compatibility: false
# 可选:检测配置
# 注意:可以在摄像头级别重写
detect:
# 可选:启用摄像头的检测功能(默认值:如下所示)
enabled: False
# 可选:检测角色输入帧的宽度(默认值:使用原生流分辨率)
width: 1280
# 可选:检测角色输入帧的高度(默认值:使用原生流分辨率)
height: 720
# 可选:检测角色输入的目标帧率(默认值:如下所示)
# 注意建议值为5。理想情况下尽量在摄像头端降低帧率。
fps: 5
# 可选对象在跟踪器中初始化所需的连续检测命中次数默认值帧率的1/2
min_initialized: 2
# 可选Frigate认为对象消失前的无检测帧数默认值帧率的5倍
max_disappeared: 25
# 可选:静止对象跟踪配置
stationary:
# 可选:确认静止对象的频率(默认值:与阈值相同)
# 当设置为1时每帧都会运行对象检测来确认对象是否仍然存在。
# 如果设置为10则每10帧运行一次对象检测来确认对象是否仍然存在。
interval: 50
# 可选对象被视为静止前的无位置变化帧数默认值帧率的10倍或10秒
threshold: 50
# 可选:定义跟踪静止对象的最大帧数(默认值:未设置,永久跟踪)
# 这可以帮助减少只应该短时间静止的对象的误报。
# 也可以用来禁用静止对象跟踪。例如你可能想为person设置一个值
# 但让car保持默认值。
# 警告:设置这些值会覆盖默认行为并禁用静止对象跟踪。
# 很少有情况需要禁用它。除非你知道确实需要,
# 否则不建议从示例配置中复制这些值到你的配置中。
max_frames:
# 可选:所有对象类型的默认值(默认值:未设置,永久跟踪)
default: 3000
# 可选:特定对象的值
objects:
person: 1000
# 可选:检测注释的偏移毫秒数(默认值:如下所示)。
# 录制和检测过程之间经常存在延迟,
# 特别是当使用单独的流进行检测和录制时。
# 使用此设置可以使时间轴上的边界框与录制内容更好地对齐。
# 该值可以是正数或负数。
# 提示:想象有一个跟踪对象剪辑,其中一个人从左向右走。
# 如果跟踪对象生命周期边界框始终在人的左侧,
# 则应该减小该值。同样,如果一个人从左向右走,
# 而边界框始终在人的前面,则应该增加该值。
# 提示:此偏移是动态的,所以你可以更改值,它会更新现有的
# 跟踪对象,这使得调整变得容易。
# 警告:快速移动的对象的边界框可能无法对齐。
annotation_offset: 0
# 可选:对象配置
# 注意:可以在摄像头级别重写
objects:
# 可选从labelmap.txt中要跟踪的对象列表默认值如下所示
track:
- person # 人
# 可选:防止在某些区域检测所有类型对象的蒙版(默认值:无蒙版)
# 基于对象边界框的底部中心进行检查。
# 注意:此蒙版与下面的对象类型特定蒙版组合使用
mask: 0.000,0.000,0.781,0.000,0.781,0.278,0.000,0.278
# 可选:减少特定对象类型误报的过滤器
filters:
person: # 人
# 可选检测到的对象边界框的最小尺寸默认值0
# 可以指定为像素宽度*高度的整数或表示帧百分比的小数0.000001到0.99)。
min_area: 5000
# 可选检测到的对象边界框的最大尺寸默认值24000000
# 可以指定为像素宽度*高度的整数或表示帧百分比的小数0.000001到0.99)。
max_area: 100000
# 可选检测到的对象边界框的最小宽高比默认值0
min_ratio: 0.5
# 可选检测到的对象边界框的最大宽高比默认值24000000
max_ratio: 2.0
# 可选:开始跟踪对象所需的最小分数(默认值:如下所示)
min_score: 0.5
# 可选:被跟踪对象的计算分数被认为是真阳性的最小百分比(小数)(默认值:如下所示)
threshold: 0.7
# 可选:防止在某些区域检测此类型对象的蒙版(默认值:无蒙版)
# 基于对象边界框的底部中心进行检查
mask: 0.000,0.000,0.781,0.000,0.781,0.278,0.000,0.278
# 可选:审查配置
# 注意:可以在摄像头级别重写
review:
# 可选:警报配置
alerts:
# 可选:启用摄像头的警报(默认值:如下所示)
enabled: True
# 可选:符合警报条件的标签(默认值:如下所示)
labels:
- car # 汽车
- person # 人
# 可选:对象被标记为警报所需的区域(默认值:无)
# 注意:当在全局设置必需区域时,此区域必须存在于所有摄像头中,
# 否则配置将被视为无效。在这种情况下required_zones
# 应该在摄像头级别配置。
required_zones:
- driveway # 车道
# 可选:检测配置
detections:
# 可选:启用摄像头的检测(默认值:如下所示)
enabled: True
# 可选:符合检测条件的标签(默认值:所有被跟踪/监听的标签)
labels:
- car # 汽车
- person # 人
# 可选:对象被标记为检测所需的区域(默认值:无)
# 注意:当在全局设置必需区域时,此区域必须存在于所有摄像头中,
# 否则配置将被视为无效。在这种情况下required_zones
# 应该在摄像头级别配置。
required_zones:
- driveway # 车道
# 可选:运动配置
# 注意:可以在摄像头级别重写
motion:
# 可选启用摄像头的检测功能默认值True
# 注意:运动检测是对象检测所必需的,
# 如果将此设置为False但保持detect启用
# 将在启动时导致错误。
enabled: False
# 可选传递给cv2.threshold的阈值用于确定像素是否足够不同以被计为运动默认值如下所示
# 增加此值将降低运动检测的灵敏度,减小此值将提高运动检测的灵敏度。
# 该值应在1到255之间。
threshold: 30
# 可选:用于检测闪电或其他需要重新校准运动检测的重大变化的图像百分比
# (默认值:如下所示)
# 增加此值将使运动检测更可能将闪电或红外模式变化视为有效运动。
# 减小此值将使运动检测更可能忽略大量运动,例如有人接近门铃摄像头。
lightning_threshold: 0.8
# 可选:调整大小后的运动图像中被计为运动的最小像素尺寸(默认值:如下所示)
# 增加此值将防止检测到较小的运动区域。减小此值将
# 使运动检测对较小的移动物体更敏感。
# 参考标准:
# - 10 - 高灵敏度
# - 30 - 中等灵敏度
# - 50 - 低灵敏度
contour_area: 10
# 可选在平均帧以确定背景时传递给cv2.accumulateWeighted的Alpha值默认值如下所示
# 较高的值意味着当前帧对平均值影响很大,新对象将更快地被平均到背景中。
# 较低的值将导致移动阴影等被检测为运动的时间更长。
# https://www.geeksforgeeks.org/background-subtraction-in-an-image-using-concept-of-running-average/
frame_alpha: 0.01
# 可选调整大小后的运动帧的高度默认值100
# 较高的值将以更高的CPU使用为代价获得更细粒度的运动检测。
# 较低的值会减少CPU使用但小的变化可能不会被识别为运动。
frame_height: 100
# 可选:运动蒙版
# 注意:有关创建蒙版的更详细信息,请参见文档
mask: 0.000,0.469,1.000,0.469,1.000,1.000,0.000,1.000
# 可选:改善对比度(默认值:如下所示)
# 启用动态对比度改善。这应该有助于改善夜间检测,但代价是使白天的运动检测更敏感。
improve_contrast: True
# 可选通过MQTT更新摄像头运动状态从ON到OFF时的延迟默认值如下所示
mqtt_off_delay: 30
# 可选:通知配置
# 注意可以在摄像头级别重写除了email
notifications:
# 可选:启用通知服务(默认值:如下所示)
enabled: False
# 可选:推送服务要联系的电子邮件
# 注意:这是使用通知功能所必需的
email: "admin@example.com"
# 可选:通知的冷却时间(秒)(默认值:如下所示)
cooldown: 0
# 可选:录制配置
# 注意:可以在摄像头级别重写
record:
# 可选:启用录制(默认值:如下所示)
# 警告如果在配置中禁用了录制稍后通过UI或MQTT开启将不会生效。
enabled: False
# 可选:清理运行之间的等待分钟数(默认值:如下所示)
# 如果你想最小化I/O操作可以使用此设置来减少从磁盘删除录制片段的频率
expire_interval: 60
# 可选:在启动时和每天一次同步录制文件(默认值:如下所示)。
sync_recordings: False
# 可选:录制保留设置
retain:
# 可选:无论是否有跟踪对象都要保留录像的天数(默认值:如下所示)
# 注意如果你只想保留警报和检测的录像应该将此设置为0
# 并在下面的alerts和detections部分定义保留设置。
days: 0
# 可选保留模式。可用选项有all、motion和active_objects
# all - 保存所有录制片段,无论是否有活动
# motion - 保存所有检测到运动的录制片段
# active_objects - 保存所有有活动/移动对象的录制片段
# 注意此模式仅在上面days设置大于0时适用
mode: all
# 可选:录制导出设置
export:
# 可选:延时摄影输出参数(默认值:如下所示)。
# 注意默认参数设置为将24小时的录制压缩为1小时的播放。
# 有关这些参数如何工作的更多信息请参见https://stackoverflow.com/a/58268695。
# 例如如果你想将24小时压缩为30分钟那就是从86400秒到1800秒
# 即1800 / 86400 = 0.02。
# -r帧率决定了输出视频的流畅度。
# 所以在这种情况下参数应该是 -vf setpts=0.02*PTS -r 30。
timelapse_args: "-vf setpts=0.04*PTS -r 30"
# 可选:录制预览设置
preview:
# 可选:录制预览质量(默认值:如下所示)。
# 选项有very_low极低、low、medium、high、very_high极高
quality: medium
# 可选:警报录制设置
alerts:
# 可选:警报前包含的秒数(默认值:如下所示)
pre_capture: 5
# 可选:警报后包含的秒数(默认值:如下所示)
post_capture: 5
# 可选:警报录像的保留设置
retain:
# 必需:保留天数(默认值:如下所示)
days: 14
# 可选:保留模式(默认值:如下所示)
# all - 保存所有警报录制片段,无论是否有活动
# motion - 保存所有检测到运动的警报录制片段
# active_objects - 保存所有有活动/移动对象的警报录制片段
#
# 注意:如果摄像头的保留模式比此处配置的模式更严格,
# 在应用此模式时,片段可能已经被删除。
# 例如,如果摄像头保留模式是"motion",没有运动的片段
# 永远不会被存储,所以在这里设置模式为"all"不会恢复它们。
mode: motion
# 可选:检测录制设置
detections:
# 可选:检测前包含的秒数(默认值:如下所示)
pre_capture: 5
# 可选:检测后包含的秒数(默认值:如下所示)
post_capture: 5
# 可选:检测录像的保留设置
retain:
# 必需:保留天数(默认值:如下所示)
days: 14
# 可选:保留模式(默认值:如下所示)
# all - 保存所有检测录制片段,无论是否有活动
# motion - 保存所有检测到运动的检测录制片段
# active_objects - 保存所有有活动/移动对象的检测录制片段
#
# 注意:如果摄像头的保留模式比此处配置的模式更严格,
# 在应用此模式时,片段可能已经被删除。
# 例如,如果摄像头保留模式是"motion",没有运动的片段
# 永远不会被存储,所以在这里设置模式为"all"不会恢复它们。
mode: motion
# 可选为每个跟踪对象写入clips目录的jpg快照配置
# 注意:可以在摄像头级别重写
snapshots:
# 可选启用将jpg快照写入/media/frigate/clips默认值如下所示
enabled: False
# 可选保存快照图像的干净PNG副本默认值如下所示
clean_copy: True
# 可选:在快照上打印时间戳(默认值:如下所示)
timestamp: False
# 可选:在快照上绘制边界框(默认值:如下所示)
bounding_box: True
# 可选:裁剪快照(默认值:如下所示)
crop: False
# 可选:调整快照的高度(默认值:原始大小)
height: 175
# 可选:限制快照仅包含进入所列区域的对象(默认值:无必需区域)
required_zones: []
# 可选:摄像头特定的保留设置覆盖(默认值:全局值)
retain:
# 必需:默认保留天数(默认值:如下所示)
default: 10
# 可选:按对象保留天数
objects:
person: 15 # 人
# 可选编码jpeg的质量0-100默认值如下所示
quality: 70
# 可选:语义搜索功能配置
semantic_search:
# 可选:启用语义搜索(默认值:如下所示)
enabled: False
# 可选:从历史跟踪对象重新索引嵌入数据库(默认值:如下所示)
reindex: False
# 可选:设置用于嵌入的模型(默认值:如下所示)
model: "jinav1"
# 可选:设置用于嵌入的模型大小(默认值:如下所示)
# 注意小型模型在CPU上运行大型模型在GPU上运行
model_size: "small"
# 可选:人脸识别功能配置
# 注意enabled和min_area可以在摄像头级别重写
face_recognition:
# 可选:启用语义搜索(默认值:如下所示)
enabled: False
# 可选:标记为潜在匹配所需的最小人脸距离分数(默认值:如下所示)
unknown_score: 0.8
# 可选:检测人脸所需的最小人脸检测分数(默认值:如下所示)
# 注意这仅在不运行Frigate+模型时适用
detection_threshold: 0.7
# 可选:被视为匹配所需的最小人脸距离分数(默认值:如下所示)
recognition_threshold: 0.9
# 可选:运行人脸识别所需的检测到的人脸框最小面积(默认值:如下所示)
min_area: 500
# 可选:保存用于训练的已识别人脸图像数量(默认值:如下所示)
save_attempts: 100
# 可选:应用模糊质量过滤器,根据图像的模糊程度调整置信度(默认值:如下所示)
blur_confidence_filter: True
# 可选:车牌识别功能配置
# 注意enabled、min_area和enhancement可以在摄像头级别重写
lpr:
# 可选:启用车牌识别(默认值:如下所示)
enabled: False
# 可选:运行模型的设备(默认值:如下所示)
device: CPU
# 可选:设置用于文本检测的模型大小(默认值:如下所示)
model_size: small
# 可选:开始运行识别所需的车牌对象置信度分数(默认值:如下所示)
detection_threshold: 0.7
# 可选:开始运行识别所需的车牌最小面积(默认值:如下所示)
min_area: 1000
# 可选:将车牌作为子标签添加到对象所需的识别置信度分数(默认值:如下所示)
recognition_threshold: 0.9
# 可选:将车牌作为子标签添加到对象所需的最小字符数(默认值:如下所示)
min_plate_length: 4
# 可选:车牌预期格式的正则表达式(默认值:如下所示)
format: None
# 可选:允许检测到的车牌与已知车牌匹配时可以有的缺失/错误字符数
match_distance: 1
# 可选:要跟踪的已知车牌(字符串或正则表达式)(默认值:如下所示)
known_plates: {}
# 可选:通过对比度调整和降噪增强检测到的车牌图像(默认值:如下所示)
# 值在0到10之间。更高的值并不总是更好可能比较低的值表现更差。
enhancement: 0
# 可选:保存车牌图像到/media/frigate/clips/lpr用于调试目的默认值如下所示
debug_save_plates: False
# 可选AI生成的跟踪对象描述配置
# 警告:根据提供者的不同,这将通过互联网将缩略图发送到
# Google或OpenAI的LLM来生成描述。可以在摄像头级别重写
# enabled: False以增强室内摄像头的隐私保护。
genai:
# 可选启用AI描述生成默认值如下所示
enabled: False
# 启用时必需提供者必须是ollama、gemini或openai之一
provider: ollama
# 当提供者是ollama时必需。也可以用于openai提供者的OpenAI API兼容后端。如果要使用openai类接口的第三方服务商请使用系统变量
base_url: http://localhost:11434
# 当使用gemini或openai时必需
api_key: "{FRIGATE_GENAI_API_KEY}"
# 可选:生成描述的默认提示。可以使用替换变量
# 如"label"、"sub_label"、"camera"来使其更加动态(默认值:如下所示)
prompt: "请分析以下监控摄像头画面中的 “{label}” 元素,如果可以,请尽可能描述 “{label}” 的动作、行为和潜在意图,并尽可能详细的描述它的外观,同时请不要描述周围环境和其他元素细节等。注意,引号内的对象名可能为英文,同时需要将它转换为中文。"
# 可选:自定义描述结果的对象特定提示
# 格式:{label}: {prompt}
object_prompts:
person: "分析这些图像中的主要人物。他们在做什么,他们的行动可能暗示他们的意图是什么(例如,接近一扇门,离开一个区域,静止不动)?不要描述周围环境或静态细节。"
# 可选:重新串流配置
# 使用 https://github.com/AlexxIT/go2rtc (v1.9.9)
# 注意必须使用默认的go2rtc API端口1984
# 不支持更改集成的go2rtc实例的端口。
go2rtc:
# 可选WebUI的实时流配置
# 注意:可以在摄像头级别重写
live:
# 可选设置在go2rtc中配置的流
# 用于frigate WebUI的实时查看默认值摄像头名称
# 注意:在大多数情况下,这应该只在摄像头级别设置。
streams:
main_stream: main_stream_name
sub_stream: sub_stream_name
# 可选设置jsmpeg流的高度默认值720
# 这必须小于或等于检测流的高度。较低的分辨率
# 减少查看jsmpeg流所需的带宽。宽度根据已知的宽高比计算。
height: 720
# 可选设置jsmpeg流的编码质量默认值如下所示
# 1是最高质量31是最低质量。较低的质量使用更少的CPU资源。
quality: 8
# 可选:视频流内时间戳样式配置
# 注意:可以在摄像头级别重写
timestamp_style:
# 可选:时间戳的位置(默认值:如下所示)
# "tl"(左上)、"tr"(右上)、"bl"(左下)、"br"(右下)
position: "tl"
# 可选符合Python包"datetime"的格式指定符(默认值:如下所示)
# 其他示例:
# 德语格式:"%d.%m.%Y %H:%M:%S"
format: "%m/%d/%Y %H:%M:%S"
# 可选:字体颜色
color:
# 指定颜色时所有参数都必需(默认值:如下所示)
red: 255
green: 255
blue: 255
# 可选:字体线条粗细(默认值:如下所示)
thickness: 2
# 可选:文字效果(默认值:如下所示)
# None无效果
# "solid"(字体反色的实心背景)
# "shadow"(字体阴影)
effect: None
# 必需
cameras:
# 必需:摄像头名称,目前仅能使用英文数字与下划线
back:
# 可选:启用/禁用摄像头(默认值:如下所示)。
# 如果禁用:配置仍然有效但没有实时流和捕获等功能。
# 事件/录像仍然可以查看。
enabled: True
# 可选用于某些Frigate功能的摄像头类型默认值如下所示
# 选项为 "generic"(通用)和 "lpr"(车牌识别)
type: "generic"
# 必需摄像头的ffmpeg设置
ffmpeg:
# 必需:摄像头的输入流列表。更多信息请参见文档。
inputs:
# 必需:流的路径
# 注意路径可以包含环境变量或docker secrets必须以'FRIGATE_'开头并在{}中引用
- path: rtsp://viewer:{FRIGATE_RTSP_PASSWORD}@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
# 必需此流的角色列表。有效值为audio音频,detect检测,record录制
# 注意除了分配audio、detect和record角色外
# 它们还必须在摄像头配置中启用。
roles:
- audio
- detect
- record
# 可选:流特定的全局参数(默认值:继承)
# global_args:
# 可选:流特定的硬件加速参数(默认值:继承)
# hwaccel_args:
# 可选:流特定的输入参数(默认值:继承)
# input_args:
# 可选:摄像头特定的全局参数(默认值:继承)
# global_args:
# 可选:摄像头特定的硬件加速参数(默认值:继承)
# hwaccel_args:
# 可选:摄像头特定的输入参数(默认值:继承)
# input_args:
# 可选:摄像头特定的输出参数(默认值:继承)
# output_args:
# 可选:允许最高评分图像被新图像替换前的超时时间(默认值:如下所示)
best_image_timeout: 60
# 可选从系统页面直接访问摄像头Web界面的URL。可能并非所有摄像头都支持。
webui_url: ""
# 可选:此摄像头的区域配置
zones:
# 必需:区域名称,目前仅能使用英文数字与下划线
# 注意:这必须与任何摄像头名称不同,但可以与其他摄像头上的
# 另一个区域名称相匹配。
front_steps: # 前台阶
# 必需定义区域多边形的x,y坐标列表。
# 注意:区域内的存在仅基于对象边界框的底部中心进行评估。
coordinates: 0.033,0.306,0.324,0.138,0.439,0.185,0.042,0.428
# 可选启用速度估算的4边形区域的实际距离默认值
# 按区域点坐标的顺序列出距离并使用ui配置中定义的单位系统
distances: 10,15,12,11
# 可选:对象被视为在区域内所需的连续帧数(默认值:如下所示)。
inertia: 3
# 可选:对象必须在区域内停留的秒数才被视为在区域内(默认值:如下所示)
loitering_time: 0
# 可选:可以触发此区域的对象列表(默认值:所有被跟踪的对象)
objects:
- person # 人
# 可选:区域级别的对象过滤器。
# 注意:全局和摄像头过滤器在上游应用。
filters:
person: # 人
min_area: 5000
max_area: 100000
threshold: 0.7
# 可选通过MQTT发布的jpg快照配置
mqtt:
# 可选启用通过MQTT发布摄像头快照默认值如下所示
# 注意:仅适用于通过'frigate/<camera_name>/<object_name>/snapshot'发布图像数据到MQTT。
# 所有其他消息仍将被发布。
enabled: True
# 可选:在快照上打印时间戳(默认值:如下所示)
timestamp: True
# 可选:在快照上绘制边界框(默认值:如下所示)
bounding_box: True
# 可选:裁剪快照(默认值:如下所示)
crop: True
# 可选:调整快照的高度(默认值:如下所示)
height: 270
# 可选jpeg编码质量默认值如下所示
quality: 70
# 可选限制MQTT消息仅发送进入所列区域的对象默认值无必需区域
required_zones: []
# 可选摄像头在GUI中的处理配置
ui:
# 可选调整摄像头在UI中的排序。数字越大显示越靠后默认值如下所示
# 默认情况下摄像头按字母顺序排序。
order: 0
# 可选是否在Frigate UI中显示该摄像头默认值如下所示
dashboard: True
# 可选连接到ONVIF摄像头
# 以启用PTZ控制功能
onvif:
# 必需:要连接的摄像头主机
# 注意默认使用HTTP如果指定scheme也支持HTTPS例如"https://0.0.0.0"
host: 0.0.0.0
# 可选设备的ONVIF端口默认值如下所示
port: 8000
# 可选:登录用户名
# 注意某些设备需要管理员权限才能访问ONVIF
user: admin
# 可选:登录密码
password: admin
# 可选跳过ONVIF服务器的TLS验证默认值如下所示
tls_insecure: False
# 可选:忽略认证过程中摄像头与服务器的时间同步差异
# 建议在两端都使用NTP由于存在安全风险只应在"安全"环境中将此设置为True
ignore_time_mismatch: False
# 可选PTZ摄像头对象自动跟踪功能。通过自动移动PTZ摄像头
# 将移动对象保持在画面中心。
autotracking:
# 可选:启用/禁用对象自动跟踪(默认值:如下所示)
enabled: False
# 可选:启动时校准摄像头(默认值:如下所示)
# 校准会逐步移动PTZ并测量移动所需时间。
# 结果用于帮助估计摄像头移动后跟踪对象的位置。
# Frigate会在校准后自动更新配置文件
# 为摄像头添加"movement_weights"条目。之后应将calibrate_on_startup设为False。
calibrate_on_startup: False
# 可选:自动跟踪期间对对象进行缩放的模式(默认值:如下所示)
# 可用选项有disabled禁用、absolute绝对和relative相对
# disabled - 不对自动跟踪的对象进行缩放,仅使用平移/倾斜
# absolute - 使用绝对缩放大多数PTZ摄像头支持
# relative - 使用相对缩放并非所有PTZ都支持但可以实现同步平移/倾斜/缩放运动)
zooming: disabled
# 可选:改变自动跟踪对象缩放行为的数值(默认值:如下所示)
# 较低的值会在跟踪对象周围保留更多场景。
# 较高的值会更多地放大跟踪对象但Frigate可能会更快失去跟踪。
# 该值应在0.1到0.75之间
zoom_factor: 0.3
# 可选从labelmap.txt中要跟踪的对象列表默认值如下所示
track:
- person # 人
# 必需:当对象进入任何列出的区域时开始自动跟踪
required_zones:
- zone_name
# 必需跟踪结束后返回的ONVIF预设名称默认值如下所示
return_preset: home
# 可选:返回预设前的延迟秒数(默认值:如下所示)
timeout: 10
# 可选:摄像头校准自动生成的值。请勿手动修改(默认值:如下所示)
movement_weights: []
# 可选:鸟瞰图中摄像头的排序配置
birdseye:
# 可选:调整鸟瞰图中摄像头的排序。数字越大显示越靠后(默认值:如下所示)
# 默认情况下摄像头按字母顺序排序。
order: 0
# 可选AI生成的跟踪对象描述配置
genai:
# 可选启用AI描述生成默认值如下所示
enabled: False
# 可选:使用对象快照而非缩略图进行描述生成(默认值:如下所示)
use_snapshot: False
# 可选:生成描述的默认提示。可以使用替换变量
# 如"label"、"sub_label"、"camera"来使其更加动态(默认值:如下所示)
prompt: "请分析以下监控摄像头画面中的'{label}'元素,尽可能详细描述其动作、行为和潜在意图,同时避免描述背景环境。"
# 可选:自定义描述结果的对象特定提示
# 格式:{label}: {prompt}
object_prompts:
person: "分析画面中人物的行为特征,包括动作方向、停留时间和可能的意图,但不要描述周围环境。"
# 可选:要生成描述的对象(默认值:所有被跟踪的对象)
objects:
- person # 人
- cat # 猫
# 可选:限制描述生成仅针对进入所列区域的对象(默认值:无限制,所有区域都适用)
required_zones: []
# 可选触发将跟踪对象的帧发送给生成式AI的条件默认值如下所示
send_triggers:
# 当对象不再被跟踪时
tracked_object_end: True
# 可选在收到X次重要更新后默认值如下所示
after_significant_updates: None
# 可选保存发送给生成式AI的缩略图以供审查/调试(默认值:如下所示)
debug_save_thumbnails: False
# 可选UI配置
ui:
# 可选设置UI中使用的时区默认值使用浏览器本地时间
# timezone: America/Denver
# 可选:设置使用的时间格式
# 选项有browser浏览器默认、12hour12小时制或24hour24小时制默认值如下所示
time_format: browser
# 可选:设置指定长度的日期样式
# 选项有full完整、long、medium、short
# 示例:
# short: 2/11/23
# medium: Feb 11, 2023
# full: Saturday, February 11, 2023
# (默认值:如下所示)
date_style: short
# 可选:设置指定长度的时间样式
# 选项有full完整、long、medium、short
# 示例:
# short: 8:14 PM
# medium: 8:15:22 PM
# full: 8:15:22 PM Mountain Standard Time
# (默认值:如下所示)
time_style: medium
# 可选:手动覆盖日期/时间样式使用strftime格式
# https://www.gnu.org/software/libc/manual/html_node/Formatting-Calendar-Time.html
# 可能的值如上所示(默认值:未设置)
strftime_fmt: "%Y/%m/%d %H:%M"
# 可选:设置单位系统为"imperial"(英制)或"metric"公制默认值metric
# 用于UI和MQTT主题
unit_system: metric
# 可选:遥测配置
telemetry:
# 可选用于带宽统计监控的启用网络接口默认值空列表让nethogs搜索所有接口
network_interfaces:
- eth
- enp
- eno
- ens
- wl
- lo
# 可选:配置系统统计
stats:
# 可选启用AMD GPU统计默认值如下所示
amd_gpu_stats: True
# 可选启用Intel GPU统计默认值如下所示
intel_gpu_stats: True
# 可选将GPU视为SR-IOV以修复GPU统计默认值如下所示
sriov: False
# 可选启用摄像头ffmpeg进程、go2rtc和对象检测器的网络带宽统计监控默认值如下所示
# 注意容器必须具有特权或启用cap_net_admin、cap_net_raw能力
network_bandwidth: False
# 可选:启用最新版本检查(默认值:如下所示)
# 注意如果使用Home Assistant集成禁用此功能将阻止它报告新版本
version_check: True
# 可选:摄像头组配置(默认值:未设置任何组)
# 注意建议使用UI来设置摄像头组
camera_groups:
# 必需:摄像头组名称,目前仅能使用英文数字与下划线
front:
# 必需:组中的摄像头列表
cameras:
- front_cam # 前摄像头
- side_cam # 侧摄像头
- front_doorbell_cam # 前门铃摄像头
# 必需:组使用的图标
icon: LuCar
# 必需:该组的索引
order: 0
```

View File

@ -0,0 +1,167 @@
---
id: restream
title: 重流功能
---
## RTSP重流
Frigate可以将您的视频流重新以RTSP协议流式传输供其他应用程序如Home Assistant使用地址为`rtsp://<frigate_host>:8554/<camera_name>`。必须开放8554端口。[这样您就可以同时使用一个视频流进行Frigate检测和Home Assistant实时查看而无需与摄像头建立两个独立连接](#reduce-connections-to-camera)。视频流直接从原始视频流复制避免重新编码。此流不包含Frigate的任何标注。
Frigate使用[go2rtc](https://github.com/AlexxIT/go2rtc/tree/v1.9.9)提供重流和MSE/WebRTC功能。go2rtc配置位于配置文件的`go2rtc`部分,更多高级配置和功能请参阅[go2rtc文档](https://github.com/AlexxIT/go2rtc/tree/v1.9.9#configuration)。
:::note
您可以通过`/api/go2rtc/streams`访问go2rtc流信息这对调试很有帮助也能提供有关摄像头流的有用信息。
:::
### 鸟瞰图重流
鸟瞰图RTSP重流可通过`rtsp://<frigate_host>:8554/birdseye`访问。启用鸟瞰图重流将使鸟瞰图24/7运行这可能会略微增加CPU使用率。
```yaml
birdseye:
restream: True
```
### 使用认证保护重流
go2rtc重流可以通过基于RTSP的用户名/密码认证进行保护。例如:
```yaml
go2rtc:
rtsp:
username: "admin"
password: "pass"
streams: ...
```
**注意:**这不适用于本地主机请求当使用重流作为Frigate摄像头源时无需提供凭据。
## 减少摄像头连接数
某些摄像头仅支持一个活动连接或者您可能只想与摄像头保持单一连接。RTSP重流使这成为可能。
### 单流配置
与摄像头建立一个连接。一个用于重流,`detect`和`record`连接到重流。
```yaml
go2rtc:
streams:
name_your_rtsp_cam: # <- RTSP流
- rtsp://192.168.1.5:554/live0 # <- 支持视频和AAC音频的流
- "ffmpeg:name_your_rtsp_cam#audio=opus" # <- 将音频转码为缺失编解码器(通常是opus)的流副本
name_your_http_cam: # <- 其他流
- http://192.168.50.155/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=user&password=password # <- 支持视频和AAC音频的流
- "ffmpeg:name_your_http_cam#audio=opus" # <- 将音频转码为缺失编解码器(通常是opus)的流副本
cameras:
name_your_rtsp_cam:
ffmpeg:
output_args:
record: preset-record-generic-audio-copy
inputs:
- path: rtsp://127.0.0.1:8554/name_your_rtsp_cam # <--- 这里的名称必须与重流中的摄像头名称匹配
input_args: preset-rtsp-restream
roles:
- record
- detect
- audio # <- 仅在启用音频检测时需要
name_your_http_cam:
ffmpeg:
output_args:
record: preset-record-generic-audio-copy
inputs:
- path: rtsp://127.0.0.1:8554/name_your_http_cam # <--- 这里的名称必须与重流中的摄像头名称匹配
input_args: preset-rtsp-restream
roles:
- record
- detect
- audio # <- 仅在启用音频检测时需要
```
### 子流配置
与摄像头建立两个连接。一个用于子流,一个用于重流,`record`连接到重流。
```yaml
go2rtc:
streams:
name_your_rtsp_cam:
- rtsp://192.168.1.5:554/live0 # <- 支持视频和AAC音频的流仅适用于RTSP流HTTP必须使用ffmpeg
- "ffmpeg:name_your_rtsp_cam#audio=opus" # <- 将音频转码为opus的流副本
name_your_rtsp_cam_sub:
- rtsp://192.168.1.5:554/substream # <- 支持视频和AAC音频的流仅适用于RTSP流HTTP必须使用ffmpeg
- "ffmpeg:name_your_rtsp_cam_sub#audio=opus" # <- 将音频转码为opus的流副本
name_your_http_cam:
- http://192.168.50.155/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=user&password=password # <- 支持视频和AAC音频的流仅适用于RTSP流HTTP必须使用ffmpeg
- "ffmpeg:name_your_http_cam#audio=opus" # <- 将音频转码为opus的流副本
name_your_http_cam_sub:
- http://192.168.50.155/flv?port=1935&app=bcs&stream=channel0_ext.bcs&user=user&password=password # <- 支持视频和AAC音频的流仅适用于RTSP流HTTP必须使用ffmpeg
- "ffmpeg:name_your_http_cam_sub#audio=opus" # <- 将音频转码为opus的流副本
cameras:
name_your_rtsp_cam:
ffmpeg:
output_args:
record: preset-record-generic-audio-copy
inputs:
- path: rtsp://127.0.0.1:8554/name_your_rtsp_cam # <--- 这里的名称必须与重流中的摄像头名称匹配
input_args: preset-rtsp-restream
roles:
- record
- path: rtsp://127.0.0.1:8554/name_your_rtsp_cam_sub # <--- 这里的名称必须与重流中的camera_sub名称匹配
input_args: preset-rtsp-restream
roles:
- audio # <- 仅在启用音频检测时需要
- detect
name_your_http_cam:
ffmpeg:
output_args:
record: preset-record-generic-audio-copy
inputs:
- path: rtsp://127.0.0.1:8554/name_your_http_cam # <--- 这里的名称必须与重流中的摄像头名称匹配
input_args: preset-rtsp-restream
roles:
- record
- path: rtsp://127.0.0.1:8554/name_your_http_cam_sub # <--- 这里的名称必须与重流中的camera_sub名称匹配
input_args: preset-rtsp-restream
roles:
- audio # <- 仅在启用音频检测时需要
- detect
```
## 处理复杂密码
go2rtc期望配置中使用URL编码的密码可以使用[urlencoder.org](https://urlencoder.org)进行编码。
例如:
```yaml
go2rtc:
streams:
my_camera: rtsp://username:$@foo%@192.168.1.100
```
编码后变为:
```yaml
go2rtc:
streams:
my_camera: rtsp://username:$%40foo%25@192.168.1.100
```
更多信息请参阅[此评论](https://github.com/AlexxIT/go2rtc/issues/1217#issuecomment-2242296489)。
## 高级重流配置
go2rtc中的[exec](https://github.com/AlexxIT/go2rtc/tree/v1.9.9#source-exec)源可用于自定义ffmpeg命令。示例如下
注意:输出需要使用两个大括号`{{output}}`传递
```yaml
go2rtc:
streams:
stream1: exec:ffmpeg -hide_banner -re -stream_loop -1 -i /media/BigBuckBunny.mp4 -c copy -rtsp_transport tcp -f rtsp {{output}}
```

View File

@ -0,0 +1,75 @@
---
id: review
title: 视频回放
---
Frigate用户界面中的"视频回放"页面用于快速查看摄像头拍摄到的历史感兴趣片段。**回放条目**在垂直时间轴上显示,并以预览网格形式呈现 - 这些是经过带宽优化的低帧率、低分辨率视频。将鼠标悬停或滑动预览会播放视频并将其标记为已查看。如果需要更深入的分析,可以点击/轻触预览,将显示全帧率、全分辨率的录像。
回放条目可按日期、对象类型和摄像头进行筛选。
### 回放条目 vs 追踪对象(原"事件")
在Frigate 0.13及更早版本中,用户界面显示的是"事件"。一个事件等同于一个被追踪或检测到的对象。在Frigate 0.14及更高版本中,回放条目是一个时间段,其中可能有任意数量的追踪对象处于活动状态。
举例来说,假设有两个人从您家门前走过,其中一人牵着一条狗。与此同时,一辆汽车从他们身后的街道驶过。
在此场景下Frigate 0.13及更早版本会在界面中显示4个"事件" - 每个人一个狗一个汽车一个。即使这些事件在时间上重叠您也需要分别观看4段视频。
在0.14及更高版本中,所有这些活动都被打包成一个单独的回放条目,其开始和结束时间涵盖了所有这些活动。同一摄像头的回放条目不会重叠。一旦您观看了该摄像头的那段时间录像,它就会被标记为已查看。
## 警报与检测
Frigate捕获的每段视频对您的重要程度可能不同。进入您房产范围内的人员视频可能与在人行道上行走的人员具有不同的优先级。因此Frigate 0.14将回放条目分类为**警报**和**检测**。默认情况下,所有人员和汽车对象都被视为警报。您可以通过为它们配置所需的区域来细化回放条目的分类。
## 限制警报的标签类型
默认情况下,只有当检测到人员或汽车时,回放条目才会被标记为警报。可以通过以下配置将其设置为包含任何对象或音频标签:
```yaml
# 可在摄像头级别覆盖此设置
review:
alerts:
labels:
- car
- cat
- dog
- person
- speech
```
## 限制检测的标签类型
默认情况下,所有不符合警报条件的检测都符合检测条件。但是,可以进一步过滤检测,使其仅包含某些标签或某些区域。
```yaml
# 可在摄像头级别覆盖此设置
review:
detections:
labels:
- bark
- dog
```
## 从警报或检测中排除摄像头
要从警报或检测中排除特定摄像头,只需**在摄像头级别**为alerts或detections字段提供一个空列表。
例如,要从检测中排除摄像头**gatecamera**上的对象,请在配置中包含以下内容:
```yaml
cameras:
gatecamera:
review:
detections:
labels: [] # <- labels提供一个空数组即可
```
## 将回放条目限制在特定区域
默认情况下,如果在摄像头画面的任何位置检测到任何`review -> alerts -> labels`和`review -> detections -> labels`,就会创建一个回放条目。您可能需要配置回放条目,使其仅在对象进入感兴趣区域时才创建,[详见区域文档](./zones.md#restricting-alerts-and-detections-to-specific-zones)
:::info
由于区域不适用于音频,音频标签默认始终会被标记为检测。
:::

View File

@ -0,0 +1,116 @@
---
id: semantic_search
title: 语义搜索
---
Frigate中的语义搜索功能允许您通过图像本身、用户定义的文本描述或自动生成的描述来查找回顾项目中的跟踪对象。该功能通过为跟踪对象的图像和文本描述创建_嵌入向量_(数值向量表示)来实现。通过比较这些嵌入向量Frigate评估它们的相似度以提供相关的搜索结果。
Frigate使用来自[Jina AI](https://huggingface.co/jinaai)的模型创建嵌入向量并保存到Frigate数据库中。所有处理都在本地运行。
语义搜索功能可通过Frigate网页中的 **浏览** 页面访问。
## 最低系统要求
语义搜索通过在本地系统上运行大型AI模型实现。树莓派等小型或性能不足的系统可能无法可靠运行或完全无法运行语义搜索。
使用语义搜索至少需要8GB内存。虽然GPU不是严格必需的但相比仅使用CPU的系统GPU能显著提升性能。
为获得最佳性能建议使用16GB或更多内存和专用GPU。
## 配置
语义搜索默认禁用必须在配置文件或UI设置页面中启用后才能使用。语义搜索是全局配置设置。
```yaml
semantic_search:
enabled: True
reindex: False
```
:::tip
通过添加`reindex: True`到`semantic_search`配置中或在UI的搜索设置页面切换开关并重启Frigate可以从数据库中现有的跟踪对象重新创建嵌入向量索引。根据跟踪对象的数量此过程可能需要较长时间并可能在索引时使CPU达到最大负载。确保在再次重启Frigate前关闭UI中的开关或将配置改回`False`。
如果是首次启用语义搜索请注意Frigate不会自动为较旧的跟踪对象创建索引。您需要启用`reindex`功能来完成此操作。
:::
### Jina AI CLIP (版本1)
[Jina的V1模型](https://huggingface.co/jinaai/jina-clip-v1)具有视觉模型,能够将图像和文本嵌入到相同的向量空间中,从而实现`图像->图像`和`文本->图像`的相似性搜索。Frigate使用此模型对跟踪对象进行编码将缩略图图像存储在数据库中。当通过搜索框中的文本搜索跟踪对象时Frigate将执行`文本->图像`相似性搜索。当在跟踪对象详情面板中点击"查找相似"时Frigate将执行`图像->图像`相似性搜索以检索最匹配的缩略图。
V1文本模型用于嵌入跟踪对象描述并对其执行搜索。描述可以在浏览页面点击跟踪对象缩略图时创建、查看和修改。有关如何自动生成跟踪对象描述的更多信息请参阅[生成式AI文档](/configuration/genai.md)。
通过设置`model_size`配置选项为`small`或`large`可以选择不同权重的Jina模型版本
```yaml
semantic_search:
enabled: True
model: "jinav1"
model_size: small
```
- 配置`large`模型将使用完整的Jina模型如果适用会自动在GPU上运行。
- 配置`small`模型将使用量化版本的Jina模型占用更少内存并在CPU上运行嵌入质量差异可以忽略不计。
### Jina AI CLIP (版本2)
Frigate也支持[Jina的V2模型](https://huggingface.co/jinaai/jina-clip-v2),该模型引入了多语言支持(89种语言)。相比之下V1模型仅支持英语。
V2在文本-图像和文本-文本检索任务中仅比V1有3%的性能提升这种改进不太可能带来明显的实际好处。此外V2对RAM和GPU的要求显著提高导致推理时间和内存使用增加。如果您计划使用V2请确保系统有充足的内存和独立GPU。不建议在CPU上使用V2的`small`模型进行推理。
要使用V2模型请更新配置中的`model`参数:
```yaml
semantic_search:
enabled: True
model: "jinav2"
model_size: large
```
对于大多数用户特别是英语母语者V1模型仍然是推荐选择。
:::note
在V1和V2之间切换需要重新创建嵌入向量索引。为此在语义搜索配置中设置`reindex: True`并重启Frigate。V1和V2的嵌入向量不兼容如果不重新索引将导致搜索结果不正确。
:::
### GPU加速
CLIP模型以ONNX格式下载当可用时`large`模型可以使用GPU硬件加速。这取决于使用的Docker构建版本。
```yaml
semantic_search:
enabled: True
model_size: large
```
:::info
如果使用了适合您GPU的正确构建版本并配置了`large`模型GPU将被自动检测并使用。
**注意:** 对象检测和语义搜索是独立的功能。如果想在语义搜索中使用GPU必须选择适合您GPU的Frigate Docker镜像。
- **AMD**
- 在`-rocm` Frigate镜像中ROCm将被自动检测并用于语义搜索。
- **Intel**
- 在默认Frigate镜像中OpenVINO将被自动检测并用于语义搜索。
- **Nvidia**
- 在`-tensorrt` Frigate镜像中Nvidia GPU将被自动检测并用于语义搜索。
- 在`-tensorrt-jp(4/5)` Frigate镜像中Jetson设备将被自动检测并用于语义搜索。
:::
## 使用方法和最佳实践
1. 语义搜索与浏览页面上的其他过滤器结合使用效果最佳。结合传统过滤和语义搜索可获得最佳结果。
2. 当搜索场景中的特定对象时使用缩略图搜索类型。当尝试辨别对象意图时使用描述搜索类型。
3. 由于Frigate使用的AI模型训练方式在多模态(缩略图和描述)搜索中,匹配描述的结果通常会先出现,即使缩略图嵌入可能是更好的匹配。尝试调整"搜索类型"设置以帮助找到所需内容。请注意,如果仅为特定对象或区域生成描述,可能导致搜索结果优先显示有描述的对象,即使没有描述的对象更相关。
4. 使搜索语言和语气与您要查找的内容紧密匹配。如果使用缩略图搜索,将查询短语作为图像标题。搜索"红色汽车"可能不如"阳光明媚的住宅区街道上行驶的红色轿车"效果好。
5. 缩略图的语义搜索在匹配占据大部分画面的大主体时效果更好。"猫"等小物体往往效果不佳。
6. 多尝试!找到一个想测试的跟踪对象,开始输入关键词和短语,看看什么对您有效。

View File

@ -0,0 +1,12 @@
---
id: snapshots
title: 快照功能
---
Frigate可以为每个检测到的对象保存快照图片到`/media/frigate/clips`目录,文件命名为`<摄像头名称>-<ID>.jpg`格式。这些快照也可以通过[API接口](../integrations/api/event-snapshot-events-event-id-snapshot-jpg-get.api.mdx)访问。
对于启用了Frigate+的用户快照可以在Frigate+面板中查看方便快速提交到Frigate+服务。
如果只想保存进入特定区域的对象的快照,请参阅[区域文档](./zones.md#restricting-snapshots-to-specific-zones)中的相关说明。
通过MQTT发送的快照配置可以在[配置文件](https://docs.frigate.video/configuration/)中的`cameras -> your_camera -> mqtt`部分设置。

View File

@ -0,0 +1,54 @@
---
id: stationary_objects
title: 静止对象检测
---
## 什么是静止对象?
当被追踪的对象在连续多帧中保持几乎相同的位置时Frigate会将其判定为静止对象。这个判定阈值可在配置文件的`detect -> stationary -> threshold`中设置默认值为帧率的10倍即10秒。一旦对象被判定为静止除非检测到其内部发生运动或位置变化否则将保持静止状态。
## 静止对象检测的意义
对象被判定为静止后Frigate将不再持续对其运行对象检测。这能有效降低资源消耗避免对无运动变化的对象进行冗余检测。同时使系统具备上下文感知能力例如可以[选择性保留录像片段](record.md#不同保留模式的含义),仅记录对象处于活动状态的时段。
需要注意的是,单纯的光线变化(如停放的车辆受光照变化)不会使静止对象重新变为活动状态。
## 参数调优
默认配置如下:
```yaml
detect:
stationary:
interval: 50 # 检测间隔帧数
threshold: 50 # 静止判定阈值
```
- `interval`设置对静止对象运行检测的频率。默认每50帧检测一次确保对象仍然存在
- `threshold`:对象需要保持静止的连续帧数才能被判定为静止
注意:无法通过调整`interval`完全禁用静止对象追踪。
## 技术实现原理
Frigate并非从一开始就支持静止对象追踪功能。让我们通过一个实际案例说明其必要性
假设需要记录所有进入车道的车辆:
1. 简单方案:仅在车道区域检测到运动时运行对象检测
- 但无法确定车辆的行驶轨迹(左转/右转进入)
- 无法关联之前在路边停留的车辆
- 当车道附近有人修剪草坪时,难以区分车辆和园丁的运动
2. 进阶方案通过对象追踪赋予唯一ID
- 需要解决多目标交叉时的ID分配问题
- 当被追踪车辆接近路边停放的车辆时:
- 车灯反射会导致误检测出多个车辆
- 原有单一检测框突然变成多个检测框
- 传统算法(如卡尔曼滤波)在这种情况下错误率较高
3. 静止对象追踪的优势:
- 预先标记路边停放车辆为静止对象
- 新出现的车辆会被识别为独立目标
- 大幅降低ID分配错误率虽然仍不完美
当前系统最大的挑战是处理对象完全遮挡的情况(如一辆车完全挡住另一辆车)。这是未来版本需要改进的方向。

View File

@ -0,0 +1,72 @@
---
id: tls
title: TLS安全传输
---
# TLS安全传输
Frigate内置的NGINX服务器支持TLS证书。默认情况下Frigate会生成自签名证书用于8971端口。本系统设计上兼容各类证书管理工具方便用户自由选择。
## 应用场景
多数情况下Frigate运行在反向代理后方由代理统一管理TLS证书。此时您可能需要
- 在代理配置中允许自签名证书
- 或直接禁用Frigate的TLS功能
但若Frigate运行在独立设备或直接暴露在公网时建议配置有效证书。
## 禁用TLS
在配置文件中添加以下内容即可禁用TLS
```yaml
tls:
enabled: False
```
## 证书配置
### 基本配置
通过绑定挂载或Docker卷加载证书文件到指定路径
```yaml
frigate:
volumes:
- /证书目录路径:/etc/letsencrypt/live/frigate:ro
```
目录结构要求:
- 私钥文件必须命名为`privkey.pem`
- 证书文件必须命名为`fullchain.pem`
### Certbot用户注意
由于Certbot使用符号链接需额外挂载archive目录
```yaml
frigate:
volumes:
- /etc/letsencrypt/live/frigate:/etc/letsencrypt/live/frigate:ro
- /etc/letsencrypt/archive/frigate:/etc/letsencrypt/archive/frigate:ro
```
## 证书自动更新
Frigate会每分钟比对证书指纹当检测到变更时自动重载NGINX配置。使用有效证书时建议将8971端口映射到443端口
:::warning
如果您在中国大陆地区,家用宽带运营商会屏蔽掉`80`和`443`等端口,这种情况建议换为其他端口,例如`1443`
:::
```yaml
frigate:
ports:
- "443:8971" # <- 左边为宿主机端口右边为容器端口需要注意国内家用宽带无法使用443端口
```
## ACME验证支持
Frigate支持托管ACME验证文件HTTP验证方式需将验证文件挂载到
```
/etc/letsencrypt/www
```

View File

@ -0,0 +1,176 @@
---
id: zones
title: 监控区
---
监控区允许您定义画面中的特定区域,并为对象类型应用额外的过滤器,从而判断对象是否位于该区内。系统会根据对象边界框的底部中心点来评估是否进入监控区,边界框与区的重叠面积不影响判断。
例如下图中的猫当前位于监控区1但**不在**监控区2。
![底部中心点判断](/img/bottom-center.jpg)
监控区不能与摄像头同名。如需在多摄像头覆盖同一区域时使用相同监控区,可以为每个摄像头配置同名的区。
调试时,请启用摄像头调试视图中的"监控区"选项(设置 --> 调试),以便根据需要调整。当任何对象进入区时,区边界线会变粗。
创建监控区的步骤与[创建"运动遮罩"](masks.md)类似,只需在网页界面使用创建区的功能即可。
### 限定警报和检测到特定区
通常您可能希望仅当对象进入关注区域时才创建警报。这可以通过设置`required_zones`来实现。例如,仅当对象进入整个院子区时才创建警报,配置如下:
```yaml
cameras:
您的摄像头名称:
review:
alerts:
required_zones:
- entire_yard
zones:
entire_yard:
coordinates: ...
```
您可能还想限定检测仅在对象进入次要关注区时创建。例如,当对象进入院子内部区域时触发警报,但进入院子边缘时就创建检测记录:
```yaml
cameras:
您的摄像头名称:
review:
alerts:
required_zones:
- inner_yard
detections:
required_zones:
- edge_yard
zones:
edge_yard:
coordinates: ...
inner_yard:
coordinates: ...
```
### 限定快照到特定区
```yaml
cameras:
您的摄像头名称:
snapshots:
required_zones:
- entire_yard
zones:
entire_yard:
coordinates: ...
```
### 限定区内的对象类型
有时需要限制区只对特定对象类型生效,以便更精细地控制警报、检测和快照的保存。以下示例将限制一个区只对人有效,另一个区只对车辆有效。
```yaml
cameras:
您的摄像头名称:
zones:
entire_yard:
coordinates: ... (您希望检测人的区域)
objects:
- person
front_yard_street:
coordinates: ... (仅街道区域)
objects:
- car
```
只有车辆对象能触发`front_yard_street`区,只有人能触发`entire_yard`区。系统会追踪进入院子任何位置的人,以及进入街道区域的车辆。
### 区内滞留检测
当需要检测对象在区内异常滞留时,可以配置最小滞留时间阈值(单位:秒):
```yaml
cameras:
您的摄像头名称:
zones:
sidewalk:
loitering_time: 4
objects:
- person
```
### 区进入延迟
为防止边界框判断误差导致误报,可以设置对象必须连续多帧位于区内才视为有效进入:
```yaml
cameras:
您的摄像头名称:
zones:
front_yard:
inertia: 3
objects:
- person
```
对于需要快速响应的场景如车辆驶入车道可将延迟设为1
```yaml
cameras:
您的摄像头名称:
zones:
driveway_entrance:
inertia: 1
objects:
- car
```
### 速度估算
Frigate可以估算对象在区内的移动速度。此功能需要将区定义为4个点并测量实际距离。最适合用于监测道路上车辆的速度。
![地面平面4点区](/img/ground-plane.jpg)
速度估算需要对象被追踪足够多帧才能计算因此区应远离对象进出位置。_区不应占据整个画面_。对象速度会在其位于区内时持续计算并存入数据库。
配置中需通过`distances`字段指定各点间的实际距离:
```yaml
cameras:
您的摄像头名称:
zones:
street:
coordinates: 0.033,0.306,0.324,0.138,0.439,0.185,0.042,0.428
distances: 10,12,11,13.5 # 单位米或英尺
```
距离单位由`ui`配置决定:
```yaml
ui:
# 可选"metric"(公制)或"imperial"(英制),默认为公制
unit_system: metric
```
估算速度会显示在调试视图和MQTT事件中详见[MQTT文档](../integrations/mqtt.md#frigateevents)。
#### 最佳实践与注意事项
- 最适合直线道路场景,转弯会导致估算不准
- 确保对象底部中心点直线穿过区且不被遮挡
- 可适当降低`inertia`值提高响应速度
- 实际测量越精确,估算越准确(但需注意透视失真影响)
- 离开区后速度数据可能不准确
- **仅为估算值**,不适用于执法用途
### 速度阈值
可设置区的最小速度要求,只有达到该速度的对象才会被视为进入区:
```yaml
cameras:
您的摄像头名称:
zones:
sidewalk:
coordinates: ...
distances: ...
inertia: 1
speed_threshold: 20 # 单位取决于unit_system设置
```

View File

@ -0,0 +1,93 @@
---
id: contributing-boards
title: 社区支持的开发板
---
## 关于社区支持的开发板
有许多单板计算机(SBC)拥有热情的社区支持比如Jetson Nano。这些SBC通常具有专用硬件可以大大加速Frigate的AI和视频处理工作负载但这些硬件需要非常特定的框架来进行接口对接。
这意味着对Frigate的维护者来说要支持这些不同的开发板将非常困难特别是考虑到相对较小的用户群。
社区支持开发板框架允许社区用户通过提供代码、维护和用户支持成为某个SBC或其他检测器支持的代码所有者。
## 入门指南
1. 遵循[主要贡献文档](/development/contributing.md)中的步骤。
2. 在`docker/`下创建新的构建类型。
3. 确保构建按预期工作所有特定于开发板的更改都应在开发板特定的docker文件中完成。
## 必需的结构
每个开发板都有不同的构建要求,运行在不同的架构上等,但是所有开发板都需要一组特定的文件。
### Bake File .hcl
`board.hcl`文件允许社区开发板构建使用主构建作为缓存。这可以实现干净的基础和更快的构建时间。有关Bake文件中可用格式和选项的更多信息[请参见官方Buildx Bake文档](https://docs.docker.com/build/bake/reference/)。
### 开发板Make文件
`board.mk`文件允许将自动化和可配置的Make目标包含在主Make文件中。以下是此文件的一般格式
```Makefile
BOARDS += board # 将`board`替换为开发板后缀例如rpi
local-rpi: version
docker buildx bake --load --file=docker/board/board.hcl --set board.tags=frigate:latest-board bake-target # 将`board`替换为开发板后缀例如rpi。Bake目标是board.hcl文件中的目标例如board
build-rpi: version
docker buildx bake --file=docker/board/board.hcl --set board.tags=$(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH)-board bake-target # 将`board`替换为开发板后缀例如rpi。Bake目标是board.hcl文件中的目标例如board
push-rpi: build-rpi
docker buildx bake --push --file=docker/board/board.hcl --set board.tags=$(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH)-board bake-target # 将`board`替换为开发板后缀例如rpi。Bake目标是board.hcl文件中的目标例如board
```
### Dockerfile
`Dockerfile`用于编排构建这将根据开发板的不同而有很大差异但某些部分是必需的。以下是Dockerfile的必需部分
```Dockerfile
# syntax=docker/dockerfile:1.4
# https://askubuntu.com/questions/972516/debian-frontend-environment-variable
ARG DEBIAN_FRONTEND=noninteractive
# 所有特定于开发板的工作都应以`deps`为基础
FROM deps AS board-deps
# 执行特定于开发板的操作
# 设置工作目录
WORKDIR /opt/frigate/
# 从主Frigate构建中复制基础文件
COPY --from=rootfs / /
```
## 其他必需的更改
### CI/CD
每个开发板的镜像将在每个Frigate发布时构建这在`.github/workflows/ci.yml`文件中完成。需要在此处添加开发板构建工作流。
```yml
- name: Build and push board build
uses: docker/bake-action@v3
with:
push: true
targets: board # 这是board.hcl文件中的目标
files: docker/board/board.hcl # 应该用实际的开发板类型更新
# 标签也应该用实际的开发板类型更新
# 社区开发板构建永远不应推送到缓存,但可以从缓存中拉取
set: |
board.tags=ghcr.io/${{ steps.lowercaseRepo.outputs.lowercase }}:${{ github.ref_name }}-${{ env.SHORT_SHA }}-board
*.cache-from=type=gha
```
### 代码所有者文件
应更新`CODEOWNERS`文件以包含`docker/board`以及作为此开发板代码所有者的每个用户的`@user`。
## 文档
至少应更新`installation`、`object_detectors`、`hardware_acceleration`和`ffmpeg-presets`文档(如适用)以反映此社区开发板的配置。

View File

@ -0,0 +1,244 @@
---
id: contributing
title: 向主代码库贡献代码
---
## 获取源代码
### 核心、Web界面、Docker和文档
这个仓库包含了主要的Frigate应用程序及其所有依赖项。
将[blakeblackshear/frigate](https://github.com/blakeblackshear/frigate.git)复制(fork)到你自己的GitHub账户然后将复制的仓库克隆到你的本地机器。
从这里,按照以下指南进行操作:
- [核心](#core)
- [Web界面](#web-interface)
- [文档](#documentation)
### 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集成
这个仓库包含了自定义集成可以让你的Home Assistant安装自动为Frigate实例创建实体无论你是将Frigate作为独立的Docker容器运行还是作为[Home Assistant插件](#frigate-home-assistant-add-on)运行。
将[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}}`)。

View File

@ -0,0 +1,39 @@
---
id: camera_setup
title: 摄像头设置
---
配置输出H.264视频和AAC音频的摄像头可提供与Frigate及Home Assistant所有功能的最佳兼容性。H.265虽有更高压缩率但兼容性较差。仅Chrome 108+、Safari和Edge浏览器支持播放H.265且仅兼容有限的H.265配置方案。建议直接在摄像头中配置您希望在Frigate中使用的分辨率和帧率。在Frigate内降低帧率会浪费CPU资源解码被丢弃的冗余帧。您需要围绕以下三个目标调整视频流配置
- **检测**这是Frigate唯一会解码处理的视频流也是生成快照的来源。检测分辨率应根据目标物体大小进行调整详见[选择检测分辨率](#选择检测分辨率)。推荐帧率为5fps但对高速移动物体可能需要更高多数用户建议最大不超过10fps。更高的分辨率和帧率会导致服务器CPU负载升高。
- **录像**此视频流应设置为需要存储的参考分辨率通常使用摄像头支持的最高分辨率。建议在摄像头固件中将此流帧率设为15fps。
- **实时观看**此视频流将直接转播至Home Assistant的流媒体组件。设置过高分辨率会在观看时占用大量带宽低速网络连接下可能无法稳定加载。
### 选择检测分辨率
理想的检测分辨率应使目标物体完全适配Frigate使用的模型尺寸320x320。Frigate不会将整个画面传递给物体检测模块而是从全帧中裁剪运动区域进行分析。若检测区域大于320x320Frigate必须在检测前进行缩放。更高分辨率不会提升检测精度因为额外细节会在缩放过程中丢失。下方参考图展示了320x320区域在常见分辨率中的实际占比。
当目标物体在画面中非常小时,更高分辨率**确实**能提升性能。
![分辨率对照图](/img/resolutions-min.jpg)
### 摄像头配置示例
以大华/Loryta 5442摄像头为例推荐配置如下
**主码流录像与RTSP**
- 编码模式H.264
- 分辨率2688*1520
- 帧率15fps
- 关键帧间隔30也可设为15以优化流媒体性能详见[摄像头设置建议](/configuration/live#摄像头设置建议)
**子码流(检测)**
- 启用子码流2
- 编码模式H.264
- 分辨率1280*720
- 帧率5fps
- 关键帧间隔5

View File

@ -0,0 +1,57 @@
---
id: glossary
title: 术语表
---
本术语表解释Frigate文档中的常用术语。
## 边界框(Bounding Box)
物体检测模型返回的框选标记,用于标注画面中的物体。在调试视图中有多种颜色区分物体类型。
### 边界框颜色规则
- 启动时为不同物体类型分配不同颜色
- 深蓝色细线表示当前帧未检测到该物体
- 灰色细线表示物体被判定为静止状态
- 粗线表示该物体是自动追踪目标(启用时)
## 误报(False Positive)
物体类型的错误识别。例如将狗识别为人、椅子识别为狗等。注意:在需忽略区域检测到有效物体不属于误报。
## 遮罩(Mask)
Frigate包含两种遮罩类型。[详见遮罩文档](/configuration/masks)
### 动态遮罩(Motion Mask)
阻止指定区域的[动态变化](#motion)触发物体检测,但不会阻止因邻近区域动态变化而连带检测该区域物体。典型应用场景:摄像机时间戳、天空、树梢等。
### 物体遮罩(Object Mask)
丢弃底部中心点(无论重叠区域)位于遮罩区的所有边界框,强制将其判定为[误报](#false-positive)并忽略。
## 最低分(Min Score)
物体追踪过程中可接受的最低检测置信度,低于此分值的检测将被视为误报
## 动态(Motion)
当前帧与先前帧的像素差异。当大量相邻像素发生变化时,会在调试视图中以红色动态框标记。[详见动态检测文档](/configuration/motion_detection)
## 检测区域(Region)
送入物体检测的画面分区,触发条件包括:动态变化、活跃物体或静止物体偶发检测。调试视图中以绿色框显示。
## 待审条目(Review Item)
包含任意数量有效事件/被追踪物体的时间段。[详见审阅文档](/configuration/review)
## 快照分(Snapshot Score)
快照中显示的分数代表该物体在拍摄瞬间的置信度
## 判定阈值(Threshold)
物体必须达到的中位置信度,方可被判定为有效目标
## 峰值分(Top Score)
物体在整个追踪周期内的最高中位置信度
## 被追踪物体(旧称"事件"
从物体进入画面到离开画面的完整周期(含静止时段)。当满足[判定阈值](#threshold)且符合快照/录像保存条件时将被存储
## 监控区域(Zone)
用户定义的关注区域,可用于通知触发和限制[事件](#event)生成范围。[详见区域文档](/configuration/zones)

View File

@ -0,0 +1,206 @@
---
id: hardware
title: 推荐硬件
---
## 摄像头
能够输出H.264编码的视频和AAC音频的摄像头能最大限度兼容Frigate与Home Assistant的所有功能特性。如果摄像头支持多子码流配置就更好了这样可分别为物体检测、实时监控和录像存储设置不同分辨率避免转码带来的性能损耗。
建议使用支持RTSP流和ONVIF功能的摄像头例如海康威视、TP-Link等。**不建议**选择萤石等**家用摄像头**他们对于RTSP的支持并不完善尤其是不要选择360、小米等不支持获取RTSP流的摄像头它们无法接入到Frigate中。
同时应避免选择WiFi摄像头其视频流稳定性较差易导致连接中断或视频数据丢失。尤其是在有多路摄像头的情况下传输稳定性会受到极大干扰甚至会影响到你整个WiFi其他设备的使用。国内相关讨论https://www.v2ex.com/t/1126166
考虑到国内基本不会使用亚马逊来购买摄像头,并且推荐的摄像头并没有在国内发行或者为马甲型号,如果有必要,建议上京东购买。以下仅为官方文档中推荐的摄像头产品,适用于海外用户。
- <a href="https://amzn.to/4fwoNWA" target="_blank" rel="nofollow noopener sponsored">Loryta(Dahua) IPC-T549M-ALED-S3</a> (推广链接)
- <a href="https://amzn.to/3YXpcMw" target="_blank" rel="nofollow noopener sponsored">Loryta(Dahua) IPC-T54IR-AS</a> (推广链接)
- <a href="https://amzn.to/3AvBHoY" target="_blank" rel="nofollow noopener sponsored">Amcrest IP5M-T1179EW-AI-V3</a> (推广链接)
## 服务器
考虑到家用环境建议使用N100等低功耗CPU的主机否则你的电费可能会比以往高很多。这些在淘宝或者闲鱼上都能够找到不错的选择。但需要注意关注一下是否有额外的M.2或者PCIe接口因为可以选配Hailo8 或者 Google Coral 这种AI加速器能够极大的提升检测效率并且耗电量相比独立显卡要低很多。务必使用Linux系统例如unRAID、TrueNAS、飞牛等专门适配NAS的操作系统也可以直接安装常规的Linux发行版例如Ubuntu、Debian等。
## 检测器
检测器是专为高效运行物体识别推理而优化的硬件设备。使用推荐检测器可显著降低检测延迟并大幅提升每秒检测次数。Frigate的设计理念正是基于检测器硬件实现超低推理延迟——将TensorFlow任务卸载到专用检测器上其速度可提升一个数量级同时能极大降低CPU负载。
:::info
Frigate支持多种硬件平台的检测器方案
**通用硬件**
- [Hailo](#hailo-8): Hailo8和Hailo8L AI加速模块有M.2接口版本及树莓派HAT扩展版本。
- [支持多种模型](/configuration/object_detectors#配置)
- 最好使用 tiny/small 尺寸的模型
- [Google Coral EdgeTPU](#google-coral-tpu): Google Coral EdgeTPU 有USB/M.2两种版本
- [主要支持 ssdlite 和 mobilenet 模型](/configuration/object_detectors#edge-tpu检测器)
**AMD**
- [ROCm](#amd-gpus): ROCm 能够在AMD显卡上运行提供高效的检测功能
- [支持一部分模型](/configuration/object_detectors#支持的模型-1)
- 最好运行在AMD独显上
**Intel**
- [OpenVino](#openvino): OpenVino 可以运行在 Intel Arc独立显卡、Intel 核显以及Intel的CPU
- [支持大部分主流模型](/configuration/object_detectors#支持的模型)
- 推荐使用tiny/small/medium尺寸的模型
**Nvidia**
- [TensortRT](#tensorrt---nvidia-gpu): TensorRT可以运行在Nvidia显卡和Jetson开发板上
- [通过ONNX支持主流模型](/configuration/object_detectors#支持的模型-2)
- 可流畅运行包括large在内各尺寸模型
**Rockchip**
- [RKNN](#rockchip-platform): 需搭载NPU的瑞芯微芯片
- [支持少量模型](/configuration/object_detectors#支持的模型-5)
- 专为低功耗设备优化适合tiny/small模型
:::
### Hailo-8
Frigate可以使用Hailo-8或Hailo-8L AI加速器包括集成了Hailo模块的树莓派5。Frigate会自动识别你的Hailo类型并且能够在你没设置型号的情况下自动选择并选择模型。
**默认模型配置:**
- **Hailo-8L:** 默认模型为 **YOLOv6n**.
- **Hailo-8:** 默认模型为 **YOLOv6n**.
在实际环境中即使你有多路摄像头Frigate也能够表现出一致的性能。与树莓派相比在x86平台上Frigate能够获得更高的帧率、吞吐量和更低的延迟。
| 模型名称 | Hailo8 推理时间 | Hailo8L 推理时间 |
| ---------------- | ---------------------- | ----------------------- |
| ssd mobilenet v1 | ~ 6 ms | ~ 10 ms |
| yolov6n | ~ 7 ms | ~ 11 ms |
### Google Coral TPU
Frigate 同时支持 USB 和 M.2 两种版本的 Google Coral 加速模块:
- USB版兼容性最佳无需安装额外驱动但缺少自动温控节流功能长时间高负载可能降频
- PCIe 和 M.2 需要安装对应的驱动才能运行参考https://coral.ai
单个 Coral 使用默认模型即可处理多路摄像头,能满足大多数用户需求。你可以根据 Frigate 报告的推理速度计算 Coral 的最大性能:
当推理速度为 10ms 时,你的 Coral 最高可处理 1000/10=100即每秒 100 帧。如果你的检测帧率经常接近这个值你可以调整动态检测遮罩降低检测区域或考虑增加第二个Coral设备。
### OpenVINO
OpenVINO 检测器可在以下硬件平台上运行:
- 带集成显卡的第六代及以上 Intel 平台
- 配备 VPU 硬件的 x86 & arm64 主机(如 Intel NCS2
- 多数现代 AMD CPU虽然 Intel 官方未提供支持)
更多详细信息请参阅 [检测器文档](/configuration/object_detectors#openvino检测器)
推理速度因使用的CPU或GPU差异较大以下是部分已知GPU的推理时间示例
| Name | MobileNetV2 推理时间 | YOLO-NAS 推理时间 | RF-DETR 推理时间 | Notes |
| -------------------- | -------------------------- | ------------------------- | ------------------------- | -------------------------------------- |
| Intel i3 6100T | 15 - 35 ms | | | Can only run one detector instance |
| Intel i5 6500 | ~ 15 ms | | | |
| Intel i5 7200u | 15 - 25 ms | | | |
| Intel i5 7500 | ~ 15 ms | | | |
| Intel i3 8100 | ~ 15 ms | | | |
| Intel i5 1135G7 | 10 - 15 ms | | | |
| Intel i3 12000 | | 320: ~ 19 ms 640: ~ 54 ms | | |
| Intel i5 12600K | ~ 15 ms | 320: ~ 20 ms 640: ~ 46 ms | | |
| Intel i7 12650H | ~ 15 ms | 320: ~ 20 ms 640: ~ 42 ms | 336: 50 ms | |
| Intel N100 | ~ 15 ms | 320: ~ 20 ms | | |
| Intel Arc A380 | ~ 6 ms | 320: ~ 10 ms 640: ~ 22 ms | 336: 20 ms 448: 27 ms | |
| Intel Arc A750 | ~ 4 ms | 320: ~ 8 ms | | |
### TensorRT - Nvidia GPU
TensorRT检测器能够在配备支持CUDA 12.x系列库的NVIDIA GPU的x86主机上运行。主机系统的最低驱动版本必须为>=525.60.13且GPU需支持5.0或更高的计算能力。这通常对应于麦克斯韦架构Maxwell-era或更新的GPU更多信息请查阅 [TensorRT 文档](/configuration/object_detectors#nvidia-tensorrt检测器).
推理速度会因GPU和所用模型的不同而有显著差异。
`tiny`的变体比对应的非tiny模型更快以下是一些已知示例
| Name | YOLOv7 推理时间 | YOLO-NAS 推理时间 | RF-DETR 推理时间 |
| --------------- | --------------------- | ------------------------- | ------------------------- |
| GTX 1060 6GB | ~ 7 ms | | |
| GTX 1070 | ~ 6 ms | | |
| GTX 1660 SUPER | ~ 4 ms | | |
| RTX 3050 | 5 - 7 ms | 320: ~ 10 ms 640: ~ 16 ms | 336: ~ 16 ms 560: ~ 40 ms |
| RTX 3070 Mobile | ~ 5 ms | | |
| RTX 3070 | 4 - 6 ms | 320: ~ 6 ms 640: ~ 12 ms | 336: ~ 14 ms 560: ~ 36 ms |
| Quadro P400 2GB | 20 - 25 ms | | |
| Quadro P2000 | ~ 12 ms | | |
### AMD GPU
通过使用 [rocm](../configuration/object_detectors.md#amdrocm-gpu检测器) 检测器Frigate可以工作在大部分AMD的显卡上。
| Name | YOLOv9 推理时间 | YOLO-NAS 推理时间 |
| --------------- | --------------------- | ------------------------- |
| AMD 780M | ~ 14 ms | 320: ~ 30 ms 640: ~ 60 ms |
## 社区支持的检测器
### Nvidia Jetson
Frigate支持所有的Jetson开发板从经济实惠的Jetson Nano到性能强劲的Jetson Orin AGX都有覆盖。能够通过专门的[编解码预设参数](/configuration/ffmpeg_presets#硬件加速预设)来[调用Jetson视频硬解码功能](/configuration/hardware_acceleration#nvidia-jetson系列)进行加速。如果还配置了[TensorRT检测器](/configuration/object_detectors#nvidia-tensorrt检测器)则会利用Jetson的GPU和DLA深度学习加速器执行目标检测任务。
推理速度会因YOLO模型、Jetson平台型号及NVPModeGPU/DLA/EMC时钟频率配置而异。大多数模型的典型推理时间为20-40毫秒。
DLA深度学习加速器相比GPU能效更高但速度略慢因此启用DLA会降低功耗但会轻微增加推理耗时。
### Rockchip platform
Frigate 支持所有 Rockchip 开发板的硬件视频加速功能,但硬件目标检测仅限以下型号支持:
- RK3562
- RK3566
- RK3568
- RK3576
- RK3588
| Name | YOLOv9 推理时间 | YOLO-NAS 推理时间 | YOLOx 推理时间 |
| --------------- | --------------------- | --------------------------- | ------------------------- |
| rk3588 3 cores | ~ 35 ms | small: ~ 20 ms med: ~ 30 ms | nano: 18 ms tiny: 20 ms |
| rk3566 1 core | | small: ~ 96 ms | |
启用全部3个核心的RK3588芯片运行YOLO-NAS S模型时典型推理时间为25-30毫秒。
## Frigate如何分配CPU和检测器的工作美式通俗解释
根据国外贴吧[reddit的用户提问](https://www.reddit.com/r/homeassistant/comments/q8mgau/comment/hgqbxh5/?utm_source=share&utm_medium=web2x&context=3)改编,细节有些调整。
CPU说我是CPU, Mendel是Google Coral
我和Mendel接到个任务要求我们阻止领居家的鸟飞进爸妈的院子但我CPU不太认识鸟需要花很久时间才能认出来而MendelCoral是鸟类专家他可以很快的认出来。
但Mendel在其他方面的能力却很拉胯所以我们尝试分工合作
我负责盯监控一直盯着画面发现有什么东西动了就立刻拍张照然后把照片给Mendel他很快的认出来目标是什么。虽然大部分时间都是误报例如树叶或者影子之类的但终于有一次Mendel找到了邻居家的鸟任务完成
_提高摄像头分辨率会发生什么_
我们突然发现一个问题:院子里还是到处都是鲣鸟的便便!怎么会漏掉呢?我明明盯了一整天啊!
爸妈检查监控后发现是因为窗户太小太脏,原来的监控窗口视野有限,还蒙着灰
于是他们擦干净窗户并换了个超大落地窗
现在我们能看到整个院子了,但……
CPU有了新的烦恼
- 要扫描的运动区域变大了好几倍
- 必须更拼命工作才能盯住每个角落
Mendel增填了更多压力
- 现在每张照片都超高清(细节爆炸)
- 识别每处细节是否藏着狡猾的鸟更费劲了
实际上,当你调高分辨率/帧率时CPU负荷暴增要处理的数据量呈指数级增长
而Coral加速器虽然强大但精力有限它不能同时扫描所有画面尤其是你有多个摄像头时
Frigate的做法是
CPU先做“运动侦察兵”只把有动静的画面交给Coral加速器做“精准识别”这样既能监控多路摄像头又不会压垮检测器。
## 使用 Coral 加速器时硬件加速参数hwaccel args还有用吗
当然有用因为Coral并不能进行视频编解码工作。
解压视频流会消耗大量CPU资源。视频压缩使用关键帧I帧传输完整画面后续帧只记录差异CPU需要将差异帧与关键帧合并还原每一帧[更多细节可参阅本文(英文)](https://blog.video.ibm.com/streaming-video-tips/keyframes-interframe-video-compression/))。 更高分辨率和帧率意味着需要更多算力来解码视频流,因此建议直接在摄像头端设置合适参数以避免不必要的解码负担。

View File

@ -0,0 +1,29 @@
---
id: index
title: 介绍
slug: /
---
一个完整的本地网络视频录像机NVR专为[Home Assistant](https://www.home-assistant.io)设计具备AI物体检测功能。使用OpenCV和TensorFlow在本地为IP摄像头执行实时物体检测。
强烈推荐使用GPU或者AI加速器例如[Google Coral加速器](https://coral.ai/products/) 或者 [Hailo](https://hailo.ai/)。它们的性能甚至超过目前的顶级CPU并且可以以极低的耗电实现更优的性能。
- 通过[自定义组件](https://github.com/blakeblackshear/frigate-hass-integration)与Home Assistant紧密集成
- 设计上通过仅在必要时和必要地点寻找物体,最大限度地减少资源使用并最大化性能
- 大量利用多进程处理,强调实时性而非处理每一帧
- 使用非常低开销的运动检测来确定运行物体检测的位置
- 使用TensorFlow进行物体检测运行在单独的进程中以达到最大FPS
- 通过MQTT进行通信便于集成到其他系统中
- 根据检测到的物体设置保留时间进行视频录制
- 24/7全天候录制
- 通过RTSP重新流传输以减少摄像头的连接数
- 支持WebRTC和MSE实现低延迟的实时观看
## 截图
![Live View](/img/live-view.png)
![Review Items](/img/review-items.png)
![Media Browser](/img/media_browser-min.png)
![Notification](/img/notification-min.png)

View File

@ -0,0 +1,437 @@
---
id: installation
title: 安装
---
Frigate可运行在任何拥有Docker的主机上甚至可以作为[Home Assistant Add-on插件](https://www.home-assistant.io/addons/)运行。但需要注意的是Home Assistant插件**并不等同于**集成。无论您是将Frigate作为独立Docker容器运行还是作为Home Assistant插件运行都需要通过额外的[集成](/integrations/home-assistant)将Frigate接入Home Assistant内。
:::tip
若您已通过Home Assistant插件安装Frigate请查阅[入门指南](../guides/getting_started#configuring-frigate)进行配置。
:::
## 依赖项
**MQTT代理 (可选)** - Frigate本身可以不依赖MQTT代理运行但如果你想使用Home Assistant集成功能就必须要安装并配置MQTT。Frigate 和 Home Assistant 必须连接至同一个 MQTT 代理服务器。
## 硬件准备
### 操作系统
Frigate最好工作在安装了Docker的Debian系宿主机上获得最佳性能同时你需要让Frigate能够直通访问底层硬件例如Coral这类AI加速器以及显卡。不建议在Proxmox、ESXi、Virtualbox等虚拟化平台上运行Frigate尽管有一部分[用户尝试在Proxmox上运行成功](#proxmox)
Windows系统未获官方支持但有用户通过WSL或Virtualbox成功运行。需注意的是在Windows下显卡或Coral等设备的直通可能比较麻烦。如需帮助可查阅历史讨论或问题记录。
### 存储
Frigate 容器在运行时会对以下目录进行读写操作,您可以通过 Docker 卷映射将这些目录挂载到宿主机的任意位置:
- `/config`: 用于存储 Frigate 配置文件及 SQLite 数据库。运行期间还会生成若干临时文件。
- `/media/frigate/clips`: 快照存储目录(未来可能更名为 snapshots。目录结构为系统自动管理禁止手动修改或浏览。
- `/media/frigate/recordings`: 录像片段内部存储目录。目录结构为系统自动管理,禁止手动修改或浏览。
- `/media/frigate/exports`: 通过网页或API导出的视频片段和延时摄影存储目录。
- `/tmp/cache`: 录像片段缓存目录,原始录像会先写入此处,经校验并转为 MP4 格式后移至recordings目录。通过`clip.mp4`接口生成的片段也在此拼接处理。建议使用 [`tmpfs`](https://docs.docker.com/storage/tmpfs/) 挂载此目录
- `/dev/shm`: 解码帧原始数据的共享内存缓存(不可修改或手动映射)。最小容量受下文 `shm-size`计算规则影响。
### 端口
The following ports are used by Frigate and can be mapped via docker as required.
| 端口 | 说明 |
| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `8971` | 提供未TLS加密带身份验证的页面和API访问请使用反代应用例如Nginx代理此端口并最好配置TLS加密。 |
| `5000` | 提供内部未加密且无需认证的UI和API访问。该端口使用需要严格限制仅限Docker内部网络中使用供与Frigate集成的服务调用。 |
| `8554` | 提供未加密的实时视频流转发服务默认无需认证。可通过配置文件中go2rtc模块启用认证功能。 |
| `8555` | 提供低延迟实时视频流的WebRTC连接服务。 |
#### 常见 Docker Compose 存储配置
写入本地磁盘或外部USB驱动器
```yaml
services:
frigate:
...
volumes:
- /path/to/your/config:/config
- /path/to/your/storage:/media/frigate
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
target: /tmp/cache
tmpfs:
size: 1000000000
...
```
:::warning
使用 Snapcraft 构建版 Docker 的用户只能将存储位置设置在 $HOME 目录下。
:::
### 计算所需的共享内存大小(shm-size)
Frigate使用共享内存(shm)处理视频帧。Docker默认提供的shm-size为64MB。
对于2个720p摄像头的检测场景默认128MB共享内存足够。若出现"Bus error"错误退出通常是由于高分辨率摄像头过多需通过using [`--shm-size`](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources) 或者Docker Compose中的[`service.shm_size`](https://docs.docker.com/compose/compose-file/compose-file-v2/#shm_size))增加内存容量。
注意Frigate容器日志也会占用最多40MB共享内存计算时需计入。
各摄像头最低共享内存需求计算公式(基于检测分辨率):
```console
# 单摄像头基础计算模板(不含日志),替换<width><height>
$ python -c 'print("{:.2f}MB".format((<width> * <height> * 1.5 * 20 + 270480) / 1048576))'
# 1280x720分辨率示例含日志
$ python -c 'print("{:.2f}MB".format((1280 * 720 * 1.5 * 20 + 270480) / 1048576 + 40))'
66.63MB
# 8个1280x720摄像头示例含日志
$ python -c 'print("{:.2f}MB".format(((1280 * 720 * 1.5 * 20 + 270480) / 1048576) * 8 + 40))'
253MB
```
Home Assistant插件无法单独设置容器共享内存。但由于Home Assistant Supervisor默认分配总内存的50%给`/dev/shm`例如8GB内存机器可分配约4GB通常无需额外配置。
### 树莓派3/4
默认情况下树莓派对GPU可用内存进行了限制。如需使用ffmpeg硬件加速功能必须按照[官方文档](https://www.raspberrypi.org/documentation/computers/config_txt.html#memory-options)说明,在`config.txt`中将`gpu_mem`设置为最大推荐值以增加可用内存。
需要特别注意USB Coral功耗问题。若同时使用SSD等其他USB设备可能因供电不足导致系统不稳定必须使用带独立电源的外置USB集线器。部分用户反馈<a href="https://amzn.to/3a2mH0P" target="_blank" rel="nofollow noopener sponsored">此款产品</a>(推广链接)可稳定运行。
### Hailo-8
Hailo-8和Hailo-8L AI加速器提供M.2和树莓派HAT两种规格。M.2版本通常通过PCIe载板连接作为AI套件组成部分与树莓派5对接HAT版本则可直接安装于兼容的树莓派机型。两种规格在x86平台亦通过兼容性测试具备多平台适配能力。
#### 安装
对于使用AI套件的树莓派5用户安装过程很简单。只需按照这个[指南](https://www.raspberrypi.com/documentation/accessories/ai-kit.html#ai-kit-installation)安装驱动程序和软件即可。
对于其他安装情况,请按照以下步骤进行安装:
1. 从[Hailo GitHub仓库](https://github.com/hailo-ai/hailort-drivers)安装驱动程序。Linux系统提供了一个便捷脚本用于克隆仓库、构建驱动程序并安装。
2. 复制或下载[此脚本](https://github.com/blakeblackshear/frigate/blob/dev/docker/hailo8l/user_installation.sh)。
3. 使用`sudo chmod +x user_installation.sh`确保脚本具有执行权限。
4. 使用`./user_installation.sh`运行脚本。
#### 设置
按照默认安装说明设置Frigate例如`ghcr.io/blakeblackshear/frigate:stable`
接下来,通过在`docker-compose.yml`文件中添加以下行来授予Docker访问硬件的权限
```yaml
devices:
- /dev/hailo0
```
如果您使用`docker run`,请在命令中添加此选项:`--device /dev/hailo0`
#### 配置
最后,配置[硬件对象检测](/configuration/object_detectors#hailo-8l)以完成设置。
### Rockchip平台
确保使用带有Rockchip BSP内核5.10或6.1以及必要驱动程序特别是rkvdec2和rknpu的Linux发行版。要检查是否满足要求请输入以下命令
```
$ uname -r
5.10.xxx-rockchip # 或6.1.xxx-rockchip后缀很重要
$ ls /dev/dri
by-path card0 card1 renderD128 renderD129 # 应列出renderD128VPU和renderD129NPU
$ sudo cat /sys/kernel/debug/rknpu/version
RKNPU driver: v0.9.2 # 或更高版本
```
如果您的开发板受支持,我推荐使用[Joshua Riek的Rockchip版Ubuntu](https://github.com/Joshua-Riek/ubuntu-rockchip)。
#### 设置
按照Frigate的默认安装说明进行操作但使用带有`-rk`后缀的docker镜像例如`ghcr.io/blakeblackshear/frigate:stable-rk`。
接下来您需要授予docker访问硬件的权限
- 在配置过程中您应该在特权模式下运行docker以避免因权限不足而出现错误。为此在`docker-compose.yml`文件中添加`privileged: true`或在docker run命令中添加`--privileged`标志。
- 在一切正常工作后,您应该只授予必要的权限以提高安全性。禁用特权模式,并在`docker-compose.yml`文件中添加以下行:
```yaml
security_opt:
- apparmor=unconfined
- systempaths=unconfined
devices:
- /dev/dri
- /dev/dma_heap
- /dev/rga
- /dev/mpp_service
volumes:
- /sys/:/sys/:ro
```
或在`docker run`命令中添加这些选项:
```
--security-opt systempaths=unconfined \
--security-opt apparmor=unconfined \
--device /dev/dri \
--device /dev/dma_heap \
--device /dev/rga \
--device /dev/mpp_service \
--volume /sys/:/sys/:ro
```
#### 配置
接下来,您应该配置[硬件对象检测](/configuration/object_detectors#rockchip平台)和[硬件视频处理](/configuration/hardware_acceleration#rockchip平台)。
## Docker
推荐使用Docker Compose进行安装。
```yaml
services:
frigate:
container_name: frigate
privileged: true # 部分设置可能不需要此选项
restart: unless-stopped
stop_grace_period: 30s # 为各服务提供足够的关闭时间
image: ghcr.io/blakeblackshear/frigate:stable
shm_size: "512mb" # 根据上述计算结果为您的摄像头更新此值
devices:
- /dev/bus/usb:/dev/bus/usb # 用于USB Coral其他版本需要修改
- /dev/apex_0:/dev/apex_0 # 用于PCIe Coral请按照此处的驱动说明操作 https://coral.ai/docs/m2/get-started/#2a-on-linux
- /dev/video11:/dev/video11 # 用于树莓派4B
- /dev/dri/renderD128:/dev/dri/renderD128 # 用于Intel硬件加速需要根据您的硬件更新
volumes:
- /etc/localtime:/etc/localtime:ro
- /path/to/your/config:/config
- /path/to/your/storage:/media/frigate
- type: tmpfs # 可选1GB内存减少SSD/SD卡损耗
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "8971:8971"
# - "5000:5000" # 内部未认证访问。谨慎暴露。
- "8554:8554" # RTSP视频流
- "8555:8555/tcp" # 基于TCP的WebRTC
- "8555:8555/udp" # 基于UDP的WebRTC
environment:
FRIGATE_RTSP_PASSWORD: "password"
```
如果您无法使用Docker Compose可以使用类似以下命令运行容器
```bash
docker run -d \
--name frigate \
--restart=unless-stopped \
--stop-timeout 30 \
--mount type=tmpfs,target=/tmp/cache,tmpfs-size=1000000000 \
--device /dev/bus/usb:/dev/bus/usb \
--device /dev/dri/renderD128 \
--shm-size=64m \
-v /path/to/your/storage:/media/frigate \
-v /path/to/your/config:/config \
-v /etc/localtime:/etc/localtime:ro \
-e FRIGATE_RTSP_PASSWORD='password' \
-p 8971:8971 \
-p 8554:8554 \
-p 8555:8555/tcp \
-p 8555:8555/udp \
ghcr.io/blakeblackshear/frigate:stable
```
当前稳定版本的官方Docker镜像标签有
- `stable` - 适用于amd64的标准Frigate构建和适用于arm64的树莓派优化Frigate构建。此构建还包括对Hailo设备的支持。
- `stable-standard-arm64` - 适用于arm64的标准Frigate构建
- `stable-tensorrt` - 专门用于运行NVIDIA GPU的amd64设备的Frigate构建
- `stable-rocm` - 适用于[AMD GPU](../configuration/object_detectors.md#amdrocm-gpu-detector)的Frigate构建
当前稳定版本的社区支持Docker镜像标签有
- `stable-tensorrt-jp6` - 为运行Jetpack 6的NVIDIA Jetson设备优化的Frigate构建
- `stable-rk` - 适用于搭载Rockchip SoC的单板计算机的Frigate构建
## Home Assistant插件
:::warning
从Home Assistant操作系统10.2和Home Assistant 2023.6版本开始,支持为媒体文件配置独立的网络存储。
需要注意HA OS的以下重要限制
- Home Assistant尚不支持媒体文件的独立本地存储
- 由于HA OS不包含mesa驱动程序因此不支持AMD GPU
- 由于插件不支持nvidia运行时因此不支持NVIDIA GPU
:::
:::tip
请参阅[网络存储指南](/guides/ha_network_storage.md)了解如何为Frigate设置网络存储。
:::
Home Assistant OS用户可以通过插件仓库进行安装。
1. 在Home Assistant中导航至 _设置_ > _插件_ > _插件商店_ > _仓库_
2. 添加 `https://github.com/blakeblackshear/frigate-hass-addons`
3. 安装所需的Frigate插件版本见下文
4. 在`配置`选项卡中设置网络配置
5. 启动插件
6. 使用_打开Web界面_按钮访问Frigate界面然后点击_齿轮图标_ > _配置编辑器_根据需要配置Frigate
插件提供以下几种版本:
| 插件版本 | 描述 |
| -------------------------- | --------------------------------------- |
| Frigate | 当前发布版本,启用保护模式 |
| Frigate完全访问 | 当前发布版本,可选择禁用保护模式 |
| Frigate Beta | Beta版本启用保护模式 |
| Frigate Beta完全访问 | Beta版本可选择禁用保护模式 |
如果您使用ffmpeg硬件加速您**可能**需要使用_完全访问_版本的插件。这是因为Frigate插件在容器中运行时对主机系统的访问受限。_完全访问_版本允许您禁用_保护模式_从而让Frigate完全访问主机系统。
您也可以通过[VS Code插件](https://github.com/hassio-addons/addon-vscode)或类似工具编辑Frigate配置文件。在这种情况下配置文件位于`/addon_configs/<addon_directory>/config.yml`,其中`<addon_directory>`取决于您运行的Frigate插件版本。请参阅[此处](../configuration/index.md#accessing-add-on-config-dir)的目录列表。
## Kubernetes
使用[helm chart](https://github.com/blakeblackshear/blakeshome-charts/tree/master/charts/frigate)进行安装。
## Unraid
许多人拥有足够强大的NAS设备或家庭服务器来运行docker。Unraid提供了一个社区应用。
要安装,请确保您已安装[社区应用插件](https://forums.unraid.net/topic/38582-plug-in-community-applications/)。然后在Unraid的应用部分搜索"Frigate" - 您可以在[这里](https://unraid.net/community/apps?q=frigate#r)查看在线商店。
## Proxmox虚拟化平台
根据[Proxmox官方文档](https://pve.proxmox.com/pve-docs/pve-admin-guide.html#chapter_pct)建议像Frigate这样的应用容器最好运行在Proxmox QEMU虚拟机中。这种部署方式既能获得应用容器化的所有优势又能享受虚拟机带来的诸多好处例如
- 与宿主机实现强隔离
- 支持实时迁移等高级功能(这些功能在直接使用容器时无法实现)
:::warning
如果您选择通过LXC在Proxmox中运行Frigate设置过程可能会很复杂请做好阅读Proxmox和LXC文档的准备Frigate不官方支持在LXC内运行。
:::
建议包括:
- 对于基于Intel的硬件加速要允许访问主设备号为226、次设备号为128的`/dev/dri/renderD128`设备,请在`/etc/pve/lxc/<id>.conf` LXC配置文件中添加以下行
- `lxc.cgroup2.devices.allow: c 226:128 rwm`
- `lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file`
- LXC配置可能还需要`features: fuse=1,nesting=1`。这允许在LXC容器中运行Docker容器`nesting`)并防止文件重复和存储浪费(`fuse`)。
- 通过多层容器化LXC然后Docker成功传递硬件设备可能很困难。许多人选择在主机上将`/dev/dri/renderD128`等设备设为全局可读或在特权LXC容器中运行Frigate。
- 虚拟化层通常会给与Coral设备的通信带来大量开销但[并非所有情况都如此](https://github.com/blakeblackshear/frigate/discussions/1837)。
更多一般信息请参见[Proxmox LXC讨论](https://github.com/blakeblackshear/frigate/discussions/5773)。
## ESXi
有关使用ESXi运行Frigate的详细信息请参阅[此处](https://williamlam.com/2023/05/frigate-nvr-with-coral-tpu-igpu-passthrough-using-esxi-on-intel-nuc.html)的说明。
如果您在机架式服务器上运行Frigate并想要直通Google Coral请[阅读此处](https://github.com/blakeblackshear/frigate/issues/305)。
## DSM 7上的群晖NAS
这些设置已在DSM 7.1.1-42962 Update 4上测试通过
**常规设置:**
需要启用`使用高权限执行容器`选项以便为Frigate容器提供可能需要的提升权限。
如果您希望容器在因错误而异常关闭时自动重启,可以启用`启用自动重启`选项。
![image](https://user-images.githubusercontent.com/4516296/232586790-0b659a82-561d-4bc5-899b-0f5b39c6b11d.png)
**高级设置:**
如需使用密码模板功能,应在高级设置中添加"FRIGATE_RTSP_PASSWORD"环境变量并设置您偏好的密码。其余环境变量目前应保持默认值。
![image](https://user-images.githubusercontent.com/4516296/232587163-0eb662d4-5e28-4914-852f-9db1ec4b9c3d.png)
**端口设置:**
网络模式应设置为`bridge`。您需要将Frigate容器的默认端口映射到您想在群晖NAS上使用的本地端口。
如果NAS上有其他服务正在使用Frigate所需的相同端口您可以将端口设置为自动或指定特定端口。
![image](https://user-images.githubusercontent.com/4516296/232582642-773c0e37-7ef5-4373-8ce3-41401b1626e6.png)
**存储空间设置:**
需要配置2个路径
- 配置目录的位置这将根据您的NAS文件夹结构而有所不同例如`/docker/frigate/config`将挂载到容器内的`/config`
- NAS上用于保存录像的位置这必须是一个文件夹例如`/docker/volumes/frigate-0-media`
![image](https://user-images.githubusercontent.com/4516296/232585872-44431d15-55e0-4004-b78b-1e512702b911.png)
## QNAP NAS
这些说明已在配备Intel J3455 CPU和16G RAM、运行QTS 4.5.4.2117的QNAP上测试通过。
QNAP有一个名为Container Station的图形工具用于安装和管理docker容器。但是Container Station有两个限制使其不适合安装Frigate
1. Container Station不支持GitHub容器注册表ghcr而该注册表托管了Frigate 0.12.0及以上版本的docker镜像。
2. Container Station使用默认64 Mb共享内存大小shm-size且没有调整机制。Frigate需要更大的shm-size才能正常处理两个以上的高分辨率摄像头。
由于上述限制,安装必须通过命令行完成。以下是具体步骤:
**准备工作**
1. 如果尚未安装从QNAP应用中心安装Container Station。
2. 在QNAP上启用ssh请通过网络搜索了解具体操作方法
3. 准备Frigate配置文件命名为`config.yml`。
4. 根据[文档](https://docs.frigate.video/frigate/installation)计算共享内存大小。
5. 从https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 查找您的时区值。
6. 通过ssh连接到QNAP。
**安装**
运行以下命令安装Frigate以`stable`版本为例):
```shell
# 下载Frigate镜像
docker pull ghcr.io/blakeblackshear/frigate:stable
# 在QNAP文件系统上创建目录以存放Frigate配置文件
# 例如,您可以选择在/share/Container下创建
mkdir -p /share/Container/frigate/config
# 将步骤2中准备的配置文件复制到新创建的配置目录
cp path/to/your/config/file /share/Container/frigate/config
# 在QNAP文件系统上创建目录以存放Frigate媒体文件
# (如果您有监控硬盘,请在监控硬盘上创建媒体目录。
# 示例命令假设share_vol2是监控硬盘
mkdir -p /share/share_vol2/frigate/media
# 创建Frigate docker容器。用准备步骤3中的值替换shm-size值。
# 同时在示例命令中替换'TZ'的时区值。
# 示例命令将创建一个最多使用2个CPU和4G RAM的docker容器。
# 如果您使用特定CPU如J4125可能需要在以下docker run命令中添加"--env=LIBVA_DRIVER_NAME=i965 \"。
# 参见 https://docs.frigate.video/configuration/hardware_acceleration。
docker run \
--name=frigate \
--shm-size=256m \
--restart=unless-stopped \
--env=TZ=America/New_York \
--volume=/share/Container/frigate/config:/config:rw \
--volume=/share/share_vol2/frigate/media:/media/frigate:rw \
--network=bridge \
--privileged \
--workdir=/opt/frigate \
-p 8971:8971 \
-p 8554:8554 \
-p 8555:8555 \
-p 8555:8555/udp \
--label='com.qnap.qcs.network.mode=nat' \
--label='com.qnap.qcs.gpu=False' \
--memory="4g" \
--cpus="2" \
--detach=true \
-t \
ghcr.io/blakeblackshear/frigate:stable
```
登录QNAP打开Container Station。Frigate docker容器应该在"概览"下列出并正在运行。点击Frigate docker然后点击详情页顶部显示的URL访问Frigate Web界面。

View File

@ -0,0 +1,69 @@
---
id: video_pipeline
title: 视频处理管线
---
:::tip
由于本文涉及过多专业领域内容对普通用户帮助不算特别多将不会进行精翻本文使用DeepSeek AI进行翻译仅做参考。
:::
Frigate采用先进的视频处理管线从摄像头获取视频流开始逐步应用多种处理流程如解码、移动侦测等
本指南概述了Frigate的核心概念帮助用户理解其工作原理。
## 概览
高层级来看,摄像头视频流会经历五个处理步骤:
```mermaid
%%{init: {"themeVariables": {"edgeLabelBackground": "transparent"}}}%%
flowchart LR
Feed(视频流\n获取) --> Decode(视频\n解码)
Decode --> Motion(移动\n侦测)
Motion --> Object(物体\n检测)
Feed --> Recording(录像\n与\n可视化)
Motion --> Recording
Object --> Recording
```
如图所示所有视频流首先需要被获取。根据数据源不同可能简单如通过FFmpeg连接RTSP源也可能复杂如通过go2rtc连接Apple Homekit摄像头。单个摄像头可生成主码流高清和子码流低清
通常子码流会被解码生成全帧图像。此过程可能包含分辨率降采样和帧率控制如保持5帧/秒)。
这些帧将通过时序比对来检测移动区域(即动态框)。动态框会组合成动态区域,并由机器学习模型分析识别已知物体。最终根据快照和录像保留策略决定保存哪些视频片段和事件。
## 视频管线详述
下图展示了比前文更详细的数据流转路径:
```mermaid
%%{init: {"themeVariables": {"edgeLabelBackground": "transparent"}}}%%
flowchart TD
RecStore[(录像\n存储)]
SnapStore[(快照\n存储)]
subgraph 视频获取
Cam["摄像头"] -->|FFmpeg支持| Stream
Cam -->|"其他流媒体\n协议"| go2rtc
go2rtc("go2rtc") --> Stream
Stream[获取主/子\n码流] --> |检测码流|Decode(解码与\n降采样)
end
subgraph 移动侦测
Decode --> MotionM(应用\n遮罩)
MotionM --> MotionD(移动\n检测)
end
subgraph 物体识别
MotionD --> |动态区域| ObjectD(物体检测)
Decode --> ObjectD
ObjectD --> ObjectFilter(应用物体过滤器&区域)
ObjectFilter --> ObjectZ(物体追踪)
end
Decode --> |解码帧|Birdseye(鸟瞰图)
MotionD --> |移动事件|Birdseye
ObjectZ --> |物体事件|Birdseye
MotionD --> |"视频片段\n(保留移动)"|RecStore
ObjectZ --> |检测片段|RecStore
Stream -->|"视频片段\n(保留全部)"| RecStore
ObjectZ --> |检测快照|SnapStore
```

View File

@ -0,0 +1,118 @@
---
id: configuring_go2rtc
title: 配置 go2rtc
---
# 配置 go2rtc
使用内置的 go2rtc 是可选的。你仍然可以配置 FFmpeg 直接连接到你的摄像头。但是,如果需要以下功能,则需要在配置中添加 go2rtc
- WebRTC 或 MSE 实时查看,支持音频、更高的分辨率和帧率,比仅限于检测流且不支持音频的 jsmpeg 流更好
- Home Assistant 集成中摄像头的实时流支持
- RTSP 中继,用于其他消费者,以减少与摄像头流的连接数
# 设置 go2rtc 流
首先,你需要在 Frigate 配置文件中添加想用于实时查看的流,配置 go2rtc 连接到你的摄像头流。在这一步中避免更改配置的其他部分。注意go2rtc 支持[多种不同的流类型](https://github.com/AlexxIT/go2rtc/tree/v1.9.9#module-streams),不仅仅是 rtsp。
:::tip
为获得最佳体验,你应该将 `go2rtc` 下的流名称设置为与摄像头名称相匹配,这样 Frigate 就可以自动映射并为摄像头使用更好的实时查看选项。
更多信息请参见[实时查看文档](../configuration/live.md#setting-stream-for-live-ui)。
:::
```yaml
go2rtc:
streams:
back:
- rtsp://user:password@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
```
将此配置添加后,重启 Frigate 并尝试从仪表板点击单个摄像头来观看实时流。它应该比原始的 jsmpeg 流看起来更清晰流畅。
### 如果视频无法播放怎么办?
- 检查日志:
- 在 Frigate UI 侧边栏的日志部分访问 go2rtc 日志。
- 如果 go2rtc 连接摄像头有困难,你应该能在日志中看到一些错误消息。
- 检查 go2rtc Web 界面:如果你在日志中没有看到任何错误,尝试通过 go2rtc 的 web 界面查看摄像头。
- 在浏览器中访问 1984 端口来访问 go2rtc 的 web 界面。
- 如果通过 Home Assistant 使用 Frigate需要启用 1984 端口的 web 界面。
- 如果使用 Docker需要在访问 web 界面前转发 1984 端口。
- 点击特定摄像头的 `stream` 查看是否正在接收摄像头流。
- 检查视频编解码器:
- 如果摄像头流在 go2rtc 中工作但在浏览器中不工作,可能是视频编解码器不受支持。
- 如果使用 H265切换到 H264。参考 go2rtc 文档中的[视频编解码器兼容性](https://github.com/AlexxIT/go2rtc/tree/v1.9.9#codecs-madness)。
- 如果无法从 H265 切换到 H264或者流格式不同如 MJPEG使用 [FFmpeg 参数](https://github.com/AlexxIT/go2rtc/tree/v1.9.9#source-ffmpeg)重新编码视频。它支持旋转和调整视频源大小以及硬件加速。请记住,将视频从一种格式转换为另一种格式是一项资源密集型任务,使用内置的 jsmpeg 查看可能更好。
```yaml
go2rtc:
streams:
back:
- rtsp://user:password@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
- "ffmpeg:back#video=h264#hardware"
```
- 如果需要,切换到 FFmpeg
- 某些摄像头流可能需要使用 go2rtc 中的 ffmpeg 模块。这会导致启动时间较慢,但与更多流类型兼容。
```yaml
go2rtc:
streams:
back:
- ffmpeg:rtsp://user:password@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
```
- 如果你能看到视频但没有音频,这很可能是因为你的摄像头的音频流编解码器不是 AAC。
- 如果可能,在摄像头固件中将摄像头的音频设置更新为 AAC。
- 如果你的摄像头不支持 AAC 音频,且你想要音频,则需要告诉 go2rtc 按需将音频重新编码为 AAC。这将使用额外的 CPU 并增加一些延迟。要按需添加 AAC 音频,你可以按如下方式更新 go2rtc 配置:
```yaml
go2rtc:
streams:
back:
- rtsp://user:password@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
- "ffmpeg:back#audio=aac"
```
如果你需要同时转换音频和视频流,可以使用以下配置:
```yaml
go2rtc:
streams:
back:
- rtsp://user:password@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2
- "ffmpeg:back#video=h264#audio=aac#hardware"
```
当使用 ffmpeg 模块时,你可以这样添加 AAC 音频:
```yaml
go2rtc:
streams:
back:
- "ffmpeg:rtsp://user:password@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2#video=copy#audio=copy#audio=aac#hardware"
```
:::warning
当使用 Frigate 插件时,如果要从外部访问 go2rtc 流(例如通过 VLC你必须首先启用 RTSP Restream 端口。
你可以在 Home Assistant 中访问 Frigate 插件配置页面,在"显示禁用端口"部分下显示隐藏选项来完成此操作。
:::
## 后续步骤
1. 如果你添加到 go2rtc 的流也被 Frigate 用于 `record``detect` 角色,你可以将配置迁移到从 RTSP 重流中获取,以减少与摄像头的连接数,如[这里](/configuration/restream#减少摄像头连接数)所示。
2. 你可能还想[设置 WebRTC](/configuration/live#webrtc额外配置)以获得比 MSE 略低的延迟。注意WebRTC 仅支持 h264 和特定的音频格式,可能需要在路由器上开放端口。
## 重要注意事项
如果你配置 go2rtc 发布 HomeKit 摄像头流,在配对时配置会写入容器内的 `/dev/shm/go2rtc.yaml` 文件。这些更改必须手动复制到 Frigate 配置的 `go2rtc` 部分,以便在重启后保持不变。

View File

@ -0,0 +1,317 @@
---
id: getting_started
title: 入门指南
---
# 入门指南
:::tip
如果你已经有一个安装了Linux和Docker的环境可以直接跳转到下面的[安装Frigate](#installing-frigate)部分。
如果你已经通过Docker或Home Assistant插件安装了Frigate可以直接跳转到下面的[配置Frigate](#configuring-frigate)部分。
:::
## 硬件设置
本节将指导你如何在Debian Bookworm上设置服务器并安装Docker。
### 安装Debian 12 (Bookworm)
关于如何安装Debian服务器有很多指南所以这里只提供简略指南。将临时显示器和键盘连接到你的设备以便安装一个没有桌面环境的最小化服务器。
#### 准备安装媒介
1. 从[Debian网站](https://www.debian.org/distrib/netinst)下载小型安装镜像
1. 将ISO写入USB设备推荐使用[balena Etcher](https://etcher.balena.io/)工具)
1. 从USB启动你的设备
#### 安装并设置Debian以进行远程访问
1. 确保你的设备已连接到网络,以便可以安装更新和软件
1. 如果没有连接鼠标,选择非图形化安装选项,但两种安装方式都可以正常工作
1. 系统会提示你设置root用户密码并创建一个带密码的用户
1. 安装最小化软件。更少的依赖意味着更少的维护工作。
1. 取消选中"Debian桌面环境"和"GNOME"
1. 选中"SSH服务器"
1. 保持"标准系统实用工具"选中
1. 重启后以root身份登录命令提示符将用户添加到sudoers
1. 安装sudo
```bash
apt update && apt install -y sudo
```
1. 将你创建的用户添加到sudo组将`blake`改为你自己的用户名)
```bash
usermod -aG sudo blake
```
1. 运行`poweroff`关机
此时你可以将设备安装到永久位置。剩余步骤可以通过SSH从另一台设备完成。如果你没有SSH客户端可以安装[Visual Studio Code文档](https://code.visualstudio.com/docs/remote/troubleshooting#_installing-a-supported-ssh-client)中列出的选项之一。
#### 通过SSH完成设置
1. 通过SSH连接并使用安装时创建的非root用户登录
1. 设置无密码sudo这样就不用每次执行sudo命令时都输入密码将下面命令中的`blake`改为你的用户名)
```bash
echo 'blake ALL=(ALL) NOPASSWD:ALL' | sudo tee /etc/sudoers.d/user
```
1. 注销并重新登录以激活无密码sudo
1. 为操作系统设置自动安全更新(可选)
1. 运行以下命令确保所有内容都是最新的
```bash
sudo apt update && sudo apt upgrade -y
```
1. 安装无人值守更新
```bash
sudo apt install -y unattended-upgrades
echo unattended-upgrades unattended-upgrades/enable_auto_updates boolean true | sudo debconf-set-selections
sudo dpkg-reconfigure -f noninteractive unattended-upgrades
```
现在你有了一个需要很少维护的最小化Debian服务器。
### 安装Docker
1. 使用[官方文档](https://docs.docker.com/engine/install/debian/)安装Docker Engine不是Docker Desktop
1. 具体来说,按照[使用apt仓库安装](https://docs.docker.com/engine/install/debian/#install-using-the-repository)部分的步骤操作
2. 按照[Linux安装后步骤](https://docs.docker.com/engine/install/linux-postinstall/)中的说明将你的用户添加到docker组
## 安装Frigate
本节展示如何在Debian上为Docker安装创建最小目录结构。如果你已经通过Home Assistant插件或其他方式安装了Frigate可以继续[配置Frigate](#configuring-frigate)部分。
### 设置目录
如果配置文件在初始启动时不存在Frigate将创建一个配置文件。以下目录结构是开始所需的最低要求。一旦Frigate运行起来你可以使用内置的配置编辑器它支持配置验证。
```
.
├── docker-compose.yml
├── config/
└── storage/
```
这将创建上述结构:
```bash
mkdir storage config && touch docker-compose.yml
```
如果你通过SSH在Linux设备上设置Frigate可以使用[nano](https://itsfoss.com/nano-editor-guide/)来编辑以下文件。如果你更喜欢使用完整的编辑器而不是终端来编辑远程文件,我推荐使用带[Remote SSH扩展](https://code.visualstudio.com/docs/remote/ssh-tutorial)的[Visual Studio Code](https://code.visualstudio.com/)。
:::note
这个`docker-compose.yml`文件只是amd64设备的入门文件。你需要根据[安装文档](/frigate/installation#docker)中的详细说明来自定义它以适应你的设置。
:::
`docker-compose.yml`
```yaml
services:
frigate:
container_name: frigate
restart: unless-stopped
stop_grace_period: 30s
image: ghcr.io/blakeblackshear/frigate:stable
volumes:
- ./config:/config
- ./storage:/media/frigate
- type: tmpfs # 可选1GB内存减少SSD/SD卡损耗
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "8971:8971"
- "8554:8554" # RTSP feeds
```
现在你应该可以在包含`docker-compose.yml`的文件夹中运行`docker compose up -d`来启动Frigate。在启动时系统会创建一个管理员用户和密码并在日志中输出。你可以通过运行`docker logs frigate`来查看。现在应该可以通过`https://server_ip:8971`访问Frigate你可以使用`admin`用户登录并使用内置的配置编辑器完成配置。
## 配置Frigate
本节假设你已经按照[安装](../frigate/installation.md)中的说明设置了环境。你还应该根据[摄像头设置指南](/frigate/camera_setup)配置你的摄像头。特别注意选择检测分辨率的部分。
### 步骤1添加检测流
首先我们将为摄像头添加检测流:
```yaml
mqtt:
enabled: False
cameras:
name_of_your_camera: # <------ 命名你的摄像头
enabled: True
ffmpeg:
inputs:
- path: rtsp://10.0.10.10:554/rtsp # <----- 你想用于检测的流
roles:
- detect
```
### 步骤2启动Frigate
此时你应该能够启动Frigate并在UI中看到视频流。
如果你从摄像头获得错误图像这意味着ffmpeg无法从你的摄像头获取视频流。检查日志中的ffmpeg错误消息。默认的ffmpeg参数设计用于支持TCP连接的H264 RTSP摄像头。
其他类型摄像头的FFmpeg参数可以在[这里](../configuration/camera_specific.md)找到。
### 步骤3配置硬件加速推荐
现在你已经有了一个工作正常的摄像头配置你需要设置硬件加速以最小化解码视频流所需的CPU。查看[硬件加速](../configuration/hardware_acceleration.md)配置参考,了解适用于你的硬件的示例。
这里是一个使用[预设](../configuration/ffmpeg_presets.md)配置硬件加速的示例适用于大多数带集成GPU的Intel处理器
`docker-compose.yml`(修改后,你需要运行`docker compose up -d`来应用更改)
```yaml
services:
frigate:
...
devices:
- /dev/dri/renderD128:/dev/dri/renderD128 # 用于intel硬件加速需要根据你的硬件更新
...
```
`config.yml`
```yaml
mqtt: ...
cameras:
name_of_your_camera:
ffmpeg:
inputs: ...
hwaccel_args: preset-vaapi
detect: ...
```
### 步骤4配置检测器
默认情况下Frigate将使用单个CPU检测器。如果你有USB Coral你需要在配置中添加检测器部分。
`docker-compose.yml`(修改后,你需要运行`docker compose up -d`来应用更改)
```yaml
services:
frigate:
...
devices:
- /dev/bus/usb:/dev/bus/usb # 传递USB Coral需要为其他版本修改
- /dev/apex_0:/dev/apex_0 # 传递PCIe Coral按照这里的驱动说明操作 https://coral.ai/docs/m2/get-started/#2a-on-linux
...
```
```yaml
mqtt: ...
detectors: # <---- 添加检测器
coral:
type: edgetpu
device: usb
cameras:
name_of_your_camera:
ffmpeg: ...
detect:
enabled: True # <---- 开启检测
...
```
更多关于可用检测器的详细信息可以在[这里](../configuration/object_detectors.md)找到。
重启Frigate你应该就能开始看到`person`的检测结果。如果你想跟踪其他对象,需要根据[配置文件参考](../configuration/reference.md)添加。
### 步骤5设置运动遮罩
现在你已经优化了解码视频流的配置你需要检查在哪里实现运动遮罩。要做到这一点在UI中导航到摄像头选择顶部的“调试”并在视频流下方的选项中启用“运动遮罩”。观察持续触发不需要的运动检测的区域。常见的需要遮罩的区域包括摄像头时间戳和经常在风中摇摆的树木。目标是避免浪费对象检测周期来查看这些区域。
现在你知道需要在哪里遮罩,使用选项窗格中的"Mask & Zone creator"来生成配置文件所需的坐标。更多关于遮罩的信息可以在[这里](../configuration/masks.md)找到。
:::warning
注意,运动遮罩不应用于标记你不想检测对象的区域或减少误报。它们不会改变发送到对象检测的图像,所以你仍然可以在有运动遮罩的区域获得跟踪对象、警报和检测。这些只是防止这些区域的运动启动对象检测。
:::
你的配置现在应该看起来类似这样。
```yaml
mqtt:
enabled: False
detectors:
coral:
type: edgetpu
device: usb
cameras:
name_of_your_camera:
ffmpeg:
inputs:
- path: rtsp://10.0.10.10:554/rtsp
roles:
- detect
motion:
mask:
- 0,461,3,0,1919,0,1919,843,1699,492,1344,458,1346,336,973,317,869,375,866,432
```
### 步骤6启用录制
为了在Frigate UI中查看活动需要启用录制。
要启用视频录制,向流添加`record`角色并在配置中启用它。如果在配置中禁用了录制就无法在UI中启用它。
```yaml
mqtt: ...
detectors: ...
cameras:
name_of_your_camera:
ffmpeg:
inputs:
- path: rtsp://10.0.10.10:554/rtsp
roles:
- detect
- path: rtsp://10.0.10.10:554/high_res_stream # <----- 添加你想要录制的流
roles:
- record
detect: ...
record: # <----- 启用录制
enabled: True
motion: ...
```
如果你的检测和录制没有单独的流你只需要在第一个输入的角色列表中添加record角色。
:::note
如果你在`inputs`中只定义了一个流且没有为其分配`detect`角色Frigate会自动为其分配`detect`角色。即使你在配置的`detect`部分使用`enabled: False`禁用了对象检测Frigate仍然会解码一个流以支持运动检测、Birdseye、API图像端点和其他功能。
如果你只计划使用Frigate进行录制仍建议为低分辨率流定义一个`detect`角色,以最小化所需流解码的资源使用。
:::
默认情况下Frigate会保留所有跟踪对象的视频10天。完整的录制选项可以在[这里](../configuration/reference.md)找到。
### 步骤7完整配置
此时你已经有了一个具有基本功能的完整配置。
- 查看[常见配置示例](../configuration/index.md#common-configuration-examples)获取常见配置示例列表。
- 查看[完整配置参考](../configuration/reference.md)获取完整的配置选项列表。
### 后续步骤
现在你已经有了一个可工作的安装,你可以使用以下文档了解其他功能:
1. [配置go2rtc](configuring_go2rtc.md) - 额外的实时查看选项和RTSP中继
2. [区域](../configuration/zones.md)
3. [回顾](../configuration/review.md)
4. [遮罩](../configuration/masks.md)
5. [Home Assistant集成](../integrations/home-assistant.md) - 与Home Assistant集成

View File

@ -0,0 +1,40 @@
---
id: ha_network_storage
title: Home Assistant 网络存储
---
从Home Assistant 2023.6版本开始,插件已支持网络挂载存储。
## 为Frigate设置远程存储
### 前提条件
- 已安装Home Assistant 2023.6或更新版本
- 运行Home Assistant操作系统10.2或更新版本或者运行Supervised模式并安装了最新的os-agent这是supervised安装所必需的
### 初始设置
1. 停止Frigate插件
### 移动当前数据
保留当前数据是可选的,但无论如何都需要移动数据才能成功创建共享。
#### 如果你想保留当前数据
1. 将frigate.db、frigate.db-shm、frigate.db-wal文件移动到/config目录
2. 将/media/frigate文件夹重命名为/media/frigate_tmp
#### 如果你不想保留当前数据
1. 删除/media/frigate文件夹及其所有内容
### 创建媒体共享
1. 进入**设置 -> 系统 -> 存储 -> 添加网络存储**
2. 将共享命名为`frigate`(这是必需的)
3. 选择类型为`media`
4. 填写你的特定NAS所需的其他信息
5. 连接
6. 如果在之前的步骤中保留了文件,将文件从`/media/frigate_tmp`移动到`/media/frigate`
7. 启动Frigate插件

View File

@ -0,0 +1,50 @@
---
id: ha_notifications
title: Home Assistant 通知
---
开始使用Frigate通知的最佳方式是使用[蓝图](https://community.home-assistant.io/t/frigate-mobile-app-notifications-2-0/559732)。你可以使用蓝图生成的yaml作为起点然后根据需要进行自定义。
通常建议基于`frigate/reviews` mqtt主题来触发通知。这提供了获取[缩略图/快照/剪辑](../integrations/home-assistant.md#notification-api)所需的event_id以及其他用于自定义何时何地接收警报的有用信息。数据以变更源的形式发布这意味着你可以在`before`部分引用对象的"前一个状态",在`after`部分引用对象的"当前状态"。你可以在[这里](../integrations/mqtt.md#frigateevents)查看示例。
以下是一个简单的跟踪对象通知自动化示例它会为每个变更更新现有的通知。这意味着当Frigate找到"更好的"图像时,你在通知中看到的图像会更新。
```yaml
automation:
- alias: Notify of tracked object
trigger:
platform: mqtt
topic: frigate/events
action:
- service: notify.mobile_app_pixel_3
data:
message: '检测到一个 {{trigger.payload_json["after"]["label"]}}。'
data:
image: 'https://your.public.hass.address.com/api/frigate/notifications/{{trigger.payload_json["after"]["id"]}}/thumbnail.jpg?format=android'
tag: '{{trigger.payload_json["after"]["id"]}}'
when: '{{trigger.payload_json["after"]["start_time"]|int}}'
```
注意iOS设备通过在消息数据中添加摄像头实体ID来支持摄像头的实时预览。
```yaml
automation:
- alias: Security_Frigate_Notifications
description: ""
trigger:
- platform: mqtt
topic: frigate/reviews
payload: alert
value_template: "{{ value_json['after']['severity'] }}"
action:
- service: notify.mobile_app_iphone
data:
message: '检测到一个 {{trigger.payload_json["after"]["data"]["objects"] | sort | join(", ") | title}}。'
data:
image: >-
https://your.public.hass.address.com/api/frigate/notifications/{{trigger.payload_json["after"]["data"]["detections"][0]}}/thumbnail.jpg
tag: '{{trigger.payload_json["after"]["id"]}}'
when: '{{trigger.payload_json["after"]["start_time"]|int}}'
entity_id: camera.{{trigger.payload_json["after"]["camera"] | replace("-","_") | lower}}
mode: single
```

View File

@ -0,0 +1,179 @@
---
id: reverse_proxy
title: 设置反向代理
---
本指南概述了在 Frigate 实例前设置反向代理所需的基本配置步骤。
如果你想在自定义 URL、子域名上设置 Frigate或在服务多个站点的主机上设置 Frigate通常需要反向代理。它还可以用于设置你自己的身份验证提供程序或用于更高级的 HTTP 路由。
在设置反向代理之前,请检查 Frigate 的内置功能是否满足你的需求:
|主题|文档|
|-|-|
|TLS|请参阅 `tls` [配置选项](../configuration/tls.md)|
|身份验证|请参阅[身份验证](../configuration/authentication.md)文档|
|IPv6|[启用 IPv6](../configuration/advanced.md#启用ipv6)|
**关于 TLS 的说明**
使用反向代理时TLS 会话通常在代理处终止,通过普通 HTTP 发送内部请求。如果这是所需的行为,必须首先在 Frigate 中禁用 TLS否则你将遇到 HTTP 400 错误:"The plain HTTP request was sent to HTTPS port."(普通 HTTP 请求被发送到 HTTPS 端口)。
要禁用 TLS在你的 Frigate 配置中设置以下内容:
```yml
tls:
enabled: false
```
:::warning
反向代理可用于保护对内部 web 服务器的访问,但用户将完全依赖于他们采取的步骤。你必须确保遵循安全最佳实践。
本页面不试图概述保护内部网站所需的具体步骤。
请使用你自己的知识来评估和审查反向代理软件,然后再在你的系统上安装任何东西。
:::
## 代理
有许多可用的解决方案来实现反向代理,我们欢迎社区通过对本页面的贡献来帮助记录其他方案。
* [Apache2](#apache2-reverse-proxy)
* [Nginx](#nginx-reverse-proxy)
* [Traefik](#traefik-reverse-proxy)
## Apache2 反向代理
在下面的配置示例中,仅包含与上述反向代理方法相关的指令。
在 Debian Apache2 上,配置文件将命名为类似 `/etc/apache2/sites-available/cctv.conf` 的形式。
### 步骤1配置 Apache2 反向代理
通过将 Frigate 界面作为 DNS 子域名而不是主域名的子文件夹来呈现,可以让你的生活更轻松。
在这里,我们通过 https://cctv.mydomain.co.uk 访问 Frigate
```xml
<VirtualHost *:443>
ServerName cctv.mydomain.co.uk
ProxyPreserveHost On
ProxyPass "/" "http://frigatepi.local:8971/"
ProxyPassReverse "/" "http://frigatepi.local:8971/"
ProxyPass /ws ws://frigatepi.local:8971/ws
ProxyPassReverse /ws ws://frigatepi.local:8971/ws
ProxyPass /live/ ws://frigatepi.local:8971/live/
ProxyPassReverse /live/ ws://frigatepi.local:8971/live/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://frigatepi.local:8971/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://frigatepi.local:8971/$1 [P,L]
</VirtualHost>
```
### 步骤2使用 SSL 加密访问你的 Frigate 实例
虽然这本身不会阻止对你的 Frigate web 服务器的访问,但它会加密所有内容(如登录凭据)。
安装 SSL 超出了本文档的范围,但[Let's Encrypt](https://letsencrypt.org/)是一种广泛使用的方法。
这个 Apache2 配置片段会将未加密的请求重定向到 web 服务器的 SSL 端口
```xml
<VirtualHost *:80>
ServerName cctv.mydomain.co.uk
RewriteEngine on
RewriteCond %{SERVER_NAME} =cctv.mydomain.co.uk
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
```
### 步骤3在代理处验证用户
有许多方法可以验证网站,但一种简单的方法是使用 [Apache2 密码文件](https://httpd.apache.org/docs/2.4/howto/auth.html)。
```xml
<VirtualHost *:443>
<Location />
AuthType Basic
AuthName "Restricted Files"
AuthUserFile "/var/www/passwords"
Require user paul
</Location>
</VirtualHost>
```
## Nginx 反向代理
此方法展示了启用 SSL 的子域名类型反向代理的工作示例。
### 设置要反向代理的服务器和端口
这在 `$server``$port` 中设置,应该与你暴露给 docker 容器的端口匹配。可选地,你可以监听端口 `443` 并启用 `SSL`
```
# ------------------------------------------------------------
# frigate.domain.com
# ------------------------------------------------------------
server {
set $forward_scheme http;
set $server "192.168.100.2"; # FRIGATE 服务器位置
set $port 8971;
listen 80;
listen 443 ssl http2;
server_name frigate.domain.com;
}
```
### 设置 SSL可选
此部分指向你的 SSL 文件,下面的示例显示了默认 Let's Encrypt SSL 证书的位置。
```
# Let's Encrypt SSL
include conf.d/include/letsencrypt-acme-challenge.conf;
include conf.d/include/ssl-ciphers.conf;
ssl_certificate /etc/letsencrypt/live/npm-1/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/npm-1/privkey.pem;
```
### 设置反向代理设置
下面的设置启用了连接升级,设置日志记录(可选),并将所有来自 `/` 上下文的内容代理到之前在配置中指定的 docker 主机和端口
```
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
access_log /data/logs/proxy-host-40_access.log proxy;
error_log /data/logs/proxy-host-40_error.log warn;
location / {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
}
```
## Traefik 反向代理
此示例展示了如何向 Frigate Docker compose 文件添加 `label`,使 Traefik 能够自动发现你的 Frigate 实例。
在使用下面的示例之前,你必须首先使用 [Docker provider](https://doc.traefik.io/traefik/providers/docker/) 设置 Traefik
```yml
services:
frigate:
container_name: frigate
image: ghcr.io/blakeblackshear/frigate:stable
...
...
labels:
- "traefik.enable=true"
- "traefik.http.services.frigate.loadbalancer.server.port=8971"
- "traefik.http.routers.frigate.rule=Host(`traefik.example.com`)"
```
上述配置将在 Traefik 中创建一个"服务",自动将你的容器的 IP 和 8971 端口添加为后端。
它还将添加一个路由器,将对 "traefik.example.com" 的请求路由到你的本地容器。
注意,使用这种方法,你不需要为 Frigate 实例暴露任何端口,因为所有流量都将通过内部 Docker 网络路由。

View File

@ -0,0 +1,278 @@
---
id: home-assistant
title: Home Assistant集成
---
与Home Assistant集成的最佳方式是使用[官方集成](https://github.com/blakeblackshear/frigate-hass-integration)。
## 安装
### 准备工作
Frigate集成需要先安装并手动配置`mqtt`集成。
更多详细信息请参见[MQTT集成文档](https://www.home-assistant.io/integrations/mqtt/)。
此外必须在Frigate配置文件中启用MQTT并且Frigate必须连接到与Home Assistant相同的MQTT服务器这样集成创建的许多实体才能正常工作。
### 集成安装
可通过HACS作为默认仓库获取。安装步骤
- 使用[HACS](https://hacs.xyz/)安装集成:
```
Home Assistant > HACS > 点击搜索栏并输入"Frigate" > Frigate
```
- 重启Home Assistant。
- 然后添加/配置集成:
```
Home Assistant > 设置 > 设备和服务 > 添加集成 > Frigate
```
注意你还需要在Home Assistant配置中启用[media_source](https://www.home-assistant.io/integrations/media_source/)才能显示媒体浏览器。
### 可选Lovelace卡片安装
要安装可选的配套Lovelace卡片请参见该卡片的[单独安装说明](https://github.com/dermotduffy/frigate-hass-card)。
## 配置
配置集成时你需要提供Frigate实例的`URL`,可以指向内部未认证端口(`5000`)或认证端口(`8971`。URL可能看起来像`http://<host>:5000/`。
### Docker Compose示例
如果你在同一设备上使用Docker Compose运行Home Assistant和Frigate这里有一些示例。
#### Home Assistant使用主机网络运行
不建议在主机网络模式下运行Frigate。在此示例中配置集成时应使用`http://172.17.0.1:5000`或`http://172.17.0.1:8971`。
```yaml
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
network_mode: host
...
frigate:
image: ghcr.io/blakeblackshear/frigate:stable
...
ports:
- "172.17.0.1:5000:5000"
...
```
#### Home Assistant不使用主机网络运行或在单独的compose文件中
在此示例中,建议连接到认证端口,例如配置集成时使用`http://frigate:8971`。无需为Frigate容器映射端口。
```yaml
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
# network_mode: host
...
frigate:
image: ghcr.io/blakeblackshear/frigate:stable
...
ports:
# - "172.17.0.1:5000:5000"
...
```
### Home Assistant插件
如果你使用Home Assistant插件URL应该是以下之一具体取决于你使用的插件变体。注意如果你使用代理插件不应将集成指向代理URL。只需输入从网络直接访问Frigate时使用的相同URL。
| 插件变体 | URL |
| -------------------------- | ----------------------------------------- |
| Frigate | `http://ccab4aaf-frigate:5000` |
| Frigate (完全访问) | `http://ccab4aaf-frigate-fa:5000` |
| Frigate Beta | `http://ccab4aaf-frigate-beta:5000` |
| Frigate Beta (完全访问) | `http://ccab4aaf-frigate-fa-beta:5000` |
### Frigate在单独的机器上运行
如果你在本地网络内的单独设备上运行FrigateHome Assistant将需要访问端口8971。
#### 本地网络
使用`http://<frigate_device_ip>:8971`作为集成的URL以便需要认证。
```yaml
services:
frigate:
image: ghcr.io/blakeblackshear/frigate:stable
...
ports:
- "8971:8971"
...
```
#### Tailscale或其他私有网络
使用`http://<frigate_device_tailscale_ip>:5000`作为集成的URL。
```yaml
services:
frigate:
image: ghcr.io/blakeblackshear/frigate:stable
...
ports:
- "<tailscale_ip>:5000:5000"
...
```
## 选项
```
Home Assistant > 配置 > 集成 > Frigate > 选项
```
| 选项 | 描述 |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| RTSP URL模板 | 用于覆盖标准RTSP流URL的[jinja2](https://jinja.palletsprojects.com/)模板(例如,用于反向代理)。此选项仅对启用了[高级模式](https://www.home-assistant.io/blog/2019/07/17/release-96/#advanced-mode)的用户显示。参见下方的[RTSP流](#rtsp-stream)。 |
## 提供的实体
| 平台 | 描述 |
| --------------- | ------------------------------------------------------------------------------- |
| `camera` | 实时摄像头流需要RTSP |
| `image` | 每个摄像头最新检测对象的图像 |
| `sensor` | 用于监控Frigate性能的状态所有区域和摄像头的对象计数 |
| `switch` | 用于切换检测、录制和快照的开关实体 |
| `binary_sensor` | 每个摄像头/区域/对象的"运动"二进制传感器实体 |
## 媒体浏览器支持
该集成提供:
- 带缩略图的跟踪对象录像浏览
- 快照浏览
- 按月、日、摄像头、时间浏览录像
可以通过Home Assistant左侧菜单面板中的"媒体浏览器"访问。
## 将剪辑投射到媒体设备
该集成支持将剪辑和摄像头流投射到支持的媒体设备。
:::tip
要使剪辑可以投射到媒体设备,需要音频,可能需要[为录制启用音频](../troubleshooting/faqs.md#audio-in-recordings)。
**注意:即使你的摄像头不支持音频,也需要启用音频才能接受投射。**
:::
<a name="api"></a>
## 通知API
许多人不想将Frigate暴露给网络因此该集成创建了一些可用于通知的公共API端点。
加载跟踪对象的缩略图:
```
https://HA_URL/api/frigate/notifications/<event-id>/thumbnail.jpg
```
加载跟踪对象的快照:
```
https://HA_URL/api/frigate/notifications/<event-id>/snapshot.jpg
```
使用Android设备加载跟踪对象的视频剪辑
```
https://HA_URL/api/frigate/notifications/<event-id>/clip.mp4
```
使用iOS设备加载跟踪对象的视频剪辑
```
https://HA_URL/api/frigate/notifications/<event-id>/master.m3u8
```
加载跟踪对象的预览gif
```
https://HA_URL/api/frigate/notifications/<event-id>/event_preview.gif
```
加载核查项目的预览gif
```
https://HA_URL/api/frigate/notifications/<review-id>/review_preview.gif
```
<a name="streams"></a>
## RTSP流
为了使实时流能够正常工作需要在RTSP端口默认`8554`)上的`<frigatehost>:8554`访问它们。当查看实时摄像头时Home Assistant将直接连接到该流媒体端口。
#### RTSP URL模板
对于高级用例,可以使用[RTSP URL模板](#options)选项更改此行为。设置后,此字符串将覆盖从上述默认行为派生的默认流地址。此选项支持[jinja2模板](https://jinja.palletsprojects.com/),并且有来自[Frigate API](../integrations/api)的`camera`字典变量可用于模板。注意模板中没有Home Assistant状态可用只有来自Frigate的摄像头字典。
当Frigate位于反向代理后面和/或当默认流端口因其他原因例如防火墙规则无法访问Home Assistant时这可能很有用。
###### RTSP URL模板示例
使用不同的端口号:
```
rtsp://<frigate_host>:2000/front_door
```
在流URL中使用摄像头名称
```
rtsp://<frigate_host>:2000/{{ name }}
```
在流URL中使用摄像头名称先转换为小写
```
rtsp://<frigate_host>:2000/{{ name|lower }}
```
## 多实例支持
Frigate集成无缝支持使用多个Frigate服务器。
### 多实例要求
为了使多个Frigate实例正常工作每个服务器必须设置不同的`topic_prefix`和`client_id`参数。
有关如何设置这些参数,请参见[MQTT配置](mqtt)。
#### API URL
配置多个Frigate实例时[API](#notification-api) URL应包含标识符以告诉Home Assistant要引用哪个Frigate实例。使用的标识符是配置中包含的MQTT `client_id`参数,使用方式如下:
```
https://HA_URL/api/frigate/<client-id>/notifications/<event-id>/thumbnail.jpg
```
```
https://HA_URL/api/frigate/<client-id>/clips/front_door-1624599978.427826-976jaa.mp4
```
#### 默认处理
配置单个Frigate实例时URL/标识符中不需要指定`client-id`参数 - 假定使用该单个实例。配置多个Frigate实例时用户**必须**明确指定他们要引用哪个服务器。
## 常见问题
#### 如果我检测多个对象如何在HomeKit中将正确的`binary_sensor`分配给摄像头?
[HomeKit集成](https://www.home-assistant.io/integrations/homekit/)随机链接Home Assistant中与摄像头设备分组的二进制传感器运动传感器实体之一。你可以在Home Assistant的[HomeKit配置](https://www.home-assistant.io/integrations/homekit/#linked_motion_sensor)中为每个摄像头指定`linked_motion_sensor`。
#### 我基于占用传感器设置了自动化。有时传感器打开时自动化运行了但当我查看Frigate时找不到触发传感器的对象。这是bug吗
不是。占用传感器的检查较少,因为它们通常用于需要尽可能低延迟的事情,如开灯。因此这些传感器有时会被误报触发。如果你想要误报过滤,应该使用`frigate/events`或`frigate/reviews`主题上的mqtt传感器。

View File

@ -0,0 +1,391 @@
---
id: mqtt
title: MQTT
---
:::tip
由于本文涉及过多专业领域内容对普通用户帮助不算特别多将不会进行精翻本文使用DeepSeek AI进行翻译仅做参考。
:::
这些是由Frigate生成的MQTT消息。默认的主题前缀是`frigate`,但可以在配置文件中更改。
## Frigate通用主题
### `frigate/available`
设计用于与Home Assistant的可用性主题配合使用。可能的消息有
"online"当Frigate运行时发布在启动时
"offline"当Frigate停止后发布
### `frigate/restart`
导致Frigate退出。Docker应该配置为在退出时自动重启容器。
### `frigate/events`
为每个变化的跟踪对象发布消息。当跟踪对象不再被标记为false_positive时发布第一条消息。当Frigate找到跟踪对象的更好快照或发生区域变化时它将发布具有相同id的消息。当跟踪对象结束时将发布一条带有`end_time`设置的最终消息。
```json
{
"type": "update", // new新建, update更新, end结束
"before": {
"id": "1607123955.475377-mxklsc",
"camera": "front_door",
"frame_time": 1607123961.837752,
"snapshot_time": 1607123961.837752,
"label": "person",
"sub_label": null,
"top_score": 0.958984375,
"false_positive": false,
"start_time": 1607123955.475377,
"end_time": null,
"score": 0.7890625,
"box": [424, 500, 536, 712],
"area": 23744,
"ratio": 2.113207,
"region": [264, 450, 667, 853],
"current_zones": ["driveway"],
"entered_zones": ["yard", "driveway"],
"thumbnail": null,
"has_snapshot": false,
"has_clip": false,
"active": true, // 便利属性,与"stationary"相反
"stationary": false, // 对象是否被认为是静止的
"motionless_count": 0, // 对象保持静止的帧数
"position_changes": 2, // 对象从静止位置移动的次数
"attributes": {
"face": 0.64
}, // 在对象上任何时候被识别的具有最高分数的属性
"current_attributes": [], // 此帧中当前属性的详细数据
"current_estimated_speed": 0.71, // 通过启用速度估算的区域移动的对象的当前估计速度mph或kph
"velocity_angle": 180, // 通过启用速度估算的区域移动的对象相对于帧的行进方向
"recognized_license_plate": "ABC12345", // 汽车对象的已识别车牌
"recognized_license_plate_score": 0.933451
},
"after": {
"id": "1607123955.475377-mxklsc",
"camera": "front_door",
"frame_time": 1607123962.082975,
"snapshot_time": 1607123961.837752,
"label": "person",
"sub_label": ["John Smith", 0.79],
"top_score": 0.958984375,
"false_positive": false,
"start_time": 1607123955.475377,
"end_time": null,
"score": 0.87890625,
"box": [432, 496, 544, 854],
"area": 40096,
"ratio": 1.251397,
"region": [218, 440, 693, 915],
"current_zones": ["yard", "driveway"],
"entered_zones": ["yard", "driveway"],
"thumbnail": null,
"has_snapshot": false,
"has_clip": false,
"active": true, // 便利属性,与"stationary"相反
"stationary": false, // 对象是否被认为是静止的
"motionless_count": 0, // 对象保持静止的帧数
"position_changes": 2, // 对象改变位置的次数
"attributes": {
"face": 0.86
}, // 在对象上任何时候被识别的具有最高分数的属性
"current_attributes": [
// 此帧中当前属性的详细数据
{
"label": "face",
"box": [442, 506, 534, 524],
"score": 0.86
}
],
"current_estimated_speed": 0.77, // 通过启用速度估算的区域移动的对象的当前估计速度mph或kph
"velocity_angle": 180, // 通过启用速度估算的区域移动的对象相对于帧的行进方向
"recognized_license_plate": "ABC12345", // 汽车对象的已识别车牌
"recognized_license_plate_score": 0.933451
}
}
```
### `frigate/tracked_object_update`
当跟踪对象元数据更新时发布的消息例如当GenAI运行并返回跟踪对象描述时。
```json
{
"type": "description",
"id": "1607123955.475377-mxklsc",
"description": "The car is a red sedan moving away from the camera."
}
```
### `frigate/reviews`
为每个变化的核查项目发布消息。当`检测`或`警报`初始化时发布第一条消息。当检测到其他对象或发生区域变化时会发布具有相同id的`update`消息。当核查活动结束时,发布最终的`end`消息。
```json
{
"type": "update", // new新建, update更新, end结束
"before": {
"id": "1718987129.308396-fqk5ka", // review_id核查ID
"camera": "front_cam",
"start_time": 1718987129.308396,
"end_time": null,
"severity": "detection",
"thumb_path": "/media/frigate/clips/review/thumb-front_cam-1718987129.308396-fqk5ka.webp",
"data": {
"detections": [
// 事件ID列表
"1718987128.947436-g92ztx",
"1718987148.879516-d7oq7r",
"1718987126.934663-q5ywpt"
],
"objects": ["person", "car"],
"sub_labels": [],
"zones": [],
"audio": []
}
},
"after": {
"id": "1718987129.308396-fqk5ka",
"camera": "front_cam",
"start_time": 1718987129.308396,
"end_time": null,
"severity": "alert",
"thumb_path": "/media/frigate/clips/review/thumb-front_cam-1718987129.308396-fqk5ka.webp",
"data": {
"detections": [
"1718987128.947436-g92ztx",
"1718987148.879516-d7oq7r",
"1718987126.934663-q5ywpt"
],
"objects": ["person", "car"],
"sub_labels": ["Bob"],
"zones": ["front_yard"],
"audio": []
}
}
}
```
### `frigate/stats`
与`/api/stats`相同的数据,按可配置的间隔发布。
### `frigate/camera_activity`
返回每个摄像头的当前功能状态,包括是否检测到运动、对象等。可以通过向`frigate/onConnect`发布消息来触发。
### `frigate/notifications/set`
控制通知开关的主题。期望值为`ON`和`OFF`。
### `frigate/notifications/state`
通知当前状态的主题。发布值为`ON`和`OFF`。
## Frigate摄像头主题
### `frigate/<camera_name>/<object_name>`
发布摄像头检测到的对象数量用于Home Assistant传感器。
`all`可作为object_name表示摄像头所有对象的计数。
### `frigate/<camera_name>/<object_name>/active`
发布摄像头检测到的活动对象数量用于Home Assistant传感器。
`all`可作为object_name表示摄像头所有活动对象的计数。
### `frigate/<zone_name>/<object_name>`
发布区域内检测到的对象数量用于Home Assistant传感器。
`all`可作为object_name表示区域内所有对象的计数。
### `frigate/<zone_name>/<object_name>/active`
发布区域内活动对象的数量用于Home Assistant传感器。
`all`可作为object_name表示区域内所有活动对象的计数。
### `frigate/<camera_name>/<object_name>/snapshot`
发布检测到对象类型的JPEG编码帧。当对象不再被检测到时发布最高置信度的图像或重新发布原始图像。
快照的高度和裁剪可在配置中设置。
### `frigate/<camera_name>/audio/<audio_type>`
当检测到特定类型音频时发布"ON",未检测到时发布"OFF"用于Home Assistant传感器。
### `frigate/<camera_name>/audio/dBFS`
发布该摄像头检测到的音频dBFS值。
**注意:**需要启用音频检测
### `frigate/<camera_name>/audio/rms`
发布该摄像头检测到的音频RMS值。
**注意:**需要启用音频检测
### `frigate/<camera_name>/enabled/set`
控制Frigate对摄像头处理的开关主题。期望值为`ON`和`OFF`。
### `frigate/<camera_name>/enabled/state`
摄像头处理当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/detect/set`
控制摄像头对象检测的开关主题。期望值为`ON`和`OFF`。
### `frigate/<camera_name>/detect/state`
摄像头对象检测当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/audio/set`
控制摄像头音频检测的开关主题。期望值为`ON`和`OFF`。
### `frigate/<camera_name>/audio/state`
摄像头音频检测当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/recordings/set`
控制摄像头录制的开关主题。期望值为`ON`和`OFF`。
### `frigate/<camera_name>/recordings/state`
摄像头录制当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/snapshots/set`
控制摄像头快照的开关主题。期望值为`ON`和`OFF`。
### `frigate/<camera_name>/snapshots/state`
摄像头快照当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/motion/set`
控制摄像头运动检测的开关主题。期望值为`ON`和`OFF`。
注意:如果检测未禁用,关闭运动检测将失败。
### `frigate/<camera_name>/motion`
摄像头当前是否检测到运动。期望值为`ON`和`OFF`。
注意:在最初检测到运动后,`ON`状态将持续到`mqtt_off_delay`秒默认30秒内没有检测到运动为止。
### `frigate/<camera_name>/motion/state`
摄像头运动检测当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/improve_contrast/set`
控制摄像头对比度增强的开关主题。期望值为`ON`和`OFF`。
### `frigate/<camera_name>/improve_contrast/state`
摄像头对比度增强当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/motion_threshold/set`
调整摄像头运动阈值的主题。期望值为整数。
### `frigate/<camera_name>/motion_threshold/state`
摄像头当前运动阈值的主题。发布值为整数。
### `frigate/<camera_name>/motion_contour_area/set`
调整摄像头运动轮廓区域的主题。期望值为整数。
### `frigate/<camera_name>/motion_contour_area/state`
摄像头当前运动轮廓区域的主题。发布值为整数。
### `frigate/<camera_name>/review_status`
摄像头当前活动状态的主题。可能的值为`NONE`、`DETECTION`或`ALERT`。
### `frigate/<camera_name>/ptz`
向摄像头发送PTZ命令的主题。
| 命令 | 描述 |
| ---------------------- | ----------------------------------------------------------------------------------------- |
| `preset_<preset_name>` | 发送命令移动到名为`<preset_name>`的预设位置 |
| `MOVE_<dir>` | 发送命令持续向`<dir>`方向移动,可能的值为[UP, DOWN, LEFT, RIGHT] |
| `ZOOM_<dir>` | 发送命令持续进行`<dir>`方向的缩放,可能的值为[IN, OUT] |
| `STOP` | 发送停止移动命令 |
### `frigate/<camera_name>/ptz_autotracker/set`
控制摄像头PTZ自动跟踪器的开关主题。期望值为`ON`和`OFF`。
### `frigate/<camera_name>/ptz_autotracker/state`
摄像头PTZ自动跟踪器当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/ptz_autotracker/active`
确定PTZ自动跟踪器是否正在主动跟踪对象的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/review_alerts/set`
控制摄像头警报核查的开关主题。期望值为`ON`和`OFF`。
### `frigate/<camera_name>/review_alerts/state`
摄像头警报核查当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/review_detections/set`
控制摄像头检测核查的开关主题。期望值为`ON`和`OFF`。
### `frigate/<camera_name>/review_detections/state`
摄像头检测核查当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/birdseye/set`
控制摄像头鸟瞰视图的开关主题。期望值为`ON`和`OFF`。鸟瞰模式必须在配置中启用。
### `frigate/<camera_name>/birdseye/state`
摄像头鸟瞰视图当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/birdseye_mode/set`
设置摄像头鸟瞰模式的主题。鸟瞰视图提供不同的模式来自定义摄像头显示的情况。
_注意从`CONTINUOUS`切换到`MOTION | OBJECTS`值时摄像头从视图中移除最多需要30秒。_
| 命令 | 描述 |
| ------------ | ----------------------------------------------------------------- |
| `CONTINUOUS` | 始终包含 |
| `MOTION` | 在最近30秒内检测到运动时显示 |
| `OBJECTS` | 在最近30秒内有活动跟踪对象时显示 |
### `frigate/<camera_name>/birdseye_mode/state`
摄像头鸟瞰模式当前状态的主题。发布值为`CONTINUOUS`、`MOTION`、`OBJECTS`。
### `frigate/<camera_name>/notifications/set`
控制通知的开关主题。期望值为`ON`和`OFF`。
### `frigate/<camera_name>/notifications/state`
通知当前状态的主题。发布值为`ON`和`OFF`。
### `frigate/<camera_name>/notifications/suspend`
暂停通知特定分钟数的主题。期望值为整数。
### `frigate/<camera_name>/notifications/suspended`
通知暂停截止时间的主题。发布值为UNIX时间戳如果通知未暂停则为0。

View File

@ -0,0 +1,78 @@
---
id: plus
title: Frigate+
---
关于如何使用Frigate+来改进你的模型的更多信息,请参见[Frigate+文档](/plus/)。
## 设置
### 创建账户
可以在[https://plus.frigate.video](https://plus.frigate.video)创建免费账户。
### 生成API密钥
登录后你可以在设置中为Frigate生成API密钥。
![API密钥](/img/plus-api-key-min.png)
### 设置API密钥
在Frigate中你可以使用名为`PLUS_API_KEY`的环境变量或docker密钥来启用浏览页面上的`Frigate+`按钮。Home Assistant插件用户可以在设置 > 插件 > Frigate > 配置 > 选项下设置(确保切换"显示未使用的可选配置选项"开关)。
:::warning
你不能使用Frigate配置文件中的`environment_vars`部分来设置此环境变量。它必须在docker配置或Home Assistant插件配置中定义为环境变量。
:::
## 提交示例
一旦配置了API密钥你就可以直接从Frigate的浏览页面提交示例。从更多筛选菜单中选择"Has a Snapshot - Yes"和"Submitted to Frigate+ - No",然后点击窗格底部的应用。然后,点击缩略图并选择快照标签。
你可以使用键盘的左右箭头键快速浏览跟踪对象的快照。
:::note
必须启用快照功能才能向Frigate+提交示例
:::
![提交到Plus](/img/plus/submit-to-plus.jpg)
### 标注和验证
你可以在[https://plus.frigate.video](https://plus.frigate.video)查看所有已提交的图像。点击图像可以添加标注。有关标注的更详细信息,请参见[改进你的模型](../plus/improving_model.md)文档。
![标注](/img/annotate.png)
## 使用模型
一旦你[请求了第一个模型](../plus/first_model.md)并获得了自己的模型ID就可以使用特殊的模型路径。Frigate+模型不需要配置其他信息因为它会自动从Frigate+获取剩余的配置。
你可以在Frigate UI的设置页面的Frigate+面板中选择新模型,或在配置中手动设置根级别的模型:
```yaml
model:
path: plus://<your_model_id>
```
:::note
模型ID不是秘密值可以自由共享。对模型的访问由你的API密钥保护。
:::
模型会下载到`/config/model_cache`文件夹中,并且只在需要时才下载。
如果需要你可以覆盖Frigate+模型的标签映射。不建议这样做因为如果标签在Frigate+中不可用重命名标签会导致提交到Frigate+的功能失效。
```yaml
model:
path: plus://<your_model_id>
labelmap:
3: animal
4: animal
5: animal
```

View File

@ -0,0 +1,28 @@
---
id: third_party_extensions
title: 第三方扩展
---
作为开源项目其他开发者可以修改和扩展Frigate已有的丰富功能。
本页面旨在概述可以添加到家庭NVR设置中的扩展。此列表并非详尽无遗可以通过PR方式扩展到Frigate文档中。这些服务大多设计为通过5000端口与Frigate的未认证API接口进行交互。
:::warning
本页面不对展示的项目进行推荐或评级。
在系统上安装任何内容之前,请使用您自己的知识来评估和审查它们。
:::
## [Double Take](https://github.com/skrashevich/double-take)
[Double Take](https://github.com/skrashevich/double-take)为人脸识别的图像处理和训练提供了统一的UI和API。
它支持自动为Frigate中检测和识别到的人物对象设置子标签。
这是[原始Double Take项目](https://github.com/jakowenko/double-take)的一个分支(修复了错误并添加了新功能),不幸的是,原始项目已不再由作者维护。
## [Frigate Notify](https://github.com/0x2142/frigate-notify)
[Frigate Notify](https://github.com/0x2142/frigate-notify)是一个简单的应用程序设计用于将Frigate的通知发送到您喜欢的平台。适用于独立安装的Frigate - 不需要Home AssistantMQTT是可选的但推荐使用。
## [Frigate telegram](https://github.com/OldTyT/frigate-telegram)
[Frigate telegram](https://github.com/OldTyT/frigate-telegram)使得可以将Frigate的事件发送到Telegram。事件以文本描述、视频和缩略图的形式作为消息发送。

View File

@ -0,0 +1,17 @@
---
id: mdx
title: Powered by MDX
---
You can write JSX and use React components within your Markdown thanks to [MDX](https://mdxjs.com/).
export const Highlight = ({children, color}) => ( <span style={{
backgroundColor: color,
borderRadius: '2px',
color: '#fff',
padding: '0.2rem',
}}>{children}</span> );
<Highlight color="#25c2a0">Docusaurus green</Highlight> and <Highlight color="#1877F2">Facebook blue</Highlight> are my favorite colors.
I can write **Markdown** alongside my _JSX_!

View File

@ -0,0 +1,34 @@
---
id: faq
title: 常见问题
---
### 我的模型是仅基于我上传的图片训练的吗?它们是如何构建的?
Frigate+模型是通过使用你已标注和验证的图片对基础模型进行微调来构建的。基础模型是从所有Frigate+用户提交的图片样本中从头开始训练的需要数周的昂贵GPU资源。如果模型仅使用你上传的图片构建你需要提供数万个示例而且训练需要一周以上的时间并且成本可观。数据的多样性有助于模型的泛化。
### 使用Frigate+模型时,我的视频流是否会被发送到云端进行分析?
不会。Frigate+模型是默认模型的直接替代品。所有处理都像往常一样在本地进行。唯一发送到Frigate+的图片是你通过`发送到Frigate+`按钮特别提交的或直接上传的图片。
### 我可以标注任何我想要的内容,并训练模型识别我的自定义对象吗?
目前不行。目前,标签集对所有用户都是一致的。在开发完全自定义用户标签之前,重点将放在扩展这个标签集上。
### Frigate+模型可以离线使用吗?
可以。模型和元数据存储在配置文件夹中的`model_cache`目录中。只有当缓存中不存在模型时Frigate才会尝试下载模型。这意味着你可以备份该目录和/或完全离线使用它。
### 如果我不续订订阅我可以继续使用我的Frigate+模型吗?
可以。Frigate+的订阅提供对用于训练模型的基础设施的访问权限。使用你的订阅训练的模型是你永久拥有和使用的。但是请注意,条款和条件禁止你分享、转售或从这些模型创建衍生产品。
### 为什么我无法向Frigate+提交图片?
如果你已配置了API密钥且UI中的Frigate+设置页面显示密钥处于活动状态,你需要确保为想要提交图片的摄像头同时启用了快照和`clean_copy`快照功能。请注意,当启用快照时,`clean_copy`默认是启用的。
```yaml
snapshots:
enabled: true
clean_copy: true
```

View File

@ -0,0 +1,69 @@
---
id: first_model
title: 请求你的第一个模型
---
## 步骤1上传并标注你的图片
在请求你的第一个模型之前你需要向Frigate+上传并验证至少10张图片。上传、标注和验证的图片越多结果就会越好。大多数用户在每个摄像头至少有100张已验证的图片后就开始看到非常好的结果。请记住要包含各种不同的条件。你需要在阴天、晴天、黎明、黄昏和夜间的图片。有关如何直接从Frigate轻松提交图片到Frigate+的说明,请参阅[集成文档](../integrations/plus.md#generate-an-api-key)。
建议同时提交**正确检测样本**和**误报样本**。这将帮助模型区分什么是正确的检测什么是错误的检测。你应该在所有图片中争取达到80%的正确检测样本和20%的误报样本的目标。如果你在特定区域遇到误报,在相似光照条件下提交该区域附近任何对象类型的正确检测样本将有助于教会模型在没有对象存在时该区域的样子。
有关更详细的建议,你可以参考[改进你的模型](./improving_model.md)的文档。
## 步骤2提交模型请求
一旦你有了初始的已验证图片集,你就可以在模型页面上请求一个模型。关于选择模型类型的指导,请参考[文档的这一部分](./index.md#available-model-types)。每个模型请求需要使用年度订阅中包含的12次训练中的1次。这个模型将支持所有[可用的标签类型](./index.md#available-label-types)即使你没有为这些标签提交任何示例。模型创建可能需要长达36小时。
![Plus模型页面](/img/plus/plus-models.jpg)
## 步骤3在配置中设置你的模型ID
当你的Frigate+模型准备就绪时,你将收到电子邮件通知。
![模型就绪邮件](/img/plus/model-ready-email.jpg)
Frigate+中可用的模型可以使用特殊的模型路径。不需要配置其他信息因为它会自动从Frigate+获取剩余的配置。
```yaml
model:
path: plus://<your_model_id>
```
:::note
模型ID不是秘密值可以自由共享。对你的模型的访问由你的API密钥保护。
:::
## 步骤4调整你的对象过滤器以获得更高的分数
Frigate+模型通常比Frigate提供的默认模型有更高的分数。你可能需要增加你的`threshold`和`min_score`值。以下是如何优化这些值的示例,但你应该预期这些值会随着模型的改进而演变。有关`threshold`和`min_score`如何相关的更多信息,请参见[对象过滤器](../configuration/object_filters.md#object-scores)文档。
```yaml
objects:
filters:
dog:
min_score: .7
threshold: .9
cat:
min_score: .65
threshold: .8
face:
min_score: .7
package:
min_score: .65
threshold: .9
license_plate:
min_score: .6
amazon:
min_score: .75
ups:
min_score: .75
fedex:
min_score: .75
person:
min_score: .65
threshold: .85
car:
min_score: .65
threshold: .85
```

View File

@ -0,0 +1,54 @@
---
id: improving_model
title: 优化你的模型
---
你可能会发现Frigate+模型最初会产生更多误报但通过提交正确检测样本和误报样本模型会不断改进。随着订阅用户提交的新图像越来越多未来的基础模型也会随之改进。请注意只有包含至少一个已验证标签的图像才会用于训练你的模型。从Frigate提交图像作为正确检测或误报样本不会自动验证该图像你仍需在Frigate+中验证图像才能用于训练。
- **同时提交正确检测样本和误报样本**这有助于模型区分正确和错误的检测。建议保持80%的正确检测样本和20%的误报样本的比例。如果在特定区域出现误报,在相似光照条件下提交该区域附近任何对象类型的正确检测样本,将帮助模型学习无对象时该区域的特征。
- **适当降低阈值以获取阈值附近更多样本**例如如果有68%分数的误报和72%分数的正确检测可以尝试将阈值降至65%并提交该范围内的样本。这有助于模型学习并扩大正确检测与误报之间的分数差距。
- **提交多样化的图像**最佳效果需要每个摄像头至少100张已验证图像。需包含不同条件下的样本阴天、晴天、黎明、黄昏和夜间。当环境变化时如夏季转冬季或有新家具时可能需要提交新样本来应对新型误报。
## 正确标注图像
遵循以下指南可获得最佳效果:
**标注图像中每个对象**:验证前标注所有对象很重要。如果未标注汽车,模型会误认为该区域不是汽车。可以排除不想检测的标签。
**使用紧密的边界框**:更精确的边界框能提高识别准确率,确保运行时预测的边界框更精准。
**即使被遮挡也要标注完整对象**:如人物被汽车遮挡,仍应标注整个人物。这有助于预测准确边界框,提高区域准确性和运行时过滤效果。若对象部分在画面外,仅当人眼可识别时才标注。
**难以识别的对象标记为"困难"**:当对象确实难以辨认时(如灌木丛后隐约可见的汽车或夜间难辨的狗),标记为"困难"。目前这不影响训练,但未来会纳入考量。
**快递标识如`amazon`、`ups`和`fedex`应单独标注**对Fedex卡车用`car`标注整车再为Fedex标识单独标注边界框。多个标识需分别标注。
![Fedex标识](/img/plus/fedex-logo.jpg)
## 误报标注
误报会显示红色框和删除线标签。
![误报示例](/img/plus/false-positive.jpg)
错误识别的对象应添加正确标签。例如若将人误识别为猫应在Frigate中提交为误报并添加人物标签。边界框会重叠。
![重叠标注示例](/img/plus/false-positive-overlap.jpg)
## 快捷操作指南
| 快捷键 | 功能描述 |
| --------------- | ------------------------- |
| `?` | 显示所有快捷键 |
| `w` | 添加边界框 |
| `d` | 切换困难标记 |
| `s` | 切换至下一个标签 |
| `tab` | 选择下一个最大边界框 |
| `del` | 删除当前边界框 |
| `esc` | 取消选择/取消操作 |
| `← ↑ → ↓` | 移动边界框 |
| `Shift+方向键` | 调整边界框大小 |
| `滚轮` | 缩放视图 |
| `f` | 隐藏/显示非当前边界框 |
| `空格键` | 验证并保存 |

View File

@ -0,0 +1,88 @@
---
id: index
title: 模型
---
<a href="https://frigate.video/plus" target="_blank" rel="nofollow">Frigate+</a> 提供基于Frigate+用户从安防摄像头提交的图像训练的模型这些模型专门为Frigate分析视频的方式设计。这些模型能以更少资源提供更高准确性。您上传的图像用于微调一个基于所有Frigate+用户上传图像训练的基础模型,最终得到一个针对您特定环境优化的高精度模型。
:::info
订阅后基础模型不会直接可用。未来可能会改变,但目前您需要提交包含最低数量图像的模型请求。
:::
订阅包含每年12次模型训练。取消订阅后您仍可保留已训练模型的使用权。提交模型请求或购买额外训练需要有效订阅。
集成Frigate+的方法请参阅[集成文档](../integrations/plus.md)。
## 可用模型类型
Frigate+提供两种模型类型:`mobiledet`和`yolonas`。两者都是目标检测模型,能检测[下方列出的相同标签](#可用标签类型)。
不是所有检测器都支持所有模型类型,请根据[支持的检测器类型](#支持的检测器类型)表格选择匹配您检测器的模型。
| 模型类型 | 描述 |
| ---------- | ----------------------------------------------------------------------------------------------------- |
| `mobiledet` | 基于与Frigate默认模型相同的架构。可在Google Coral设备和CPU上运行。 |
| `yolonas` | 新架构精度略高且对小目标检测有改进。支持Intel、NVIDIA GPU和AMD GPU。 |
## 支持的检测器类型
目前Frigate+模型支持CPU(`cpu`)、Google Coral(`edgetpu`)、OpenVino(`openvino`)和ONNX(`onnx`)检测器。
:::warning
Frigate+模型与`onnx`检测器的配合使用仅限Frigate 0.15及以上版本。
:::
| 硬件 | 推荐检测器类型 | 推荐模型类型 |
| ------------------------------------------------------------------------------------------------------------------------ | -------------- | ------------ |
| [CPU](/configuration/object_detectors.md#cpu检测器不推荐使用) | `cpu` | `mobiledet` |
| [Coral(所有形态)](/configuration/object_detectors.md#edge-tpu检测器) | `edgetpu` | `mobiledet` |
| [Intel](/configuration/object_detectors.md#openvino检测器) | `openvino` | `yolonas` |
| [NVIDIA GPU](https://deploy-preview-13787--frigate-docs.netlify.app/configuration/object_detectors#onnx)\* | `onnx` | `yolonas` |
| [AMD ROCm GPU](https://deploy-preview-13787--frigate-docs.netlify.app/configuration/object_detectors#amdrocm-gpu检测器)\* | `onnx` | `yolonas` |
_\* 需要Frigate 0.15版本_
## 可用标签类型
Frigate+模型支持更适合安防摄像头的对象集。当前支持以下对象:
- **人物**`person`、`face`
- **车辆**`car`、`motorcycle`、`bicycle`、`boat`、`license_plate`
- **快递标识**`amazon`、`usps`、`ups`、`fedex`、`dhl`、`an_post`、`purolator`、`postnl`、`nzpost`、`postnord`、`gls`、`dpd`
- **动物**`dog`、`cat`、`deer`、`horse`、`bird`、`raccoon`、`fox`、`bear`、`cow`、`squirrel`、`goat`、`rabbit`
- **其他**`package`、`waste_bin`、`bbq_grill`、`robot_lawnmower`、`umbrella`
Frigate默认模型中的其他对象类型暂不支持。未来版本将增加更多对象类型。
### 标签属性
使用Frigate+模型时,某些标签有特殊处理方式。`face`、`license_plate`及快递标识如`amazon`、`ups`和`fedex`被视为属性标签,不会像常规对象那样被追踪,也不会直接生成核查项。此外,`threshold`过滤器对这些标签无效,您需要根据需要调整`min_score`和其他过滤值。
要启用这些属性标签,需将其添加到追踪对象列表:
```yaml
objects:
track:
- person
- face
- license_plate
- dog
- cat
- car
- amazon
- fedex
- ups
- package
```
使用Frigate+模型时,系统会为人物对象选择面部最清晰的快照,为车辆选择车牌最清晰的快照。这有助于面部识别和车牌识别等二次处理。
![面部属性示例](/img/plus/attribute-example-face.jpg)
快递标识如`amazon`、`ups`和`fedex`用于自动为车辆对象分配子标签。
![Fedex属性示例](/img/plus/attribute-example-fedex.jpg)

View File

@ -0,0 +1,84 @@
---
id: edgetpu
title: EdgeTPU故障排除
---
## USB Coral未被检测到
USB coral未被检测到可能有多种原因有些是特定操作系统的问题。理解USB coral的工作原理很重要
1. 当设备首次插入且未初始化时,运行`lsusb`或在HA OS的硬件页面中查看时会显示为`1a6e:089a Global Unichip Corp.`
2. 初始化后,运行`lsusb`或在HA OS的硬件页面中查看时会显示为`18d1:9302 Google Inc.`
:::tip
在Frigate使用coral进行推理之前使用`lsusb`或查看HA OS的硬件页面时会显示为`1a6e:089a Global Unichip Corp.`。因此在Frigate尝试检测coral之前不用担心这个标识。
:::
如果coral无法初始化Frigate就无法与其通信。基于USB的Coral无法初始化的一些常见原因包括
### 供电不足
USB coral可能需要高达900mA的电流这对某些设备上的USB端口来说可能太高特别是对RPi这样的小型单板计算机。如果coral无法初始化建议采取以下步骤
1. 尝试使用不同的端口,某些端口能提供更大的功率。
2. 确保使用USB3端口这对于供电和确保coral以最高速度运行都很重要。
3. 尝试使用不同的数据线,一些用户发现随附的数据线效果不佳。
4. 使用外部供电的USB集线器。
### 设备访问权限不正确
USB coral在未初始化和初始化状态下有不同的ID。
- 在VM、Proxmox lxc等环境中运行Frigate时必须确保两个设备ID都已映射。
- 通过Home Assistant OS运行时可能需要运行完全访问版本的Frigate插件并禁用_保护模式_开关以访问coral。
### Synology 716+II运行DSM 7.2.1-69057 Update 5
一些用户报告这款较旧的设备运行较旧的内核导致coral无法被检测到。以下步骤可以帮助正确检测
1. 将coral TPU插入NAS的任意USB端口
2. 打开控制面板-信息界面。coral TPU会显示为通用设备。
3. 在配置中启用Coral TPU并启动docker容器
4. TPU会被检测到但几分钟后会断开连接。
5. 保持TPU设备插入状态通过UI中的重启命令重启NAS。不要拔掉NAS电源或关机。
6. 打开控制面板-信息界面。coral TPU现在会被识别为USB设备 - google inc
7. 启动frigate容器。现在一切应该正常工作了
## USB Coral检测似乎卡住
USB Coral可能会卡住需要重启这可能由多种硬件和软件设置原因导致。一些常见原因是
1. 一些用户发现coral随附的数据线会导致这个问题换用其他数据线可以完全解决。
2. 在VM中运行Frigate可能导致与设备的通信中断需要重置。
## PCIe Coral未被检测到
PCIe Coral未被检测到最常见的原因是驱动程序未安装。这个过程因操作系统和内核版本而异。
- 在大多数情况下,[Coral文档](https://coral.ai/docs/m2/get-started/#2-install-the-pcie-driver-and-edge-tpu-runtime)展示了如何为基于PCIe的Coral安装驱动程序。
- 对于Ubuntu 22.04+可以使用https://github.com/jnicolson/gasket-builder 来构建和安装最新版本的驱动程序。
## 尝试加载TPU为pci时出现"Fatal Python error: Illegal instruction"
这是由于在新的linux内核上使用过时的gasket驱动程序导致的问题。从https://github.com/jnicolson/gasket-builder 安装更新的驱动程序据报可以解决此问题。
### 在Raspberry Pi5上无法检测
由于RPi5的内核更新需要更新config.txt详见[树莓派论坛的更多信息](https://forums.raspberrypi.com/viewtopic.php?t=363682&sid=cb59b026a412f0dc041595951273a9ca&start=25)
具体来说需要在config.txt中添加以下内容
```
dtoverlay=pciex1-compat-pi5,no-mip
dtoverlay=pcie-32bit-dma-pi5
```
## Coral Dual EdgeTPU只检测到一个PCIe Coral
Coral Dual EdgeTPU是一张带有两个相同TPU核心的卡。每个核心都有自己的PCIe接口主板需要在m.2插槽上有两个PCIe总线才能使它们都工作。
完全符合m.2机电规范的E-key插槽有两个PCIe总线。大多数主板制造商在m.2 E-key连接器中只实现一个PCIe总线这就是为什么只有一个TPU工作。一些SBC的m.2连接器上可能只有USB总线即两个TPU都无法工作。
在这种情况下建议使用Dual EdgeTPU适配器[比如MagicBlueSmoke的这款](https://github.com/magic-blue-smoke/Dual-Edge-TPU-Adapter)。

View File

@ -0,0 +1,112 @@
---
id: faqs
title: 常见问题解答
---
### Python致命错误: Bus error
此错误是由于共享内存(shm-size)设置过小导致的。请根据[此指南](../frigate/installation.md#calculating-required-shm-size)调整shm-size大小。
### 如何在录像中添加音频? {#audio-in-recordings}
默认情况下Frigate会移除录像中的音频以减少因无效数据导致失败的概率。如需保留音频需要设置支持音频的[FFmpeg预设](/configuration/ffmpeg_presets)
```yaml
ffmpeg:
output_args:
record: preset-record-generic-audio-aac
```
### 如何在实时监控中获取音频?
仅当配置了go2rtc时才支持实时监控音频详见[实时监控文档](../configuration/live.md)。
### 无法在Web界面查看录像
请确保摄像头发送的是h264编码视频或[进行转码](/configuration/restream.md)。
可在Chrome浏览器打开`chrome://media-internals/`页面尝试播放,该页面会显示播放失败的具体原因。
### 摄像头子码流质量不佳怎么办?
Frigate通常[推荐使用可配置子码流的摄像头](/frigate/hardware.md)。若子码流分辨率不合适,可对主码流进行缩放处理。
高效缩放需要满足以下条件:
1. 需配备GPU或集成显卡进行缩放处理
2. 需使用[硬件加速的ffmpeg预设](/configuration/hardware_acceleration.md)
3. 在配置中设置`detect -> width`和`detect -> height`为期望的检测分辨率
正确配置后GPU将负责解码和缩放CPU占用仅小幅增加但效果更佳。
### MJPEG流或快照显示异常绿色画面
这通常表示摄像头配置的分辨率(width/height)不正确。请使用VLC等播放器确认实际分辨率并检查宽高值是否颠倒。
![分辨率不匹配](/img/mismatched-resolution-min.jpg)
### 日志中出现"[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5639eeb6e140] moov atom not found"
某些情况下出现此日志信息是正常的。Frigate会在存储前检查录像文件完整性偶尔这些缓存文件会无效并自动清理。
### 日志中重复出现"On connect called"
若日志频繁出现"On connect called"信息请检查是否有多个Frigate实例。当多个容器使用相同`client_id`连接MQTT时会出现此情况。
### 错误Database Is Locked
SQLite在网络共享存储上运行不佳。若`/media`目录映射到网络共享,请按照[此指南](../configuration/advanced.md#database)将数据库移至内部存储。
### 无法发布到MQTT客户端未连接
在Docker中使用MQTT时请使用MQTT服务器的实际IP地址而非`localhost`、`127.0.0.1`或`mosquitto.ix-mosquitto.svc.cluster.local`。
因为Frigate容器不在host网络模式下运行localhost指向的是容器自身而非宿主机网络。
### 如何判断摄像头是否离线
可通过MQTT或/api/stats接口检测离线摄像头的camera_fps会显示为0。
此外当摄像头离线时Home Assistant会将其标记为不可用状态。
### 如何不通过Web界面查看Frigate日志
Frigate既会内部管理日志也会直接输出到Docker标准输出。通过CLI查看日志的步骤如下
1. 在运行Frigate容器的主机上打开终端
2. 执行以下命令:
```
docker logs -f frigate
```
注意:若容器名称不是"frigate",请替换为实际名称。"-f"参数表示实时跟踪日志更新,按`Ctrl+C`可退出。
更多日志查看选项可参考Docker[官方文档](https://docs.docker.com/engine/reference/commandline/logs/)。
另外,创建容器时可绑定主机目录到`/dev/shm/logs`,既持久化日志又便于使用日志分析工具:
```
docker run -d \
--name frigate \
--restart=unless-stopped \
--mount type=tmpfs,target=/tmp/cache,tmpfs-size=1000000000 \
--device /dev/bus/usb:/dev/bus/usb \
--device /dev/dri/renderD128 \
--shm-size=64m \
-v /path/to/your/storage:/media/frigate \
-v /path/to/your/config:/config \
-v /etc/localtime:/etc/localtime:ro \
-v /path/to/local/log/dir:/dev/shm/logs \
-e FRIGATE_RTSP_PASSWORD='password' \
-p 5000:5000 \
-p 8554:8554 \
-p 8555:8555/tcp \
-p 8555:8555/udp \
ghcr.io/blakeblackshear/frigate:stable
```
### RTSP流在VLC中正常播放但在Frigate配置中使用相同URL却失败这是bug吗
不是。Frigate使用TCP协议连接RTSP流而VLC会根据网络条件自动切换UDP/TCP协议。VLC能播放而Frigate失败很可能是因为VLC选择了UDP协议。
TCP能确保数据包有序到达这对视频录制、解码和流处理至关重要因此Frigate强制使用TCP连接。UDP速度更快但可靠性较低VLC的要求与Frigate不同。
如需使用UDP协议可通过ffmpeg输入参数或`preset-rtsp-udp`预设配置,详见[ffmpeg预设文档](/configuration/ffmpeg_presets)。

View File

@ -0,0 +1,82 @@
---
id: recordings
title: 录制故障排除
---
## 我已将Frigate配置为仅在有运动时录制但即使没有运动也似乎在录制。为什么
你需要:
- 确保摄像头的时间戳被运动遮罩覆盖。即使场景中没有运动,如果运动检测设置过于敏感,可能会将时间戳计为运动。
- 如果启用了音频检测,请记住任何高于`min_volume`的音频都会被视为运动。
- 通过编辑配置文件或使用UI中的运动调节器来[调整你的运动检测设置](/configuration/motion_detection)。
## 我看到警告信息WARNING : Unable to keep up with recording segments in cache for camera. Keeping the 5 most recent segments out of 6 and discarding the rest...无法跟上摄像头录制片段的缓存。保留6个中最新的5个片段丢弃其余部分...
这个错误可能由多个不同的问题引起。故障排除的第一步是为录制启用调试日志。这将启用显示录制从RAM缓存移动到磁盘所需时间的日志。
```yaml
logger:
logs:
frigate.record.maintainer: debug
```
这将包含如下日志:
```
DEBUG : Copied /media/frigate/recordings/{segment_path} in 0.2 seconds.
```
重要的是要让它运行直到错误开始发生,以确认在错误发生时磁盘是否存在速度减慢的情况。
#### 复制时间 > 1秒
如果存储速度太慢无法跟上录制,维护程序将落后并清除最旧的录制,以确保缓存不会填满导致崩溃。在这种情况下,重要的是要诊断复制时间慢的原因。
##### 检查RAM、交换空间、缓存利用率和磁盘利用率
如果CPU、RAM、磁盘吞吐量或总线I/O不足Frigate内部的任何设置都无法帮助。重要的是要检查每个可用系统资源的方面。
在Linux上一些有用的诊断工具/命令包括:
- docker stats
- htop
- iotop -o
- iostat -sxy --human 1 1
- vmstat 1
在现代Linux内核上如果启用了交换空间系统会使用一些交换空间。设置vm.swappiness=1不再意味着内核只会在避免OOM时才进行交换。要防止容器内的任何交换请将分配内存和内存+交换设置为相同值并通过设置以下docker/podman运行参数来禁用交换
**Docker Compose示例**
```yaml
services:
frigate:
...
mem_swappiness: 0
memswap_limit: <MAXSWAP>
deploy:
resources:
limits:
memory: <MAXRAM>
```
**运行命令示例**
```
--memory=<MAXRAM> --memory-swap=<MAXSWAP> --memory-swappiness=0
```
注意:这些是容器的硬限制,请确保在`docker stats`显示的容器使用量之上有足够的余量。如果达到`<MAXRAM>`它将立即停止。通常在可能的情况下将所有缓存和临时文件空间运行在RAM中比磁盘I/O更可取。
##### 检查存储类型
挂载网络共享是存储录制的流行选择,但这可能导致复制时间减慢并造成问题。一些用户发现使用`NFS`而不是`SMB`可以显著减少复制时间并解决问题。同时确保运行Frigate的设备与网络共享之间的网络连接稳定且快速也很重要。
##### 检查挂载选项
一些用户发现通过`fstab`使用`sync`选项挂载驱动器会导致性能大幅下降并引发此问题。使用`async`替代可以大大减少复制时间。
#### 复制时间 < 1秒
如果存储工作速度很快那么此错误可能是由于机器上的CPU负载太高Frigate没有足够的资源来跟上。尝试暂时关闭其他服务看看问题是否改善。

View File

@ -0,0 +1,18 @@
{
"link.title.Community": {
"message": "社区",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.item.label.GitHub": {
"message": "GitHub",
"description": "The label of footer link with label=GitHub linking to https://github.com/blakeblackshear/frigate"
},
"link.item.label.Discussions": {
"message": "论坛",
"description": "The label of footer link with label=Discussions linking to https://github.com/blakeblackshear/frigate/discussions"
},
"copyright": {
"message": "Copyright © 2025 Blake Blackshear",
"description": "The footer copyright"
}
}

View File

@ -0,0 +1,26 @@
{
"title": {
"message": "Frigate",
"description": "导航栏中的标题"
},
"logo.alt": {
"message": "Frigate",
"description": "导航栏logo的替代文本"
},
"item.label.Docs": {
"message": "文档",
"description": "导航栏中标记为Docs的菜单项"
},
"item.label.Website": {
"message": "官网",
"description": "导航栏中标记为Website的菜单项"
},
"item.label.Demo": {
"message": "演示Demo",
"description": "导航栏中标记为Demo的菜单项"
},
"item.label.GitHub": {
"message": "GitHub",
"description": "导航栏中标记为GitHub的菜单项"
}
}