scrypted-reolink-neolink-talkback
v0.0.2
Published
Reolink talkback mixin for Scrypted using Neolink
Maintainers
Readme
Reolink Neolink Talkback
This Scrypted plugin adds Reolink talkback to an existing camera as an
Intercom mixin. Import the camera with ONVIF first, then enable this extension
on that camera. The original camera plugin continues to provide video, snapshots,
motion, and HomeKit export.
Current Status
This repository captures the current working deployment baseline:
- tested on Scrypted with a Reolink
RLC-811A - camera imported through the Scrypted ONVIF plugin
- HomeKit talkback routed to this mixin
- audio decoded by Scrypted FFmpeg to a 16 kHz mono WAV stream
- WAV stream piped to
neolink talkthroughstdin - Neolink input source:
fdsrc fd=0 ! wavparse
The plugin code is intentionally small. It does not replace the camera plugin and does not implement the Reolink talkback protocol itself; it only bridges the Scrypted/HomeKit talkback audio into Neolink.
Compatibility
This plugin has been tested with a Reolink RLC-811A exposed to Scrypted
through the ONVIF plugin. Other Reolink models may work if Neolink supports their
talkback path, but they have not been verified for this plugin yet.
Talkback is delegated to a local neolink talk process. The plugin expects:
- a Neolink binary with GStreamer support
- a Neolink config file containing the target Reolink camera
- GStreamer support for
fdsrcandwavparse
Scrypted hands HomeKit talkback to this plugin as a temporary RTSP audio source. The plugin uses Scrypted FFmpeg to decode that stream to a 16 kHz mono WAV stream and pipes it into Neolink over stdin after Neolink reports that its talkback GStreamer pipeline is ready. Neolink reads stdin with this default GStreamer source:
fdsrc fd=0 ! wavparseThat keeps GStreamer away from HomeKit's temporary RTP/Opus RTSP details.
Leave Volume at 1.0 or below. The plugin caps Neolink volume above 1.0
because higher Neolink GStreamer volume values can produce unusable camera
talkback on some Reolink models. Use FFmpeg Gain for extra loudness instead;
it applies a gain stage while FFmpeg produces the WAV stream.
Installation Paths
There are three realistic installation paths, depending on how far the package has been published and how Scrypted is running.
Scrypted Plugin Installer
Once the package is published to npm, install it in Scrypted by package name:
scrypted-reolink-neolink-talkbackThis is the target end-user path. For inclusion in Scrypted's public/community plugin discovery, the usual next step is to publish the npm package and then ask for review in the Scrypted project/community channels or open the matching plugin index/catalog change if Koush prefers that route. Because this plugin depends on an external Neolink binary and system GStreamer libraries, it should be presented as an integration plugin with explicit runtime prerequisites rather than as a fully self-contained camera driver.
Local Development Deploy
For local development, clone this repository on a development machine and deploy the plugin to a running Scrypted server:
npm install
npm run tsc
npm run build
npm run scrypted-deploy <scrypted-ip>This deploys only the Scrypted plugin bundle. It does not install Neolink or GStreamer into the Scrypted runtime.
Manual Runtime Install
The plugin needs neolink and GStreamer in the same runtime that launches the
Scrypted plugin process. The right installation method depends on the Scrypted
deployment model.
Bare Metal
Install Neolink and the required GStreamer packages directly on the host that
runs Scrypted. Configure Neolink Executable as either neolink if it is on
PATH, or as the absolute binary path.
LXC Without Docker
Install Neolink and GStreamer inside the LXC container, not only on the Proxmox host. The plugin process can only execute binaries and read files visible inside that container.
Docker
Neolink, its config file, and the needed GStreamer runtime libraries must be available inside the Scrypted container. Installing Neolink only on the Docker host is not enough.
Durable options include:
- build a small custom Scrypted image that adds Neolink and GStreamer
- bind-mount a Neolink binary and config into the container, if all required shared libraries are also available there
- run a startup or maintenance step that installs the packages after container recreation
Proxmox LXC With Docker
Some Scrypted Proxmox LXC installs run Scrypted in Docker inside the LXC. In that model there are three layers to keep straight:
- Proxmox host
- LXC guest
- Scrypted Docker container
The plugin runs in the Scrypted Docker container, so that container must be able to execute Neolink and load GStreamer. Installing Neolink only on the Proxmox host or only in the LXC guest will not help unless it is also mounted or installed into the container.
The developer-provided Scrypted Proxmox LXC Docker script has been observed to
generate a /root/.scrypted/docker-compose.sh start script that intentionally
runs:
docker compose pull
docker compose up --force-recreateFor that setup, manual changes made inside the running Scrypted container can be lost on restart. Choose one maintenance model and document it locally:
- keep the upstream
--force-recreatebehavior and provide Neolink through a persistent image, mount, or reinstall step - remove
--force-recreatefrom the local start script if preserving manual container changes is preferred over fresh-container startup behavior
For example, change:
docker compose up --force-recreateto:
docker compose upThat second option changes local Scrypted startup behavior. Review the generated script before editing it and keep a note of the change for future Scrypted installer resets or repairs.
Install Neolink
Install a Neolink build with GStreamer talkback support in the same runtime that launches the Scrypted plugin. The maintained Neolink project is at https://github.com/QuantumEntangledAndy/neolink. The original project is at https://github.com/thirtythreeforty/neolink and points to the maintained fork.
Follow the Neolink install instructions for your CPU architecture and operating system, including the required GStreamer packages. This plugin does not download or bundle Neolink because Neolink and GStreamer are native runtime dependencies.
The most important rule is that Neolink must be installed where the Scrypted plugin process can execute it:
- bare metal Scrypted: install Neolink on the same host that runs Scrypted
- LXC Scrypted: install Neolink inside the LXC guest
- Docker Scrypted: install or mount Neolink inside the Scrypted container
- Proxmox LXC with Docker: install or mount Neolink inside the Scrypted Docker container, not only on the Proxmox host or LXC guest
From the same runtime, Neolink must be able to run:
neolink talk --helpFor Docker-based Scrypted installs, enter the Scrypted container first and run the check there. The container name varies by installation:
docker exec -it scrypted sh
which neolink
neolink talk --helpCreate a Neolink config.toml with the target Reolink camera. The exact config
format is owned by Neolink and may change, so prefer Neolink's sample config and
documentation. A minimal shape looks like this:
[[cameras]]
name = "FrontDoor"
username = "admin"
password = "your-camera-password"
address = "192.168.1.50:9000"For battery cameras or other Neolink-supported modes, follow the Neolink docs
for uid and network requirements instead of copying the address example
blindly.
Verify Neolink talkback outside Scrypted before debugging HomeKit. The camera
name at the end of the command must exactly match the name in config.toml.
A simple GStreamer test source is useful:
neolink talk --config /etc/neolink/config.toml --microphone \
--input-src "audiotestsrc wave=sine freq=880 num-buffers=120" FrontDoorWhen that works, use the same paths in the Scrypted plugin settings. Example values:
Neolink Executable:/usr/local/bin/neolinkNeolink Config:/etc/neolink/config.tomlNeolink Camera Name:FrontDoorNeolink Input Source:fdsrc fd=0 ! wavparse
If neolink is on PATH inside the Scrypted runtime, Neolink Executable can
also be just neolink. If Scrypted runs in Docker, all paths are container
paths, not host paths.
Configure Scrypted
- Add the camera to Scrypted with the ONVIF plugin.
- Keep ONVIF two way audio enabled if the ONVIF plugin needs it to advertise
Intercombefore extensions are applied. - Install this plugin and enable the
Reolink Neolink Talkbackextension on the ONVIF camera. - Fill in
Neolink Executable,Neolink Config, andNeolink Camera Name. Use paths as seen by the Scrypted runtime, for example/usr/local/bin/neolink,/etc/neolink/config.toml, andFrontDoor. - Keep
Neolink Input Sourceatfdsrc fd=0 ! wavparseunless a different stdin source is required in that runtime. - Keep
Volumeat1.0or below and useFFmpeg Gainfor controlled loudness tuning. - Export the same ONVIF camera to HomeKit and test the talk button.
After updating the plugin or changing mixin wiring, disabling and re-enabling the extension on the camera may be needed before the new intercom path is used.
This mixin does not change the ONVIF video path. It only replaces the intercom handler Scrypted/HomeKit calls when talkback starts.
Troubleshooting
Talkback Is Silent On The First Try
During testing with the RLC-811A, talkback was sometimes not audible on the
first HomeKit stream attempt even though reopening the camera stream and trying
again worked. Closing the HomeKit stream, opening it again, and pressing talk
again is the current workaround.
The observed Scrypted logs use the Rebroadcast/Prebuffer path for the HomeKit camera stream while this plugin receives a separate temporary HomeKit talkback audio input and feeds that audio into Neolink. That means Rebroadcast may be part of the timing around stream startup, but the logs collected so far do not prove that Rebroadcast is the talkback failure cause.
The plugin waits for Neolink to log its talkback GStreamer pipeline before it starts decoding the HomeKit talkback input. That avoids feeding HomeKit audio into Neolink while the camera talkback process is still connecting.
Check the plugin log for these steps before focusing on camera audio volume:
Starting Neolink talkback.Neolink talkback pipeline is ready. Starting FFmpeg input.Starting FFmpeg talkback decoder.- Neolink login succeeds and prints the GStreamer pipeline.
- FFmpeg emits WAV output progress instead of exiting immediately.
Credits
Thanks to the Neolink developers, especially George Hilliard and Andrew King, for the Neolink project and the Reolink Baichuan talkback work this plugin uses. This plugin does not implement the camera talkback protocol itself; it launches Neolink to do that work.
Thanks also to Koush and the Scrypted project for the plugin platform, ONVIF and HomeKit integrations, and the extension model that makes this kind of small bridge possible.
License And Warranty
This Scrypted plugin is licensed under the MIT License. See LICENSE.
Neolink is a separate project licensed under AGPL-3.0-or-later. This plugin
does not vendor a Neolink binary or Neolink source code. Users must obtain and
configure Neolink separately and must follow Neolink's license for Neolink
itself.
This plugin is provided without warranty. It is an unofficial integration and is not affiliated with Reolink, Scrypted, or Neolink.
