From 3207f9e78325e5e86652e126c43def7a32ddc55e Mon Sep 17 00:00:00 2001 From: Simon Cheng Date: Sun, 4 Jan 2026 18:45:03 -0500 Subject: [PATCH 01/11] fix typo for inability to set channels for backchannel --- pkg/core/codec.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/core/codec.go b/pkg/core/codec.go index f38275e8..11276bc7 100644 --- a/pkg/core/codec.go +++ b/pkg/core/codec.go @@ -277,7 +277,7 @@ func ParseCodecString(s string) *Codec { codec.ClockRate = uint32(Atoi(ss[1])) } if len(ss) >= 3 { - codec.Channels = uint8(Atoi(ss[1])) + codec.Channels = uint8(Atoi(ss[2])) } return &codec From c6733bf4f184e356a8c6dc85fc16daa495b0568b Mon Sep 17 00:00:00 2001 From: oeiber <46045177+oeiber@users.noreply.github.com> Date: Wed, 7 Jan 2026 22:20:40 +0100 Subject: [PATCH 02/11] Update README with Doorbird support details Added information about Doorbird device support and user permissions. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 46fcaec8..902cb4f8 100644 --- a/README.md +++ b/README.md @@ -728,6 +728,9 @@ If you have a graphic PIN for your vacuum, add it as a numeric PIN (lines: 123, *[New in v1.9.11](https://github.com/AlexxIT/go2rtc/releases/tag/v1.9.11)* This source type supports Doorbird devices including MJPEG stream, audio stream as well as two-way audio. +It is recommended to create a sepearate user within your doorbird setup for go2rtc. Minimum permissions for the user are: +- Watch always +- API operator ```yaml streams: From 6d77b175d8b5a9bb2c0d6fe82799e67932b7c9b3 Mon Sep 17 00:00:00 2001 From: Alex X Date: Sat, 17 Jan 2026 13:47:21 +0300 Subject: [PATCH 03/11] Move all JS libs to cdn.jsdelivr.net --- www/links.html | 2 +- www/net.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/www/links.html b/www/links.html index 466d30a5..13e08edf 100644 --- a/www/links.html +++ b/www/links.html @@ -87,7 +87,7 @@ if (data.setup_code === undefined) return; const script = document.createElement('script'); - script.src = 'https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js'; + script.src = 'https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js'; script.async = true; script.onload = () => { /* global BigInt */ diff --git a/www/net.html b/www/net.html index 43db024e..1c2a697f 100644 --- a/www/net.html +++ b/www/net.html @@ -4,7 +4,7 @@ net - go2rtc - + - - -
- - - \ No newline at end of file From 1ec40f2fc33cfb4b71cbf1e6ea60580c3aa1e55d Mon Sep 17 00:00:00 2001 From: Alex X Date: Sat, 17 Jan 2026 13:57:05 +0300 Subject: [PATCH 05/11] Move schema.json to www/static --- www/config.html | 2 +- {website => www}/schema.json | 0 www/static.go | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) rename {website => www}/schema.json (100%) diff --git a/www/config.html b/www/config.html index fe84275c..026b5beb 100644 --- a/www/config.html +++ b/www/config.html @@ -1205,7 +1205,7 @@ (async () => { try { - const r = await fetch('https://go2rtc.org/schema.json', {cache: 'no-cache'}); + const r = await fetch('schema.json', {cache: 'no-cache'}); if (r.ok) setupYamlHints(await r.json()); } catch (e) { // ignore schema load errors diff --git a/website/schema.json b/www/schema.json similarity index 100% rename from website/schema.json rename to www/schema.json diff --git a/www/static.go b/www/static.go index 01f50906..064fec36 100644 --- a/www/static.go +++ b/www/static.go @@ -4,4 +4,5 @@ import "embed" //go:embed *.html //go:embed *.js +//go:embed *.json var Static embed.FS From ebe454e3be8d2e6efca31af7ff31fbd6218a94b5 Mon Sep 17 00:00:00 2001 From: Alex X Date: Sat, 17 Jan 2026 18:24:24 +0300 Subject: [PATCH 06/11] Fix relative links in readme --- README.md | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 03db381f..7edbaf5a 100644 --- a/README.md +++ b/README.md @@ -386,7 +386,7 @@ streams: rotate: ffmpeg:rtsp://12345678@192.168.1.123/av_stream/ch0#video=h264#rotate=90 ``` -All transcoding formats have [built-in templates](https://github.com/AlexxIT/go2rtc/blob/master/internal/ffmpeg/ffmpeg.go): `h264`, `h265`, `opus`, `pcmu`, `pcmu/16000`, `pcmu/48000`, `pcma`, `pcma/16000`, `pcma/48000`, `aac`, `aac/16000`. +All transcoding formats have [built-in templates](internal/ffmpeg/ffmpeg.go): `h264`, `h265`, `opus`, `pcmu`, `pcmu/16000`, `pcmu/48000`, `pcma`, `pcma/16000`, `pcma/48000`, `aac`, `aac/16000`. But you can override them via YAML config. You can also add your own formats to the config and use them with source params. @@ -488,7 +488,9 @@ streams: *[New in v1.8.2](https://github.com/AlexxIT/go2rtc/releases/tag/v1.8.2)* -Like `echo` source, but uses the built-in [expr](https://github.com/antonmedv/expr) expression language ([read more](https://github.com/AlexxIT/go2rtc/blob/master/internal/expr/README.md)). +Like `echo` source, but uses the built-in [expr](https://github.com/antonmedv/expr) expression language. + +*[read more](internal/expr/README.md)* #### Source: HomeKit @@ -616,19 +618,25 @@ Tested: KD110, KC200, KC401, KC420WS, EC71. *[New in v1.9.13](https://github.com/AlexxIT/go2rtc/releases/tag/v1.9.13)* -[Tuya](https://www.tuya.com/) proprietary camera protocol with **two way audio** support. Go2rtc supports `Tuya Smart API` and `Tuya Cloud API`. [Read more](https://github.com/AlexxIT/go2rtc/blob/master/internal/tuya/README.md). +[Tuya](https://www.tuya.com/) proprietary camera protocol with **two way audio** support. Go2rtc supports `Tuya Smart API` and `Tuya Cloud API`. + +*[read more](internal/tuya/README.md)* #### Source: Xiaomi *[New in v1.9.13](https://github.com/AlexxIT/go2rtc/releases/tag/v1.9.13)* -This source allows you to view cameras from the [Xiaomi Mi Home](https://home.mi.com/) ecosystem. [Read more](https://github.com/AlexxIT/go2rtc/blob/master/internal/xiaomi/README.md). +This source allows you to view cameras from the [Xiaomi Mi Home](https://home.mi.com/) ecosystem. + +*[read more](internal/xiaomi/README.md)* #### Source: GoPro *[New in v1.8.3](https://github.com/AlexxIT/go2rtc/releases/tag/v1.8.3)* -Support streaming from [GoPro](https://gopro.com/) cameras, connected via USB or Wi-Fi to Linux, Mac, Windows. [Read more](https://github.com/AlexxIT/go2rtc/tree/master/internal/gopro). +Support streaming from [GoPro](https://gopro.com/) cameras, connected via USB or Wi-Fi to Linux, Mac, Windows. + +*[read more](internal/gopro/README.md)* #### Source: Ivideon @@ -928,7 +936,7 @@ The HTTP API is the main part for interacting with the application. Default addr **Important!** go2rtc passes requests from localhost and from Unix sockets without HTTP authorisation, even if you have it configured! It is your responsibility to set up secure external access to the API. If not properly configured, an attacker can gain access to your cameras and even your server. -[API description](https://github.com/AlexxIT/go2rtc/tree/master/api). +[API description](api/README.md). **Module config** @@ -1140,7 +1148,9 @@ Link example: https://go2rtc.org/webtorrent/#share=02SNtgjKXY&pwd=wznEQqznxW&med ### Module: ngrok -With [ngrok](https://ngrok.com/) integration, you can get external access to your streams in situations when you have Internet with a private IP address ([read more](https://github.com/AlexxIT/go2rtc/blob/master/internal/ngrok/README.md)). +With [ngrok](https://ngrok.com/) integration, you can get external access to your streams in situations when you have Internet with a private IP address. + +*[read more](internal/ngrok/README.md)* ### Module: Hass @@ -1246,7 +1256,7 @@ API examples: - You can use `rotate` param with `90`, `180`, `270` or `-90` values - You can use `hardware`/`hw` param [read more](https://github.com/AlexxIT/go2rtc/wiki/Hardware-acceleration) -**PS.** This module also supports streaming to the server console (terminal) in the **animated ASCII art** format ([read more](https://github.com/AlexxIT/go2rtc/blob/master/internal/mjpeg/README.md)): +**PS.** This module also supports streaming to the server console (terminal) in the **animated ASCII art** format ([read more](internal/mjpeg/README.md)). [![](https://img.youtube.com/vi/sHj_3h_sX7M/mqdefault.jpg)](https://www.youtube.com/watch?v=sHj_3h_sX7M) From 6796bdabe2888b4f3fe52c8f964424f520a6b85c Mon Sep 17 00:00:00 2001 From: Alex X Date: Sat, 17 Jan 2026 18:30:06 +0300 Subject: [PATCH 07/11] Change header levels in readme --- README.md | 187 +++++++++++++++++++++++++++--------------------------- 1 file changed, 93 insertions(+), 94 deletions(-) diff --git a/README.md b/README.md index 7edbaf5a..ed66838b 100644 --- a/README.md +++ b/README.md @@ -64,37 +64,37 @@ Ultimate camera streaming application with support for RTSP, WebRTC, HomeKit, FF * [go2rtc: Dev version](#go2rtc-dev-version) * [Configuration](#configuration) * [Module: Streams](#module-streams) - * [Two way audio](#two-way-audio) - * [Source: RTSP](#source-rtsp) - * [Source: RTMP](#source-rtmp) - * [Source: HTTP](#source-http) - * [Source: ONVIF](#source-onvif) - * [Source: FFmpeg](#source-ffmpeg) - * [Source: FFmpeg Device](#source-ffmpeg-device) - * [Source: Exec](#source-exec) - * [Source: Echo](#source-echo) - * [Source: Expr](#source-expr) - * [Source: HomeKit](#source-homekit) - * [Source: Bubble](#source-bubble) - * [Source: DVRIP](#source-dvrip) - * [Source: Tapo](#source-tapo) - * [Source: Kasa](#source-kasa) - * [Source: Tuya](#source-tuya) - * [Source: Xiaomi](#source-xiaomi) - * [Source: GoPro](#source-gopro) - * [Source: Ivideon](#source-ivideon) - * [Source: Hass](#source-hass) - * [Source: ISAPI](#source-isapi) - * [Source: Nest](#source-nest) - * [Source: Ring](#source-ring) - * [Source: Roborock](#source-roborock) - * [Source: Doorbird](#source-doorbird) - * [Source: WebRTC](#source-webrtc) - * [Source: WebTorrent](#source-webtorrent) - * [Incoming sources](#incoming-sources) - * [Stream to camera](#stream-to-camera) - * [Publish stream](#publish-stream) - * [Preload stream](#preload-stream) + * [Two way audio](#two-way-audio) + * [Source: RTSP](#source-rtsp) + * [Source: RTMP](#source-rtmp) + * [Source: HTTP](#source-http) + * [Source: ONVIF](#source-onvif) + * [Source: FFmpeg](#source-ffmpeg) + * [Source: FFmpeg Device](#source-ffmpeg-device) + * [Source: Exec](#source-exec) + * [Source: Echo](#source-echo) + * [Source: Expr](#source-expr) + * [Source: HomeKit](#source-homekit) + * [Source: Bubble](#source-bubble) + * [Source: DVRIP](#source-dvrip) + * [Source: Tapo](#source-tapo) + * [Source: Kasa](#source-kasa) + * [Source: Tuya](#source-tuya) + * [Source: Xiaomi](#source-xiaomi) + * [Source: GoPro](#source-gopro) + * [Source: Ivideon](#source-ivideon) + * [Source: Hass](#source-hass) + * [Source: ISAPI](#source-isapi) + * [Source: Nest](#source-nest) + * [Source: Ring](#source-ring) + * [Source: Roborock](#source-roborock) + * [Source: Doorbird](#source-doorbird) + * [Source: WebRTC](#source-webrtc) + * [Source: WebTorrent](#source-webtorrent) + * [Incoming sources](#incoming-sources) + * [Stream to camera](#stream-to-camera) + * [Publish stream](#publish-stream) + * [Preload stream](#preload-stream) * [Module: API](#module-api) * [Module: RTSP](#module-rtsp) * [Module: RTMP](#module-rtmp) @@ -114,9 +114,8 @@ Ultimate camera streaming application with support for RTSP, WebRTC, HomeKit, FF * [Projects using go2rtc](#projects-using-go2rtc) * [Camera experience](#cameras-experience) * [TIPS](#tips) -* [FAQ](#faq) -## Fast start +# Fast start 1. Download [binary](#go2rtc-binary) or use [Docker](#go2rtc-docker) or Home Assistant [Add-on](#go2rtc-home-assistant-add-on) or [Integration](#go2rtc-home-assistant-integration) 2. Open web interface: `http://localhost:1984/` @@ -131,7 +130,7 @@ Ultimate camera streaming application with support for RTSP, WebRTC, HomeKit, FF - write your own [web interface](#module-api) - integrate [web api](#module-api) into your smart home platform -### go2rtc: Binary +## go2rtc: Binary Download binary for your OS from [latest release](https://github.com/AlexxIT/go2rtc/releases/): @@ -153,11 +152,11 @@ Don't forget to fix the rights `chmod +x go2rtc_xxx_xxx` on Linux and Mac. PS. The application is compiled with the latest versions of the Go language for maximum speed and security. Therefore, the [minimum OS versions](https://go.dev/wiki/MinimumRequirements) depend on the Go language. -### go2rtc: Docker +## go2rtc: Docker The Docker container [`alexxit/go2rtc`](https://hub.docker.com/r/alexxit/go2rtc) supports multiple architectures including `amd64`, `386`, `arm64`, and `arm`. This container offers the same functionality as the [Home Assistant Add-on](#go2rtc-home-assistant-add-on) but is designed to operate independently of Home Assistant. It comes preinstalled with [FFmpeg](#source-ffmpeg) and [Python](#source-echo). -### go2rtc: Home Assistant Add-on +## go2rtc: Home Assistant Add-on [![](https://my.home-assistant.io/badges/supervisor_addon.svg)](https://my.home-assistant.io/redirect/supervisor_addon/?addon=a889bffc_go2rtc&repository_url=https%3A%2F%2Fgithub.com%2FAlexxIT%2Fhassio-addons) @@ -166,11 +165,11 @@ The Docker container [`alexxit/go2rtc`](https://hub.docker.com/r/alexxit/go2rtc) - go2rtc > Install > Start 2. Setup [Integration](#module-hass) -### go2rtc: Home Assistant Integration +## go2rtc: Home Assistant Integration [WebRTC Camera](https://github.com/AlexxIT/WebRTC) custom component can be used on any [Home Assistant installation](https://www.home-assistant.io/installation/), including [HassWP](https://github.com/AlexxIT/HassWP) on Windows. It can automatically download and use the latest version of go2rtc. Or it can connect to an existing version of go2rtc. Addon installation in this case is optional. -### go2rtc: Dev version +## go2rtc: Dev version Latest, but maybe unstable version: @@ -178,7 +177,7 @@ Latest, but maybe unstable version: - Docker: `alexxit/go2rtc:master` or `alexxit/go2rtc:master-hardware` versions - Hass Add-on: `go2rtc master` or `go2rtc master hardware` versions -## Configuration +# Configuration - by default go2rtc will search `go2rtc.yaml` in the current work directory - `api` server will start on default **1984 port** (TCP) @@ -202,7 +201,7 @@ Available modules: - [hass](#module-hass) - Home Assistant integration - [log](#module-log) - logs config -### Module: Streams +## Module: Streams **go2rtc** supports different stream source types. You can config one or multiple links of any type as a stream source. @@ -237,7 +236,7 @@ Available source types: Read more about [incoming sources](#incoming-sources) -#### Two-way audio +## Two-way audio Supported sources: @@ -257,7 +256,7 @@ Two-way audio can be used in browser with [WebRTC](#module-webrtc) technology. T go2rtc also supports [play audio](#stream-to-camera) files and live streams on this cameras. -#### Source: RTSP +## Source: RTSP ```yaml streams: @@ -301,7 +300,7 @@ streams: dahua-rtsp-ws: rtsp://user:pass@192.168.1.123/cam/realmonitor?channel=1&subtype=1&proto=Private3#transport=ws://192.168.1.123/rtspoverwebsocket ``` -#### Source: RTMP +## Source: RTMP You can get a stream from an RTMP server, for example [Nginx with nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module). @@ -310,7 +309,7 @@ streams: rtmp_stream: rtmp://192.168.1.123/live/camera1 ``` -#### Source: HTTP +## Source: HTTP Support Content-Type: @@ -341,7 +340,7 @@ streams: **PS.** Dahua camera has a bug: if you select MJPEG codec for RTSP second stream, snapshot won't work. -#### Source: ONVIF +## Source: ONVIF *[New in v1.5.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.5.0)* @@ -356,7 +355,7 @@ streams: tapo1: onvif://admin:password@192.168.1.123:2020 ``` -#### Source: FFmpeg +## Source: FFmpeg You can get any stream, file or device via FFmpeg and push it to go2rtc. The app will automatically start FFmpeg with the proper arguments when someone starts watching the stream. @@ -417,7 +416,7 @@ Read more about [hardware acceleration](https://github.com/AlexxIT/go2rtc/wiki/H **PS.** It is recommended to check the available hardware in the WebUI add page. -#### Source: FFmpeg Device +## Source: FFmpeg Device You can get video from any USB camera or Webcam as RTSP or WebRTC stream. This is part of FFmpeg integration. @@ -438,7 +437,7 @@ streams: **PS.** It is recommended to check the available devices in the WebUI add page. -#### Source: Exec +## Source: Exec Exec source can run any external application and expect data from it. Two transports are supported - **pipe** (*from [v1.5.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.5.0)*) and **RTSP**. @@ -471,7 +470,7 @@ streams: play_pcm48k: exec:ffplay -fflags nobuffer -f s16be -ar 48000 -i -#backchannel=1 ``` -#### Source: Echo +## Source: Echo Some sources may have a dynamic link. And you will need to get it using a Bash or Python script. Your script should echo a link to the source. RTSP, FFmpeg or any of the [supported sources](#module-streams). @@ -484,7 +483,7 @@ streams: apple_hls: echo:python3 hls.py https://developer.apple.com/streaming/examples/basic-stream-osx-ios5.html ``` -#### Source: Expr +## Source: Expr *[New in v1.8.2](https://github.com/AlexxIT/go2rtc/releases/tag/v1.8.2)* @@ -492,7 +491,7 @@ Like `echo` source, but uses the built-in [expr](https://github.com/antonmedv/ex *[read more](internal/expr/README.md)* -#### Source: HomeKit +## Source: HomeKit **Important:** @@ -525,7 +524,7 @@ RTSP link with "normal" audio for any player: `rtsp://192.168.1.123:8554/aqara_g **This source is in active development!** Tested only with [Aqara Camera Hub G3](https://www.aqara.com/eu/product/camera-hub-g3) (both EU and CN versions). -#### Source: Bubble +## Source: Bubble *[New in v1.6.1](https://github.com/AlexxIT/go2rtc/releases/tag/v1.6.1)* @@ -539,7 +538,7 @@ streams: camera1: bubble://username:password@192.168.1.123:34567/bubble/live?ch=0&stream=0 ``` -#### Source: DVRIP +## Source: DVRIP *[New in v1.2.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.2.0)* @@ -559,7 +558,7 @@ streams: - dvrip://username:password@192.168.1.123:34567?backchannel=1 ``` -#### Source: EseeCloud +## Source: EseeCloud *[New in v1.9.10](https://github.com/AlexxIT/go2rtc/releases/tag/v1.9.10)* @@ -568,7 +567,7 @@ streams: camera1: eseecloud://user:pass@192.168.1.123:80/livestream/12 ``` -#### Source: Tapo +## Source: Tapo *[New in v1.2.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.2.0)* @@ -598,7 +597,7 @@ echo -n "cloud password" | md5 | awk '{print toupper($0)}' echo -n "cloud password" | shasum -a 256 | awk '{print toupper($0)}' ``` -#### Source: Kasa +## Source: Kasa *[New in v1.7.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.7.0)* @@ -614,7 +613,7 @@ streams: Tested: KD110, KC200, KC401, KC420WS, EC71. -#### Source: Tuya +## Source: Tuya *[New in v1.9.13](https://github.com/AlexxIT/go2rtc/releases/tag/v1.9.13)* @@ -622,7 +621,7 @@ Tested: KD110, KC200, KC401, KC420WS, EC71. *[read more](internal/tuya/README.md)* -#### Source: Xiaomi +## Source: Xiaomi *[New in v1.9.13](https://github.com/AlexxIT/go2rtc/releases/tag/v1.9.13)* @@ -630,7 +629,7 @@ This source allows you to view cameras from the [Xiaomi Mi Home](https://home.mi *[read more](internal/xiaomi/README.md)* -#### Source: GoPro +## Source: GoPro *[New in v1.8.3](https://github.com/AlexxIT/go2rtc/releases/tag/v1.8.3)* @@ -638,7 +637,7 @@ Support streaming from [GoPro](https://gopro.com/) cameras, connected via USB or *[read more](internal/gopro/README.md)* -#### Source: Ivideon +## Source: Ivideon Support public cameras from the service [Ivideon](https://tv.ivideon.com/). @@ -647,7 +646,7 @@ streams: quailcam: ivideon:100-tu5dkUPct39cTp9oNEN2B6/0 ``` -#### Source: Hass +## Source: Hass Support import camera links from [Home Assistant](https://www.home-assistant.io/) config files: @@ -683,7 +682,7 @@ streams: By default, the Home Assistant API does not allow you to get a dynamic RTSP link to a camera stream. So more cameras, like [Tuya](https://www.home-assistant.io/integrations/tuya/), and possibly others, can also be imported using [this method](https://github.com/felipecrs/hass-expose-camera-stream-source#importing-home-assistant-cameras-to-go2rtc-andor-frigate). -#### Source: ISAPI +## Source: ISAPI *[New in v1.3.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.3.0)* @@ -696,7 +695,7 @@ streams: - isapi://admin:password@192.168.1.123:80/ ``` -#### Source: Nest +## Source: Nest *[New in v1.6.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.6.0)* @@ -709,7 +708,7 @@ streams: nest-doorbell: nest:?client_id=***&client_secret=***&refresh_token=***&project_id=***&device_id=*** ``` -#### Source: Ring +## Source: Ring This source type support Ring cameras with [two way audio](#two-way-audio) support. If you have a `refresh_token` and `device_id` - you can use it in `go2rtc.yaml` config file. Otherwise, you can use the go2rtc interface and add your ring account (WebUI > Add > Ring). Once added, it will list all your Ring cameras. @@ -719,7 +718,7 @@ streams: ring_snapshot: ring:?device_id=XXX&refresh_token=XXX&snapshot ``` -#### Source: Roborock +## Source: Roborock *[New in v1.3.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.3.0)* @@ -733,7 +732,7 @@ Source supports loading Roborock credentials from Home Assistant [custom integra If you have a graphic PIN for your vacuum, add it as a numeric PIN (lines: 123, 456, 789) to the end of the `roborock` link. -#### Source: Doorbird +## Source: Doorbird *[New in v1.9.11](https://github.com/AlexxIT/go2rtc/releases/tag/v1.9.11)* @@ -748,7 +747,7 @@ streams: - doorbird://admin:password@192.168.1.123 # two-way audio ``` -#### Source: WebRTC +## Source: WebRTC *[New in v1.3.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.3.0)* @@ -790,7 +789,7 @@ streams: **PS.** For `kinesis` sources, you can use [echo](#source-echo) to get connection params using `bash`, `python` or any other script language. -#### Source: WebTorrent +## Source: WebTorrent *[New in v1.3.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.3.0)* @@ -801,7 +800,7 @@ streams: webtorrent1: webtorrent:?share=huofssuxaty00izc&pwd=k3l2j9djeg8v8r7e ``` -#### Incoming sources +## Incoming sources By default, go2rtc establishes a connection to the source when any client requests it. Go2rtc drops the connection to the source when it has no clients left. @@ -830,7 +829,7 @@ By default, go2rtc establishes a connection to the source when any client reques ffmpeg -re -i BigBuckBunny.mp4 -c copy -f mpegts http://localhost:1984/api/stream.ts?dst=camera1 ``` -#### Incoming: Browser +### Incoming: Browser *[New in v1.3.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.3.0)* @@ -842,7 +841,7 @@ You can turn the browser of any PC or mobile into an IP camera with support for 4. Select `camera+microphone` or `display+speaker` option 5. Open `webrtc` local page (your go2rtc **should work over HTTPS!**) or `share link` via [WebTorrent](#module-webtorrent) technology (work over HTTPS by default) -#### Incoming: WebRTC/WHIP +### Incoming: WebRTC/WHIP *[New in v1.3.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.3.0)* @@ -850,7 +849,7 @@ You can use **OBS Studio** or any other broadcast software with [WHIP](https://w - Settings > Stream > Service: WHIP > http://192.168.1.123:1984/api/webrtc?dst=camera1 -#### Stream to camera +## Stream to camera *[New in v1.3.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.3.0)* @@ -872,7 +871,7 @@ POST http://localhost:1984/api/streams?dst=camera1&src=ffmpeg:http://example.com - you can stop active playback by calling the API with the empty `src` parameter - you will see one active producer and one active consumer in go2rtc WebUI info page during streaming -### Publish stream +## Publish stream *[New in v1.8.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.8.0)* @@ -910,7 +909,7 @@ streams: - **Telegram Desktop App** > Any public or private channel or group (where you admin) > Live stream > Start with... > Start streaming. - **YouTube** > Create > Go live > Stream latency: Ultra low-latency > Copy: Stream URL + Stream key. -### Preload stream +## Preload stream You can preload any stream on go2rtc start. This is useful for cameras that take a long time to start up. @@ -930,7 +929,7 @@ streams: - ffmpeg:camera3#video=h264#audio=opus#hardware ``` -### Module: API +## Module: API The HTTP API is the main part for interacting with the application. Default address: `http://localhost:1984/`. @@ -972,7 +971,7 @@ api: - MJPEG over WebSocket plays better than native MJPEG because Chrome [bug](https://bugs.chromium.org/p/chromium/issues/detail?id=527446) - MP4 over WebSocket was created only for Apple iOS because it doesn't support MSE and native MP4 -### Module: RTSP +## Module: RTSP You can get any stream as RTSP-stream: `rtsp://192.168.1.123:8554/{stream_name}` @@ -995,7 +994,7 @@ By default go2rtc provide RTSP-stream with only one first video and only one fir Read more about [codecs filters](#codecs-filters). -### Module: RTMP +## Module: RTMP *[New in v1.8.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.8.0)* @@ -1008,7 +1007,7 @@ rtmp: listen: ":1935" # by default - disabled! ``` -### Module: WebRTC +## Module: WebRTC In most cases, [WebRTC](https://en.wikipedia.org/wiki/WebRTC) uses a direct peer-to-peer connection from your browser to go2rtc and sends media data via UDP. It **can't pass** media data through your Nginx or Cloudflare or [Nabu Casa](https://www.nabucasa.com/) HTTP TCP connection! @@ -1066,7 +1065,7 @@ webrtc: credential: your_pass ``` -### Module: HomeKit +## Module: HomeKit *[New in v1.7.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.7.0)* @@ -1120,7 +1119,7 @@ homekit: aqara1: # same stream ID from streams list ``` -### Module: WebTorrent +## Module: WebTorrent *[New in v1.3.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.3.0)* @@ -1146,13 +1145,13 @@ webtorrent: Link example: https://go2rtc.org/webtorrent/#share=02SNtgjKXY&pwd=wznEQqznxW&media=video+audio -### Module: ngrok +## Module: ngrok With [ngrok](https://ngrok.com/) integration, you can get external access to your streams in situations when you have Internet with a private IP address. *[read more](internal/ngrok/README.md)* -### Module: Hass +## Module: Hass The best and easiest way to use go2rtc inside Home Assistant is to install the custom integration [WebRTC Camera](#go2rtc-home-assistant-integration) and custom Lovelace card. @@ -1190,7 +1189,7 @@ streams: **PS.** There is also another nice card with go2rtc support - [Frigate Lovelace Card](https://github.com/dermotduffy/frigate-hass-card). -### Module: MP4 +## Module: MP4 Provides several features: @@ -1213,7 +1212,7 @@ Read more about [codecs filters](#codecs-filters). **PS.** Rotate and scale params don't use transcoding and change video using metadata. -### Module: HLS +## Module: HLS *[New in v1.1.0](https://github.com/AlexxIT/go2rtc/releases/tag/v1.1.0)* @@ -1228,7 +1227,7 @@ API examples: Read more about [codecs filters](#codecs-filters). -### Module: MJPEG +## Module: MJPEG **Important.** For stream in MJPEG format, your source MUST contain the MJPEG codec. If your stream has an MJPEG codec, you can receive **MJPEG stream** or **JPEG snapshots** via API. @@ -1260,7 +1259,7 @@ API examples: [![](https://img.youtube.com/vi/sHj_3h_sX7M/mqdefault.jpg)](https://www.youtube.com/watch?v=sHj_3h_sX7M) -### Module: Log +## Module: Log You can set different log levels for different modules. @@ -1274,7 +1273,7 @@ log: webrtc: fatal ``` -## Security +# Security > [!IMPORTANT] > If an attacker gains access to the API, you are in danger. Through the API, an attacker can use insecure sources such as echo and exec. And get full access to your server. @@ -1321,7 +1320,7 @@ If you need web interface protection without the Home Assistant add-on, you need PS. Additionally, WebRTC will try to use the 8555 UDP port to transmit encrypted media. It works without problems on the local network, and sometimes also works for external access, even if you haven't opened this port on your router ([read more](https://en.wikipedia.org/wiki/UDP_hole_punching)). But for stable external WebRTC access, you need to open the 8555 port on your router for both TCP and UDP. -## Codecs filters +# Codecs filters go2rtc can automatically detect which codecs your device supports for [WebRTC](#module-webrtc) and [MSE](#module-mp4) technologies. @@ -1344,7 +1343,7 @@ Some examples: - `http://192.168.1.123:1984/api/stream.mp4?src=camera1&mp4=flac` - MP4 file with PCMA/PCMU/PCM audio support, won't work on old devices (ex. iOS 12) - `http://192.168.1.123:1984/api/stream.mp4?src=camera1&mp4=all` - MP4 file with non-standard audio codecs, won't work on some players -## Codecs madness +# Codecs madness `AVC/H.264` video can be played almost anywhere. But `HEVC/H.265` has many limitations in supporting different devices and browsers. @@ -1385,7 +1384,7 @@ Some examples: - AAC = MPEG4-GENERIC - MP3 = MPEG-1 Audio Layer III or MPEG-2 Audio Layer III -## Built-in transcoding +# Built-in transcoding There are no plans to embed complex transcoding algorithms inside go2rtc. [FFmpeg source](#source-ffmpeg) does a great job with this. Including [hardware acceleration](https://github.com/AlexxIT/go2rtc/wiki/Hardware-acceleration) support. @@ -1414,7 +1413,7 @@ PCMU/xxx => PCMU/8000 => WebRTC - FLAC codec not supported in an RTSP stream. If you are using Frigate or Hass for recording MP4 files with PCMA/PCMU/PCM audio, you should set up transcoding to the AAC codec. - PCMA and PCMU are VERY low-quality codecs. They support only 256! different sounds. Use them only when you have no other options. -## Codecs negotiation +# Codecs negotiation For example, you want to watch RTSP-stream from [Dahua IPC-K42](https://www.dahuasecurity.com/fr/products/All-Products/Network-Cameras/Wireless-Series/Wi-Fi-Series/4MP/IPC-K42) camera in your Chrome browser. @@ -1443,7 +1442,7 @@ streams: **PS.** You can select `PCMU` or `PCMA` codec in camera settings and not use transcoding at all. Or you can select `AAC` codec for main stream and `PCMU` codec for second stream and add both RTSP to YAML config, this also will work fine. -## Projects using go2rtc +# Projects using go2rtc - [Home Assistant](https://www.home-assistant.io/) [2024.11+](https://www.home-assistant.io/integrations/go2rtc/) - top open-source smart home project - [Frigate](https://frigate.video/) [0.12+](https://docs.frigate.video/guides/configuring_go2rtc/) - open-source NVR built around real-time AI object detection @@ -1467,7 +1466,7 @@ streams: - [Synology NAS](https://synocommunity.com/package/go2rtc) - [Unraid](https://unraid.net/community/apps?q=go2rtc) -## Camera experience +# Camera experience - [Dahua](https://www.dahuasecurity.com/) - reference implementation streaming protocols, a lot of settings, high stream quality, multiple streaming clients - [EZVIZ](https://www.ezviz.com/) - awful RTSP protocol implementation, many bugs in SDP @@ -1477,7 +1476,7 @@ streams: - [TP-Link](https://www.tp-link.com/) - few streaming clients, packet loss? - Chinese cheap noname cameras, Wyze Cams, Xiaomi cameras with hacks (usually have `/live/ch00_1` in RTSP URL) - awful but usable RTSP protocol implementation, low stream quality, few settings, packet loss? -## TIPS +# TIPS **Using apps for low RTSP delay** From 338a3a6f036617b82e3a44e8b7e546a119c1cf9f Mon Sep 17 00:00:00 2001 From: Alex X Date: Sat, 17 Jan 2026 18:40:18 +0300 Subject: [PATCH 08/11] Move doorbird docs to separate file --- README.md | 16 ++-------------- internal/doorbird/README.md | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 14 deletions(-) create mode 100644 internal/doorbird/README.md diff --git a/README.md b/README.md index 902cb4f8..bdc0af74 100644 --- a/README.md +++ b/README.md @@ -725,21 +725,9 @@ If you have a graphic PIN for your vacuum, add it as a numeric PIN (lines: 123, #### Source: Doorbird -*[New in v1.9.11](https://github.com/AlexxIT/go2rtc/releases/tag/v1.9.11)* +This source type supports [Doorbird](https://www.doorbird.com/) devices including MJPEG stream, audio stream as well as two-way audio. -This source type supports Doorbird devices including MJPEG stream, audio stream as well as two-way audio. -It is recommended to create a sepearate user within your doorbird setup for go2rtc. Minimum permissions for the user are: -- Watch always -- API operator - -```yaml -streams: - doorbird1: - - rtsp://admin:password@192.168.1.123:8557/mpeg/720p/media.amp # RTSP stream - - doorbird://admin:password@192.168.1.123?media=video # MJPEG stream - - doorbird://admin:password@192.168.1.123?media=audio # audio stream - - doorbird://admin:password@192.168.1.123 # two-way audio -``` +*[read more](internal/doorbird/README.md)* #### Source: WebRTC diff --git a/internal/doorbird/README.md b/internal/doorbird/README.md new file mode 100644 index 00000000..7c31efae --- /dev/null +++ b/internal/doorbird/README.md @@ -0,0 +1,21 @@ +# Doorbird + +*[added in v1.9.8](https://github.com/AlexxIT/go2rtc/releases/tag/v1.9.11)* + +This source type supports [Doorbird](https://www.doorbird.com/) devices including MJPEG stream, audio stream as well as two-way audio. + +It is recommended to create a sepearate user within your doorbird setup for go2rtc. Minimum permissions for the user are: + +- Watch always +- API operator + +## Configuration + +```yaml +streams: + doorbird1: + - rtsp://admin:password@192.168.1.123:8557/mpeg/720p/media.amp # RTSP stream + - doorbird://admin:password@192.168.1.123?media=video # MJPEG stream + - doorbird://admin:password@192.168.1.123?media=audio # audio stream + - doorbird://admin:password@192.168.1.123 # two-way audio +``` From 9d1e4b11d7569aa38365cc81779888c3e59a473f Mon Sep 17 00:00:00 2001 From: Aram Akhavan Date: Sat, 17 Jan 2026 08:14:07 -0800 Subject: [PATCH 09/11] Add EXPOSE to Dockerfile (#2010) * Expose ports 1984 and 8554 in Dockerfile * Update Dockerfile * Update hardware.Dockerfile * Expose additional ports in Rockchip Dockerfile * Move docker expose ports to single line --------- Co-authored-by: Alex X --- docker/Dockerfile | 1 + docker/hardware.Dockerfile | 1 + docker/rockchip.Dockerfile | 1 + 3 files changed, 3 insertions(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index 8d064f21..9efded4b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -47,6 +47,7 @@ RUN if [ "${TARGETARCH}" = "amd64" ]; then apk add --no-cache libva-intel-driver COPY --from=build /build/go2rtc /usr/local/bin/ +EXPOSE 1984 8554 8555 8555/udp ENTRYPOINT ["/sbin/tini", "--"] VOLUME /config WORKDIR /config diff --git a/docker/hardware.Dockerfile b/docker/hardware.Dockerfile index a80d08d7..563843b5 100644 --- a/docker/hardware.Dockerfile +++ b/docker/hardware.Dockerfile @@ -49,6 +49,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked --mount=type=cache,t COPY --from=build /build/go2rtc /usr/local/bin/ +EXPOSE 1984 8554 8555 8555/udp ENTRYPOINT ["/usr/bin/tini", "--"] VOLUME /config WORKDIR /config diff --git a/docker/rockchip.Dockerfile b/docker/rockchip.Dockerfile index 949db83b..6ab924ee 100644 --- a/docker/rockchip.Dockerfile +++ b/docker/rockchip.Dockerfile @@ -43,6 +43,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked --mount=type=cache,t COPY --from=build /build/go2rtc /usr/local/bin/ ADD --chmod=755 https://github.com/MarcA711/Rockchip-FFmpeg-Builds/releases/download/6.1-8-no_extra_dump/ffmpeg /usr/local/bin +EXPOSE 1984 8554 8555 8555/udp ENTRYPOINT ["/usr/bin/tini", "--"] VOLUME /config WORKDIR /config From 572f07fcceb5e2844a43a4a424b0279770a5f828 Mon Sep 17 00:00:00 2001 From: forrestsocool Date: Sat, 17 Jan 2026 10:39:49 -0800 Subject: [PATCH 10/11] Add two-way talk support for tp-link ipc camera (#1995) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add tplink multitrans support * 已经能成功播放音频了 * 初步能通讯了 * finish * add tplink multitrans support * 已经能成功播放音频了 * 初步能通讯了 * cleanup * clean up * Code refactoring for #1995 --------- Co-authored-by: Your Name Co-authored-by: Alex X --- internal/multitrans/multitrans.go | 10 ++ main.go | 2 + pkg/multitrans/client.go | 203 ++++++++++++++++++++++++++++++ 3 files changed, 215 insertions(+) create mode 100644 internal/multitrans/multitrans.go create mode 100644 pkg/multitrans/client.go diff --git a/internal/multitrans/multitrans.go b/internal/multitrans/multitrans.go new file mode 100644 index 00000000..31e6a9a4 --- /dev/null +++ b/internal/multitrans/multitrans.go @@ -0,0 +1,10 @@ +package multitrans + +import ( + "github.com/AlexxIT/go2rtc/internal/streams" + "github.com/AlexxIT/go2rtc/pkg/multitrans" +) + +func Init() { + streams.HandleFunc("multitrans", multitrans.Dial) +} diff --git a/main.go b/main.go index df5322eb..02d11cd8 100644 --- a/main.go +++ b/main.go @@ -27,6 +27,7 @@ import ( "github.com/AlexxIT/go2rtc/internal/mjpeg" "github.com/AlexxIT/go2rtc/internal/mp4" "github.com/AlexxIT/go2rtc/internal/mpegts" + "github.com/AlexxIT/go2rtc/internal/multitrans" "github.com/AlexxIT/go2rtc/internal/nest" "github.com/AlexxIT/go2rtc/internal/ngrok" "github.com/AlexxIT/go2rtc/internal/onvif" @@ -95,6 +96,7 @@ func main() { {"isapi", isapi.Init}, {"ivideon", ivideon.Init}, {"mpegts", mpegts.Init}, + {"multitrans", multitrans.Init}, {"nest", nest.Init}, {"ring", ring.Init}, {"roborock", roborock.Init}, diff --git a/pkg/multitrans/client.go b/pkg/multitrans/client.go new file mode 100644 index 00000000..d71269c1 --- /dev/null +++ b/pkg/multitrans/client.go @@ -0,0 +1,203 @@ +package multitrans + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "net" + "net/http" + "net/url" + + "github.com/AlexxIT/go2rtc/pkg/core" + "github.com/AlexxIT/go2rtc/pkg/tcp" + "github.com/google/uuid" + "github.com/pion/rtp" +) + +type Client struct { + core.Connection + conn net.Conn + rd *bufio.Reader + closed core.Waiter +} + +func Dial(rawURL string) (core.Producer, error) { + u, err := url.Parse(rawURL) + if err != nil { + return nil, err + } + + if u.Port() == "" { + u.Host += ":554" + } + + conn, err := net.DialTimeout("tcp", u.Host, core.ConnDialTimeout) + if err != nil { + return nil, err + } + + c := &Client{ + conn: conn, + rd: bufio.NewReader(conn), + } + + if err = c.handshake(u); err != nil { + _ = conn.Close() + return nil, err + } + + c.Connection = core.Connection{ + ID: core.NewID(), + FormatName: "multitrans", + Protocol: "rtsp", + RemoteAddr: conn.RemoteAddr().String(), + Source: rawURL, + Medias: []*core.Media{ + { + Kind: core.KindAudio, + Direction: core.DirectionSendonly, + Codecs: []*core.Codec{{Name: core.CodecPCMA, ClockRate: 8000, PayloadType: 8}}, + }, + }, + Transport: conn, + } + + return c, nil +} + +func (c *Client) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiver) error { + sender := core.NewSender(media, track.Codec) + sender.Handler = func(packet *rtp.Packet) { + clone := rtp.Packet{ + Header: rtp.Header{ + Version: 2, + Marker: packet.Marker, + PayloadType: 8, + SequenceNumber: packet.SequenceNumber, + Timestamp: packet.Timestamp, + SSRC: packet.SSRC, + }, + Payload: packet.Payload, + } + + // Encapsulate in RTSP Interleaved Frame (Channel 1) + // $ + Channel(1 byte) + Length(2 bytes) + Packet + size := 12 + len(clone.Payload) + b := make([]byte, 4+size) + b[0] = '$' + b[1] = 1 // Channel 1 for audio + b[2] = byte(size >> 8) + b[3] = byte(size) + if _, err := clone.MarshalTo(b[4:]); err != nil { + return + } + if _, err := c.conn.Write(b); err != nil { + return + } + } + sender.HandleRTP(track) + c.Senders = append(c.Senders, sender) + return nil +} + +func (c *Client) handshake(u *url.URL) error { + // Step 1: Get Challenge + uid := uuid.New().String() + + uri := fmt.Sprintf("rtsp://%s/multitrans", u.Host) + data := fmt.Sprintf("MULTITRANS %s RTSP/1.0\r\nCSeq: 0\r\nX-Client-UUID: %s\r\n\r\n", uri, uid) + + if _, err := c.conn.Write([]byte(data)); err != nil { + return err + } + + res, err := tcp.ReadResponse(c.rd) + if err != nil { + return err + } + + if res.StatusCode != http.StatusUnauthorized { + return errors.New("multitrans: expected 401, got " + res.Status) + } + + auth := res.Header.Get("WWW-Authenticate") + realm := tcp.Between(auth, `realm="`, `"`) + nonce := tcp.Between(auth, `nonce="`, `"`) + + // Step 2: Send Auth + user := u.User.Username() + pass, _ := u.User.Password() + + ha1 := tcp.HexMD5(user, realm, pass) + ha2 := tcp.HexMD5("MULTITRANS", uri) + response := tcp.HexMD5(ha1, nonce, ha2) + + authHeader := fmt.Sprintf(`Digest username="%s", realm="%s", nonce="%s", uri="%s", response="%s"`, + user, realm, nonce, uri, response) + + data = fmt.Sprintf("MULTITRANS %s RTSP/1.0\r\nCSeq: 1\r\nAuthorization: %s\r\nX-Client-UUID: %s\r\n\r\n", + uri, authHeader, uid) + + if _, err = c.conn.Write([]byte(data)); err != nil { + return err + } + + res, err = tcp.ReadResponse(c.rd) + if err != nil { + return err + } + + if res.StatusCode != http.StatusOK { + return errors.New("multitrans: auth failed: " + res.Status) + } + + // Session: 7116520596809429228 + session := res.Header.Get("Session") + if session == "" { + return errors.New("multitrans: no session") + } + + return c.openTalkChannel(uri, session) +} + +func (c *Client) openTalkChannel(uri, session string) error { + payload := `{"type":"request","seq":0,"params":{"method":"get","talk":{"mode":"full_duplex"}}}` + + data := fmt.Sprintf("MULTITRANS %s RTSP/1.0\r\nCSeq: 2\r\nSession: %s\r\nContent-Type: application/json\r\nContent-Length: %d\r\n\r\n%s", + uri, session, len(payload), payload) + + if _, err := c.conn.Write([]byte(data)); err != nil { + return err + } + + res, err := tcp.ReadResponse(c.rd) + if err != nil { + return err + } + + if res.StatusCode != http.StatusOK { + return errors.New("multitrans: talkback failed: " + res.Status) + } + + // Python checks for "error_code":0 in body. + if !bytes.Contains(res.Body, []byte(`"error_code":0`)) { + return fmt.Errorf("multitrans: talkback error: %s", string(res.Body)) + } + + return nil +} + +func (c *Client) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, error) { + return nil, core.ErrCantGetTrack +} + +func (c *Client) Start() error { + _ = c.closed.Wait() + return nil +} + +func (c *Client) Stop() error { + c.closed.Done(nil) + return c.Connection.Stop() +} From 6a5deecfccde84070f2cf7acd569613c61fc2d60 Mon Sep 17 00:00:00 2001 From: Alex X Date: Sat, 17 Jan 2026 21:53:37 +0300 Subject: [PATCH 11/11] Add multitrans source to readme --- README.md | 11 +++++++++-- internal/multitrans/README.md | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 internal/multitrans/README.md diff --git a/README.md b/README.md index 5f2f266d..90109ddc 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Ultimate camera streaming application with support for RTSP, WebRTC, HomeKit, FF - devices: `alsa` (Linux audio), `v4l2` (Linux video) - files: `adts`, `flv`, `h264`, `hevc`, `hls`, `mjpeg`, `mpegts`, `mp4`, `wav` -- network (public and well known): `mpjpeg`, `onvif`, `rtmp`, `rtp`, `rtsp`, `webrtc`, `y2m` (yuv4mpegpipe) -- network (private and exclusive): `bubble`, `doorbird`, `dvrip`, `eseecloud`, `gopro`, `hass` (Home Assistant), `homekit` (Apple), `isapi` (Hikvision), `kasa` (TP-Link), `nest` (Google), `ring`, `roborock`, `tapo` and `vigi` (TP-Link), `tuya`, `webtorrent`, `xiaomi` (Mi Home) +- network (public and well known): `mpjpeg`, `onvif`, `rtmp`, `rtp`, `rtsp`, `webrtc`, `yuv4mpegpipe` +- network (private and exclusive): `bubble`, `doorbird`, `dvrip`, `eseecloud`, `gopro`, `hass` (Home Assistant), `homekit` (Apple), `isapi` (Hikvision), `kasa` (TP-Link), `multitrans` (TP-Link), `nest` (Google), `ring`, `roborock`, `tapo` and `vigi` (TP-Link), `tuya`, `webtorrent`, `xiaomi` (Mi Home) - webrtc related: `creality`, `kinesis` (Amazon), `openipc`, `switchbot`, `whep`, `whip`, `wyze` - other: `ascii`, `echo`, `exec`, `expr`, `ffmpeg` @@ -79,6 +79,7 @@ Ultimate camera streaming application with support for RTSP, WebRTC, HomeKit, FF * [Source: DVRIP](#source-dvrip) * [Source: Tapo](#source-tapo) * [Source: Kasa](#source-kasa) + * [Source: Multitrans](#source-multitrans) * [Source: Tuya](#source-tuya) * [Source: Xiaomi](#source-xiaomi) * [Source: GoPro](#source-gopro) @@ -613,6 +614,12 @@ streams: Tested: KD110, KC200, KC401, KC420WS, EC71. +## Source: Multitrans + +Two-way audio support for Chinese version of [TP-Link cameras](https://www.tp-link.com.cn/list_2549.html). + +*[read more](internal/multitrans/README.md)* + ## Source: Tuya *[New in v1.9.13](https://github.com/AlexxIT/go2rtc/releases/tag/v1.9.13)* diff --git a/internal/multitrans/README.md b/internal/multitrans/README.md new file mode 100644 index 00000000..6201f8b6 --- /dev/null +++ b/internal/multitrans/README.md @@ -0,0 +1,16 @@ +# Multitrans + +**added in v1.9.14** by [@forrestsocool](https://github.com/forrestsocool) + +Two-way audio support for Chinese version of [TP-Link cameras](https://www.tp-link.com.cn/list_2549.html). + +## Configuration + +```yaml +streams: + tplink_cam: + # video use standard RTSP + - rtsp://admin:admin@192.168.1.202:554/stream1 + # two-way audio use MULTITRANS schema + - multitrans://admin:admin@192.168.1.202:554 +```