终极摄像头流媒体应用,支持多种格式和协议。
- 零依赖的[小应用](#go2rtc-binary),适用于所有操作系统(Windows、macOS、Linux、FreeBSD)
- 许多[支持的协议](#codecs-madness)实现零延迟(尽可能低的流媒体延迟)
- 从多种格式和协议[输入流](#streaming-input)
- 以所有流行格式[输出流](#streaming-output)
- 支持多种流行格式的[流媒体接入](#streaming-ingest)
- 将任何源[发布](#publish-stream)到流行的流媒体服务(YouTube、Telegram)
- 仅在必要时通过 [FFmpeg](internal/ffmpeg/README.md) 进行实时转码
- 为多种格式提供[双向音频](#two-way-audio)支持
- 向所有支持[双向音频](#two-way-audio)的摄像头[传输音频流](#stream-to-camera)
- 将来自不同来源的音视频轨道混合为单个流
- [自动匹配](www/README.md#javascript-api)客户端支持的流媒体格式和编解码器
- 提供所有活动连接的[流媒体统计](#streaming-stats)
- 可[集成到任何项目](#projects-using-go2rtc)中,或作为[独立应用](#go2rtc-binary)使用
#### 灵感来源
- 来自 [@deepch](https://github.com/deepch) 的一系列流媒体项目
- [webrtc](https://github.com/pion/webrtc) Go 语言库以及整个 [@pion](https://github.com/pion) 团队
- 来自 [@aler9](https://github.com/aler9) 的 [rtsp-simple-server](https://github.com/aler9/rtsp-simple-server) 创意
- [GStreamer](https://gstreamer.freedesktop.org/) 框架的 pipeline 创意
- [MediaSoup](https://mediasoup.org/) 框架的路由创意
- 来自 [@brutella](https://github.com/brutella/hap) 的 HomeKit Accessory Protocol
- 项目 Logo 的创作者 [@v_novoseltsev](https://www.instagram.com/v_novoseltsev)
目录
- [安装](#installation)
- [go2rtc:二进制文件](#go2rtc-binary)
- [go2rtc:Docker](#go2rtc-docker)
- [go2rtc:Home Assistant 插件](#go2rtc-home-assistant-add-on)
- [go2rtc:Home Assistant 集成](#go2rtc-home-assistant-integration)
- [go2rtc:Master 版本](#go2rtc-master-version)
- [配置](#configuration)
- [功能](#features)
- [输入流](#streaming-input)
- [输出流](#streaming-output)
- [流媒体接入](#streaming-ingest)
- [双向音频](#two-way-audio)
- [推流到摄像头](#stream-to-camera)
- [发布流](#publish-stream)
- [预加载流](#preload-stream)
- [流媒体统计](#streaming-stats)
- [编解码器](#codecs)
- [编解码器过滤器](#codecs-filters)
- [编解码器乱象](#codecs-madness)
- [内置转码](#built-in-transcoding)
- [编解码器协商](#codecs-negotiation)
- [安全性](#security)
- [使用 go2rtc 的项目](#projects-using-go2rtc)
- [摄像头使用体验](#camera-experience)
- [技巧](#tips)
## 安装说明
1. 下载[二进制文件](#go2rtc-binary)或使用 [Docker](#go2rtc-docker) 或 Home Assistant [插件](#go2rtc-home-assistant-add-on)或[集成](#go2rtc-home-assistant-integration)
2. 打开 Web 界面:`http://localhost:1984/`
3. 将[流](#streaming-input)添加到[配置](#configuration)中
**开发者:** 将 [HTTP API](internal/api/README.md) 集成到您的智能家居平台中。
### go2rtc:二进制文件
从[最新发布版本](https://github.com/AlexxIT/go2rtc/releases/)下载适合您操作系统的二进制文件:
| 名称 | 描述 |
|-----------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|
| [go2rtc_win64.zip](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_win64.zip) | Windows 10+ 64 位 |
| [go2rtc_win32.zip](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_win32.zip) | Windows 10+ 32 位 |
| [go2rtc_win_arm64.zip](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_win_arm64.zip) | Windows ARM 64 位 |
| [go2rtc_linux_amd64](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64) | Linux 64 位 |
| [go2rtc_linux_i386](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_i386) | Linux 32 位 |
| [go2rtc_linux_arm64](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_arm64) | Linux ARM 64 位(例如:树莓派 64 位系统) |
| [go2rtc_linux_arm](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_arm) | Linux ARM 32 位(例如:树莓派 32 位系统) |
| [go2rtc_linux_armv6](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_armv6) | Linux ARMv6(适用于旧版树莓派 1 和 Zero) |
| [go2rtc_linux_mipsel](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_mipsel) | Linux MIPS(例如:[小米网关 3](https://github.com/AlexxIT/XiaomiGateway3)、[Wyze 摄像头](https://github.com/gtxaspec/wz_mini_hacks)) |
| [go2rtc_mac_amd64.zip](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_mac_amd64.zip) | macOS 11+ Intel 64 位 |
| [go2rtc_mac_arm64.zip](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_mac_arm64.zip) | macOS ARM 64 位 |
| [go2rtc_freebsd_amd64.zip](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_freebsd_amd64.zip) | FreeBSD 64 位 |
| [go2rtc_freebsd_arm64.zip](https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_freebsd_arm64.zip) | FreeBSD ARM 64 位 |
在 Linux 和 Mac 上,不要忘记修复权限 `chmod +x go2rtc_xxx_xxx`。
附注。该应用程序使用最新版本的 Go 语言编译,以实现最高的速度和安全性。因此,[最低操作系统版本](https://go.dev/wiki/MinimumRequirements)取决于 Go 语言。
### go2rtc:Docker
Docker 容器 [`alexxit/go2rtc`](https://hub.docker.com/r/alexxit/go2rtc) 和 [`ghcr.io/alexxit/go2rtc`](https://github.com/AlexxIT/go2rtc/pkgs/container/go2rtc) 支持多种架构,包括 `386`、`amd64`、`arm/v6`、`arm/v7` 和 `arm64`。
这些容器提供与 Home Assistant [插件](#go2rtc-home-assistant-add-on)相同的功能,但旨在独立于 Home Assistant 运行。
它预装了 [FFmpeg](internal/ffmpeg/README.md) 和 [Python](internal/echo/README.md)。
### go2rtc:Home Assistant 插件
[](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2FAlexxIT%2Fhassio-addons)
1. 设置 > 插件 > 加号 > 仓库 > 添加
https://github.com/AlexxIT/hassio-addons
2. go2rtc > 安装 > 启动
### go2rtc:Home Assistant 集成
[WebRTC Camera](https://github.com/AlexxIT/WebRTC) 自定义组件可在任何 Home Assistant [安装](https://www.home-assistant.io/installation/)版本上使用,包括 Windows 上的 [HassWP](https://github.com/AlexxIT/HassWP)。它可以自动下载并使用最新版本的 go2rtc。或者它也可以连接到现有的 go2rtc 版本。在这种情况下,插件安装是可选的。
### go2rtc:Master 版本
最新但可能不稳定的版本:
- 二进制文件:[最新 master 构建](https://nightly.link/AlexxIT/go2rtc/workflows/build/master)
- Docker:`alexxit/go2rtc:master` 或 `alexxit/go2rtc:master-hardware` 版本
- Home Assistant 插件:`go2rtc master` 或 `go2rtc master hardware` 版本
## 配置
这是 [YAML 格式](https://en.wikipedia.org/wiki/YAML)的 `go2rtc.yaml` 文件。
可以在 `http://localhost:1984` 的 [WebUI](www/README.md) 中更改配置。
编辑器提供语法高亮和检查功能。

最简单的配置如下所示:
```
streams:
hall-camera: rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0
```
- 默认情况下,go2rtc 会在当前工作目录中搜索 `go2rtc.yaml`
- `api` 服务器将启动于默认的 **1984 端口** (TCP)
- `rtsp` 服务器将启动于默认的 **8554 端口** (TCP)
- `webrtc` 将使用 **8555 端口** (TCP/UDP) 进行连接
更多信息可以[在此处找到](internal/app/README.md)。
## 功能
有关所有模块和功能的汇总表,请参见[此处](internal/README.md)。
**核心模块**
- [`app`](internal/app/README.md) - 读取[配置](internal/app/README.md)和设置[日志](internal/app/README.md#log)。
- [`api`](internal/api/README.md) - 处理 [HTTP](internal/api/README.md) 和 [WebSocket](internal/api/ws/README.md) API。
- [`streams`](internal/streams/README.md) - 处理流列表。
### 输入流
#### 公开协议
- [`mpjpeg`](internal/mjpeg/README.md#mjpeg-client) - 传统但仍被使用的 [MJPEG](https://en.wikipedia.org/wiki/Motion_JPEG) 协议,用于实时媒体传输。
- [`onvif`](internal/onvif/README.md#onvif-client) - 流行的 [ONVIF](https://en.wikipedia.org/wiki/ONVIF) 协议,用于接收 RTSP 格式的媒体。
- [`rtmp`](internal/rtmp/README.md#rtmp-client) - 传统但仍被使用的 [RTMP](https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol) 协议,用于实时媒体传输。
- [`rtsp`](internal/rtsp/README.md#rtsp-client) - 最常见的 [RTSP](https://en.wikipedia.org/wiki/Real-Time_Streaming_Protocol) 协议,用于实时媒体传输。
- [`webrtc`](internal/webrtc/README.md#webrtc-client) - 兼容 Web 的 [WebRTC](https://en.wikipedia.org/wiki/WebRTC) 协议,用于实时媒体传输。
- [`yuv4mpegpipe`](internal/http/README.md#tcp) - 带有 [YUV4MPEG](https://manned.org/yuv4mpeg) 头的原始 [YUV](https://en.wikipedia.org/wiki/Y%E2%80%B2UV) 帧流。
#### 私有协议
- [`bubble`](internal/bubble/README.md) - 来自 [dvr163.com](http://help.dvr163.com/) 和 [eseecloud.com](http://www.eseecloud.com/) 的部分 NVR。
- [`doorbird`](internal/doorbird/README.md) - 带有双向音频的 [Doorbird](https://www.doorbird.com/) 设备。
- [`dvrip`](internal/dvrip/README.md) - DVR-IP NVR、NetSurveillance、Sofia 协议(XMeye SDK)。
- [`eseecloud`](internal/eseecloud/README.md) - 来自 [dvr163.com](http://help.dvr163.com/) 和 [eseecloud.com](http://www.eseecloud.com/) 的部分 NVR。
- [`gopro`](internal/gopro/README.md) - 通过 USB 或 Wi-Fi 连接的 [GoPro](https://gopro.com/) 摄像头。
- [`hass`](internal/hass/README.md) - 从 [Home Assistant](https://www.home-assistant.io/) 配置文件中导入摄像头。
- [`homekit`](internal/homekit/README.md) - 支持 [Apple HomeKit](https://www.apple.com/home-app/accessories/) 协议的摄像头。
- [`isapi`](internal/isapi/README.md) - [Hikvision ISAPI](https://tpp.hikvision.com/download/ISAPI_OTAP) 协议的双向音频。
- [`kasa`](internal/kasa/README.md) - [TP-Link Kasa](https://www.kasasmart.com/) 摄像头。
- [`multitrans`](internal/multitrans/README.md) - 国行版 [TP-Link](https://www.tp-link.com.cn/) 摄像头的双向音频。
- [`nest`](internal/nest/README.md) - 通过对用户不友好且收费的 API 连接的 [Google Nest](https://developers.google.com/nest/device-access/supported-devices) 摄像头。
- [`ring`](internal/ring/README.md) - 支持双向音频的 Ring 摄像头。
- [`roborock`](internal/roborock/README.md) - 带有支持双向音频摄像头的 [Roborock](https://roborock.com/) 扫地机器人。
- [`tapo`](internal/tapo/README.md) - 支持双向音频的 [TP-Link Tapo](https://www.tapo.com/) 摄像头。
- [`vigi`](internal/tapo/README.md#tp-link-vigi) - TP-Linkigi 摄像头。
- [`tuya`](internal/tuya/README.md) - 支持双向音频的 [Tuya](https://www.tuya.com/) 生态摄像头。
- [`webtorrent`](internal/webtorrent/README.md) - 通过 [WebTorrent](https://en.wikipedia.org/wiki/WebTorrent) 协议从另一个 go2rtc 接收流。
- [`wyze`](internal/wyze/README.md) - 使用原生 P2P 协议的 [Wyze](https://wyze.com/) 摄像头
- [`xiaomi`](internal/xiaomi/README.md) - 支持双向音频的 [Xiaomi Mi Home](https://home.mi.com/) 生态摄像头。
#### 设备
- [`alsa`](internal/alsa/README.md) - 一个用于在 Linux 操作系统上从设备接收音频的[框架](https://en.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture)。
- [`v4l2`](internal/v4l2/README.md) - 一个用于在 Linux 操作系统上从设备接收视频的[框架](https://en.wikipedia.org/wiki/Video4Linux)。
#### 文件
- [`adts`](internal/http/README.md#tcp) - 带有 Audio Data Transport Stream 头的 [AAC](https://en.wikipedia.org/wiki/Advanced_Audio_Coding) 编解码器音频流。
- [`flv`](internal/http/README.md#tcp) - 传统但仍被使用的 [Flash Video](https://en.wikipedia.org/wiki/Flash_Video) 格式。
- [`h264`](internal/http/README.md#tcp) - AVC/H.264 比特流。
- [`hevc`](internal/http/README.md#tcp) - HEVC/H.265 比特流。
- [`hls`](internal/http/README.md) - 流行的 [HTTP Live Streaming](https://en.wikipedia.org/wiki/HTTP_Live_Streaming) 格式。
- [`mjpeg`](internal/http/README.md#tcp) - 连续的 JPEG 帧序列(不带 HTTP 头)。
- [`mpegts`](internal/http/README.md#tcp) - 传统的 [MPEG transport stream](https://en.wikipedia.org/wiki/MPEG_transport_stream) 格式。
- [`wav`](internal/http/README.md#tcp) - [Waveform Audio File](https://en.wikipedia.org/wiki/WAV) 格式的音频流。
#### 脚本
- [`echo`](internal/echo/README.md) - 如果源具有动态链接,您可以使用 bash 或 python 脚本获取它。
- [`exec`](internal/exec/README.md) - 您可以运行外部应用程序(`ffmpeg`、`gstreamer`、`rpicam` 等)并从中接收媒体流。
- [`expr`](internal/expr/README.md) - 如果源具有动态链接,您可以使用 [Expr](https://github.com/expr-lang/expr) 语言获取它。
- [`ffmpeg`](internal/ffmpeg/README.md) - 使用 [FFmpeg](https://ffmpeg.org/) 作为流源。支持硬件加速转码和从 USB 设备输入流。
#### WebRTC
- [`creality`](internal/webrtc/README.md#creality) - [Creality](https://www.creality.com/) 3D 打印机摄像头。
- [`kinesis`](internal/webrtc/README.md#kinesis) - [Amazon Kinesis](https://aws.amazon.com/kinesis/video-streams/) 视频流。
- [`openipc`](internal/webrtc/README.md#openipc) - 运行开源 [OpenIPC](https://openipc.org/) 固件的摄像头。
- [`switchbot`](internal/webrtc/README.md#switchbot) - [SwitchBot](https://us.switch-bot.com/) 摄像头。
- [`whep`](internal/webrtc/README.md#whep) - [WebRTC/WHEP](https://datatracker.ietf.org/doc/draft-murillo-whep/) 已被 WebRTC 视频/音频观看者的 [WebRTC/WISH](https://datatracker.ietf.org/doc/charter-ietf-wish/02/) 标准取代。
- [`wyze`](internal/webrtc/README.md#wyze) - 通过 [docker-wyze-bridge](https://github.com/mrlt8/docker-wyze-bridge) 连接到 [Wyze](https://www.wyze.com/) 摄像头的传统方法。
### 输出流
- [`adts`](internal/mpeg/README.md) - 带有 [AAC](https://en.wikipedia.org/wiki/Advanced_Audio_Coding) 音频的 ADTS 格式输出流。
- [`ascii`](internal/mjpeg/README.md#ascii) - 仅为了娱乐,将流作为 [ASCII 输出到终端](https://www.youtube.com/watch?v=sHj_3h_sX7M)。
- [`flv`](internal/rtmp/README.md) - [Flash Video](https://en.wikipedia.org/wiki/Flash_Video) 格式的输出流。
- [`hls`](internal/hls/README.md) - [HTTP Live Streaming](https://en.wikipedia.org/wiki/HTTP_Live_Streaming) 格式的输出流。
- [`homekit`](internal/homekit/README.md#homekit-server) - 使用 [HomeKit](https://en.wikipedia.org/wiki/Apple_Home) 协议输出到 [Apple Home](https://www.apple.com/home-app/) 的流。
- [`jpeg`](internal/mjpeg/README.md#jpeg) - [JPEG](https://en.wikipedia.org/wiki/JPEG) 格式的输出快照。
- [`mpjpeg`](internal/mjpeg/README.md#mpjpeg) - [MJPEG](https://en.wikipedia.org/wiki/Motion_JPEG) 格式的输出流。
- [`mp4`](internal/mp4/README.md) - 输出为 [MP4 流](https://en.wikipedia.org/wiki/Progressive_download)或 [Media Source Extensions](https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API) (MSE) 兼容格式。
- [`mpegts`](internal/mpeg/README.md) - [MPEG transport stream](https://en.wikipedia.org/wiki/MPEG_transport_stream) 格式的输出流。
- [`onvif`](internal/onvif/README.md#onvif-server) - 使用 [ONVIF](https://en.wikipedia.org/wiki/ONVIF) 协议的输出流。
- [`rtmp`](internal/rtmp/README.md#rtmp-server) - 使用 [Real-Time Messaging](https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol) 协议的输出流。
- [`rtsp`](internal/rtsp/README.md#rtsp-server) - 使用 [Real-Time Streaming](https://en.wikipedia.org/wiki/Real-Time_Streaming_Protocol) 协议的输出流。
- [`webrtc`](internal/webrtc/README.md#webrtc-server) - 使用 [Web Real-Time Communication](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) API 的输出流。
- [`webtorrent`](internal/webtorrent/README.md#webtorrent-server) - 使用 [WebTorrent](https://en.wikipedia.org/wiki/WebTorrent) 协议的输出流。
- [`yuv4mpegpipe`](internal/mjpeg/README.md#yuv4mpegpipe) - 带有 [YUV4MPEG](https://manned.org/yuv4mpeg) 头的原始 [YUV](https://en.wikipedia.org/wiki/Y%E2%80%B2UV) 帧流输出。
### 流媒体接入
支持以下格式:
[`flv`](internal/rtmp/README.md#flv-server),
[`mjpeg`](internal/mjpeg/README.md#streaming-ingest),
[`mpegts`](internal/mpeg/README.md#streaming-ingest),
[`rtmp`](internal/rtmp/README.md#rtmp-server),
[`rtsp`](internal/rtsp/README.md#streaming-ingest),
[`webrtc`](internal/webrtc/README.md#streaming-ingest)。
这是 go2rtc 期望从外部应用程序接收传入流的功能。流的传输由外部应用程序启动和停止。
- 您只能将数据推送到现有的流中(在配置中创建一个源为空的流)。
- 您可以将多个传入源推送到同一个流。
- 您可以将数据推送到非空流中,这样它内部就会有额外的编解码器。
### 双向音频
支持以下协议:
[`doorbird`](internal/doorbird/README.md),
[`dvrip`](internal/dvrip/README.md),
[`exec`](internal/exec/README.md),
[`isapi`](internal/isapi/README.md),
[`multitrans`](internal/multitrans/README.md),
[`ring`](internal/ring/README.md),
[`roborock`](internal/roborock/README.md),
[`rtsp`](internal/rtsp/README.md#two-way-audio),
[`tapo`](internal/tapo/README.md),
[`tuya`](internal/tuya/README.md),
[`webrtc`](internal/webrtc/README.md),
[`wyze`](internal/wyze/README.md),
[`xiaomi`](internal/xiaomi/README.md)。
双向音频可以通过浏览器的 [WebRTC](internal/webrtc/README.md) 技术使用。浏览器仅允许 HTTPS 网站访问麦克风([阅读详情](https://stackoverflow.com/questions/52759992/how-to-access-camera-and-microphone-in-chrome-without-https))。
### 推流到摄像头
您可以在任何支持[双向音频](#two-way-audio)的摄像头上播放音频文件或直播流。
[阅读详情](internal/streams/README.md#stream-to-camera)
### 发布流
您可以通过 RTMP/RTMPS 将任何流发布到流媒体服务(YouTube、Telegram 等)。
[阅读详情](internal/streams/README.md#publish-stream)
### 预加载流
您可以在 go2rtc 启动时预加载任何流。这对于启动时间较长的摄像头非常有用。
[阅读详情](internal/streams/README.md#preload-stream)
### 流媒体统计
[WebUI](www/README.md) 提供有关所有活动连接的详细信息,包括 IP 地址、格式、协议、传输的数据包和字节数。
通过 [HTTP API](internal/api/README.md) 以 [`json`](https://en.wikipedia.org/wiki/JSON) 或 [`dot`](https://en.wikipedia.org/wiki/DOT_(graph_description_language) 格式提供交互式连接映射图。

## 编解码器
如果您对为什么视频或音频无法显示有疑问,需要阅读以下章节。
| 名称 | FFmpeg | RTSP | 别名 |
|------------------------------|----------|---------------|-------------|
| Advanced Audio Coding | `aac` | MPEG4-GENERIC | |
| Advanced Video Coding | `h264` | H264 | AVC, H.264 |
| G.711 PCM (A-law) | `alaw` | PCMA | G711A |
| G.711 PCM (µ-law) | `mulaw` | PCMU | G711u |
| High Efficiency Video Coding | `hevc` | H265 | HEVC, H.265 |
| Motion JPEG | `mpjpeg` | JPEG | |
| MPEG-1 Audio Layer III | `mp3` | MPA | |
| Opus Codec | `opus` | OPUS | |
| PCM signed 16-bit big-endian | `s16be` | L16 | |
### 编解码器过滤器
go2rtc 可以自动检测您的设备在 [WebRTC](internal/webrtc/README.md) 和 [MSE](internal/mp4/README.md) 技术中支持哪些编解码器。
但对于 [RTSP](internal/rtsp/README.md)、[HTTP 渐进式流](internal/mp4/README.md)、[HLS](internal/hls/README.md) 技术则无法做到。
您可以在创建流的链接时手动添加编解码器过滤器。
过滤器对于这三种技术的工作方式相同。
过滤器不会创建新的编解码器,它们只从现有源中选择合适的编解码器。
您可以使用 [FFmpeg 转码](internal/ffmpeg/README.md)将新的编解码器添加到流中。
不加过滤器时:
- RTSP 将仅提供第一个视频和第一个音频(任何编解码器)
- MP4 将仅包含兼容的编解码器(H264、H265、AAC)
- HLS 将以传统的 TS 格式输出(H264,无音频)
一些示例:
- `rtsp://192.168.1.123:8554/camera1?mp4` - 适用于录制为 MP4 文件(例如 Home Assistant 或 Frigate)
- `rtsp://192.168.1.123:8554/camera1?video=h264,h265&audio=aac` - 上述过滤器的完整版本
- `rtsp://192.168.1.123:8554/camera1?video=h264&audio=aac&audio=opus` - H264 视频编解码器和两个独立的音频轨道
- `rtsp://192.168.1.123:8554/camera1?video&audio=all` - 任何视频编解码器和所有音频编解码器作为独立轨道
- `http://192.168.1.123:1984/api/stream.m3u8?src=camera1&mp4` - 带有 MP4 兼容编解码器的 HLS 流 (HLS/fMP4)
- `http://192.168.1.123:1984/api/stream.m3u8?src=camera1&mp4=flac` - 支持 PCMA/PCMU/PCM 音频的 HLS 流 (HLS/fMP4),在旧设备上无法使用
- `http://192.168.1.123:1984/api/stream.mp4?src=camera1&mp4=flac` - 支持 PCMA/PCMU/PCM 音频的 MP4 文件,在旧设备上无法使用(例如 iOS 12)
- `http://192.168.1.123:1984/api/stream.mp4?src=camera1&mp4=all` - 带有非标准音频编解码器的 MP4 文件,在某些播放器上无法使用
### 编解码器乱象
`AVC/H.264` 视频几乎可以在任何地方播放。但 `HEVC/H.265` 在支持不同设备和浏览器方面存在诸多限制。
| 设备 | WebRTC | MSE | HTTP* | HLS |
|--------------------------------------------------------------------|-----------------------------------------|-----------------------------------------|----------------------------------------------|-----------------------------|
| *延迟* | 最好 | 中等 | 差 | 差 |
| 桌面端 Chrome 136+
桌面端 Edge
Android Chrome 136+ | H264, H265*
PCMU, PCMA
OPUS | H264, H265*
AAC, FLAC*
OPUS | H264, H26*
AAC, FLAC*
OPUS, MP3 | 否 |
| 桌面端 Firefox | H264
PCMU, PCMA
OPUS | H264
AAC, FLAC*
OPUS | H264
AAC, FLAC*
OPUS | 否 |
| 桌面端 Safari 14+
iPad Safari 14+
iPhone Safari 17.1+ | H264, H265*
PCMU, PCMA
OPUS | H264, H265
AAC, FLAC* | **否!** | H264, H265
AAC, FLAC* |
| iPhone Safari 14+ | H264, H265*
PCMU, PCMA
OPUS | **否!** | **否!** | H264, H265
AAC, FLAC* |
| macOS [Hass App][1] | 否 | 否 | 否 | H264, H265
AAC, FLAC* |
- `HTTP*` - HTTP 渐进式流,与[渐进式下载](https://en.wikipedia.org/wiki/Progressive_download)无关,因为文件没有大小和终点
- `WebRTC H265` - 在 [Chrome 136+](https://developer.chrome.com/release-notes/136) 中受支持,在 [Safari 18+](https://developer.apple.com/documentation/safari-release-notes/safari-18-release-notes) 中受支持
- `MSE iPhone` - 在 [iOS 17.1+](https://webkit.org/blog/14735/webkit-features-in-safari-17-1/) 中受支持
**音频**
- go2rtc 支持将 `PCMA/PCMU/PCM` 编解码器[自动重新打包](#built-in-transcoding)为 `FLAC` 以用于 MSE/MP4/HLS,从而几乎可以在任何地方使用
- **WebRTC** 音频编解码器:`PCMU/8000`、`PCMA/8000`、`OPUS/48000/2`
- **MP4** 内部的 `OPUS` 和 `MP3` 是标准的一部分,但某些播放器仍然不支持它们(尤其是 Apple)
**Apple 设备**
- 所有 Apple 设备都不支持 HTTP 渐进式流
- 旧版 iPhone 固件不支持 MSE 技术,因为它与 Apple 发明的 HTTP Live Streaming (HLS) 技术竞争
- HLS 是**直播**流中最糟糕的技术,它仍然存在仅仅是因为 iPhone
### 内置转码
目前没有计划在 go2rtc 内部嵌入复杂的转码算法。
[FFmpeg 源](internal/ffmpeg/README.md) 在这方面做得非常好。
包括对[硬件加速](https://github.com/AlexxIT/go2rtc/wiki/Hardware-acceleration)的支持。
但 go2rtc 有一些简单的算法。它们会自动开启;您无需额外设置。
**用于 MSE/MP4/HLS 的 PCM**
Go2rtc 可以将 `PCMA`、`PCMU` 和 `PCM` 编解码器打包到 MP4 container 中,以便它们在所有浏览器和现代设备的所有内置播放器中工作。包括 Apple QuickTime:
```
PCMA/PCMU => PCM => FLAC => MSE/MP4/HLS
```
**为 WebRTC 重采样 PCMA/PCMU**
默认情况下,WebRTC 仅支持 `PCMA/8000` 和 `PCMU/8000`。但是 go2rtc 可以自动重采样具有不同采样率的 PCMA 和 PCMU 编解码器。此外,go2rtc 可以将 `PCM` 编解码器转码为 `PCMA/8000`,以便 WebRTC 能够播放它:
```
PCM/xxx => PCMA/8000 => WebRTC
PCMA/xxx => PCMA/8000 => WebRTC
PCMU/xxx => PCMU/8000 => WebRTC
```
**重要提示**
- FLAC 编解码器在 RTSP 流中不受支持。如果您使用 Frigate 或 Home Assistant 录制带有 PCMA/PCMU/PCM 音频的 MP4 文件,则应设置转码为 AAC 编解码器。
- PCMA 和 PCMU 是非常低质量的编解码器。它们仅支持 256!种不同的声音。仅当您没有其他选择时才使用它们。
### 编解码器协商
例如,您想在 Chrome 浏览器中观看来自 [Dahua IPC-K42](https://www.dahuasecurity.com/fr/products/All-Products/Network-Cameras/Wireless-Series/Wi-Fi-Series/4MP/IPC-K42) 摄像头的 RTSP 流。
- 此摄像头支持双向音频标准 **ONVIF Profile T**
- 此摄像头支持 **H264, H265** 编解码器发送视频,并且您在摄像头设置中选择 `H264`
- 此摄像头支持 **AAC, PCMU, PCMA** 编解码器发送音频(来自麦克风),并且您在摄像头设置中选择 `AAC/16000`
- 此摄像头支持 **AAC, PCMU, PCMA** 编解码器接收音频(发送到扬声器),您不需要选择它们
- 您的浏览器支持 **H264, VP8, VP9, AV1** 编解码器接收视频,您不需要选择它们
- 您的浏览器支持 **OPUS, PCMU, PCMA** 编解码器发送和接收音频,您不需要选择它们
- 您无法直接获取摄像头的音频,因为其音频编解码器与您浏览器的编解码器不匹配
- 因此您决定通过 FFmpeg 使用转码,并将此设置添加到配置 YAML 文件中
- 您选择了 `OPUS/48000/2` 编解码器,因为它的质量高于 `PCMU/8000` 或 `PCMA/8000`
现在您有一个包含两个源的流 - **RTSP 和 FFmpeg**:
```
streams:
dahua:
- rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
- ffmpeg:rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0#audio=opus
```
**go2rtc** 会自动在您的所有流源中为您的浏览器匹配编解码器。这被称为**多源双向编解码器协商**,它是此应用程序的主要功能之一。
**附注。** 您可以在摄像头设置中选择 `PCMU` 或 `PCMA` 编解码器,完全不需要使用转码。或者您可以在主码流选择 `AAC` 编解码器,在子码流选择 `PCMU` 编解码器,并将两者同时添加到 YAML 配置中,这也能正常工作。
## 安全性
为了获得最高(偏执级别)的安全性,go2rtc 具有特殊设置:
```
app:
# use only allowed modules
modules: [api, rtsp, webrtc, exec, ffmpeg, mjpeg]
api:
# use only allowed API paths
allow_paths: [/api, /api/streams, /api/webrtc, /api/frame.jpeg]
# enable auth for localhost (used together with username and password)
local_auth: true
exec:
# use only allowed exec paths
allow_paths: [ffmpeg]
```
默认情况下,`go2rtc` 在端口 `1984` 上启动 Web 界面,在端口 `8554` 上启动 RTSP,并使用端口 `8555` 进行 WebRTC 连接。这三个端口可以从您的本地网络访问。因此,本地网络上的任何人都可以在未经授权的情况下观看您摄像头的视频。Home Assistant 插件也适用同样的规则。
如果您像我一样完全信任您的本地网络,这不是问题。但是您可以通过 `go2rtc.yaml` 配置文件更改此行为:
```
api:
listen: "127.0.0.1:1984" # localhost
rtsp:
listen: "127.0.0.1:8554" # localhost
webrtc:
listen: ":8555" # external TCP/UDP port
```
- [FFmpeg](internal/ffmpeg/README.md) 集成对 RTSP 的本地访问不是问题,因为它在您的服务器上本地运行
- 对 API 的本地访问对于 [Home Assistant 插件](#go2rtc-home-assistant-add-on)来说不是问题,因为 Home Assistant 在同一台服务器上本地运行,并且插件的 Web UI 受到 Home Assistant 授权的保护([Ingress 功能](https://www.home-assistant.io/blog/2019/04/15/hassio-ingress/))
- 对 WebRTC TCP 端口的外部访问不是问题,因为它仅用于传输加密的媒体数据
- 无论如何,您都需要向本地网络和 Internet 开放此端口,WebRTC 才能工作
如果您在没有 Home Assistant 插件的情况下需要 Web 界面保护,您需要使用反向代理,例如 [Nginx](https://nginx.org/)、[Caddy](https://caddyserver.com/) 等。
附注。此外,WebRTC 将尝试使用 8555 UDP 端口来传输加密媒体。它在本地网络上可以正常工作,有时即使您没有在路由器上开放此端口,外部访问也能正常工作([阅读详情](https://en.wikipedia.org/wiki/UDP_hole_punching))。但是为了获得稳定的外部 WebRTC 访问,您需要在路由器上同时为 TCP 和 UDP 开放 8555 端口。
## 使用 go2rtc 的项目
- [Home Assistant](https://www.home-assistant.io/) [2024.11+](https://www.home-assistant.io/integrations/go2rtc/) - 顶级的开源智能家居项目
- [Frigate](https://frigate.video/) [0.12+](https://docs.frigate.video/guides/configuring_go2rtc/) - 围绕实时 AI 物体检测构建的开源 NVR
- [Advanced Camera Card](https://github.com/dermotduffy/advanced-camera-card) - Home Assistant 的自定义卡片
- [OpenIPC](https://github.com/OpenIPC/firmware/tree/master/general/package/go2rtc) - 来自开放社区的替代 IP 摄像头固件
- [wz_mini_hacks](https://github.com/gtxaspec/wz_mini_hacks) - Wyze 摄像头的自定义固件
- [EufyP2PStream](https://github.com/oischinger/eufyp2pstream) - 一个小项目,提供来自不直接支持 RTSP 的 Eufy 摄像头的视频/音频流
- [ioBroker.euSec](https://github.com/bropat/ioBroker.eusec) - 用于控制 Eufy 安全设备的 [ioBroker](https://www.iobroker.net/) 适配器
- [MMM-go2rtc](https://github.com/Anonym-tsk/MMM-go2rtc) - MagicMirror² 模块
- [ring-mqtt](https://github.com/tsightler/ring-mqtt) - Ring 到 MQTT 的桥接
- [lightNVR](https://github.com/opensensor/lightNVR)
**发行版**
- [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=go2rtc)
- [Arch User Repository](https://linux-packages.com/aur/package/go2rtc)
- [Gentoo](https://github.com/inode64/inode64-overlay/tree/main/media-video/go2rtc)
- [NixOS](https://search.nixos.org/packages?query=go2rtc)
- [Proxmox Helper Scripts](https://github.com/community-scripts/ProxmoxVE/)
- [QNAP](https://www.myqnap.org/product/go2rtc/)
- [Synology NAS](https://synocommunity.com/package/go2rtc)
- [Unraid](https://unraid.net/community/apps?q=go2rtc)
## 摄像头使用体验
- [Dahua](https://www.dahuasecurity.com/) - 标杆级的流媒体协议实现,设置丰富,流质量高,支持多流客户端
- [EZVIZ](https://www.ezviz.com/) - 糟糕的 RTSP 协议实现,SDP 中存在许多 bug
- [Hikvision](https://www.hikvision.com/) - 大量的专有流媒体技术
- [Reolink](https://reolink.com/) - 部分型号的 RTSP 实现极其糟糕且无法使用,RTMP 替代方案也不是最佳(我建议您联系 Reolink 支持获取新固件),设置较少
- [Sonoff](https://sonoff.tech/) - 流质量非常低,没有设置,协议实现不是最佳
- [TP-Link](https://www.tp-link.com/) - 流媒体客户端少,丢包?
- 廉价的无品牌摄像头、Wyze Cam、经过破解的小米摄像头(通常在 RTSP URL 中包含 `/live/ch00_1`)- 糟糕但勉强可用的 RTSP 协议实现,流质量低,设置少,丢包?
## 技巧
**使用应用降低 RTSP 延迟**
- `ffplay -fflags nobuffer -flags low_delay "rtsp://192.168.1.123:8554/camera1"`
- VLC > 首选项 > 输入 / 编解码器 > 默认缓存级别:最低延迟
**发送快照到 Telegram**
[阅读详情](https://github.com/AlexxIT/go2rtc/wiki/Snapshot-to-Telegram)