Installing VideoNode
VideoNode is distributed as a Debian package for Linux arm64. This page covers installing it from the APT repository on an RK3588-based board running a Debian-compatible OS with V4L2 capture support.
Prerequisites:
- Linux, arm64 (aarch64). The packaged build targets Rockchip RK3588 boards (recommended: the FriendlyElec NanoPC-T6, 8GB / 64GB eMMC or higher). See supported hardware for the full matrix and the software-only paths.
- Debian 13 (trixie) or newer. The native binaries link trixie-era shared libraries (
libplacebo349,libabsl20240722, and thet64builds of gRPC and protobuf), soaptrefuses to install VideoNode on bookworm or older with abase-files (>= 13~)dependency error. Upgrade the board's OS to trixie first if it is still on bookworm. - A V4L2-capable capture device (e.g.
/dev/video0): USB or MIPI-CSI cameras, HDMI capture cards. Verify withv4l2-ctl --list-devices. curl,gpg, andaptavailable- A Linux account with
sudofor the install steps below
Install required runtime dependencies
ffmpeg with h264_rkmpp
The daemon shells out to ffmpeg from PATH. On a Rockchip board you need a build with h264_rkmpp and hevc_rkmpp enabled; stock Debian's ffmpeg does not include them. Use the ffmpeg that ships with your board's vendor OS image if it advertises Rockchip support, or install a community build like nyanmisaka/ffmpeg-rockchip. Confirm with:
ffmpeg -encoders 2>&1 | grep rkmppAfter install, run videonode validate-encoders to verify the probe finds the hardware encoder. See Encoders for the precedence rules and example output.
Rockchip userspace libraries (RGA + MPP)
The native binaries dynamically link librga and librockchip-mpp. VideoNode's CI builds against pinned releases from tsukumijima/mpp-rockchip and tsukumijima/librga-rockchip. Install matching .deb files from those release pages, or use the equivalents your vendor OS provides. The MPP kernel module must also be loaded (/proc/mpp_service/load must exist); vendor images for the NanoPC-T6 load it by default.
Enable device-tree overlays (GPU + HDMI input)
The composer GPU-composites onto a canvas using the Mali GPU, which is only usable when the kernel binds it through the panthor driver. panthor creates a DRM render node under /dev/dri/ (e.g. renderD130). If that node is missing, the composer cannot initialize and logs errors like:
egl_ctx: open(/dev/dri/renderD130): No such file or directory
pl_compose: both Vulkan and OpenGL backends failed
canvas_loop: pl_compose init 1920x1080 failedOn Armbian/RK3588 the GPU is enabled by a device-tree overlay. Capturing from the onboard HDMI-RX port needs a second overlay.
Edit /boot/armbianEnv.txt and add both overlays to the overlays= line:
# /boot/armbianEnv.txt
overlay_prefix=rockchip-rk3588
overlays=panthor-gpu rk3588-hdmirxpanthor-gpu: binds the Mali GPU to thepanthordriver (required for the composer). Withoverlay_prefix=rockchip-rk3588it resolves to/boot/dtb/rockchip/overlay/rockchip-rk3588-panthor-gpu.dtbo.rk3588-hdmirx: enables the HDMI-RX capture input (only needed if you capture from the onboard HDMI-in port).
The same overlays can be toggled from a menu with sudo armbian-config (System → Hardware). GPU compositing also benefits from a larger CMA pool; if the canvas fails to allocate, raise it on the kernel cmdline in the same file:
extraargs=cma=1GReboot to apply, then confirm a render node is bound to panthor:
sudo reboot
# after reboot:
for n in /sys/class/drm/renderD*; do
echo "$(basename "$n") -> $(basename "$(readlink -f "$n/device/driver")")"
doneYou should see a line ending in -> panthor alongside rockchip-drm and RKNPU. If no panthor node appears, re-check the overlays= line and that the board booted a trixie-based image.
Install from the APT repository
Follow these steps in order.
To trust the repository's signing key, download and install it:
bashcurl -fsSL https://mazurov.dev/videonode/public.key \ | gpg --dearmor \ | sudo tee /usr/share/keyrings/videonode-archive-keyring.gpg > /dev/nullTo add the repository to your APT sources, write the sources entry:
bashecho "deb [arch=arm64 signed-by=/usr/share/keyrings/videonode-archive-keyring.gpg] \ https://mazurov.dev/videonode stable main" \ | sudo tee /etc/apt/sources.list.d/videonode.listTo fetch the updated package index, run:
bashsudo apt updateTo install VideoNode, run:
bashsudo apt install videonode
The post-install script creates a videonode system user, writes default configuration to /etc/videonode/config.toml, enables videonode.service, and starts it immediately.
The package installs the Go daemon (/usr/bin/videonode), the three native pipeline binaries (videonode-source, videonode-sink, videonode-composer), the videonode-session login helper with its PAM stack (/etc/pam.d/videonode), the videonode.service systemd unit, and the default /etc/videonode/config.toml. It does not bundle the Rockchip hardware stack (ffmpeg with h264_rkmpp, RGA, MPP); install that separately as described under Install required runtime dependencies. The service logs a warning when those libraries are missing.
Web UI authentication
VideoNode authenticates web UI logins against the Linux user database via PAM. Two things must be true for a user to log in:
- The user has a regular Linux account on the box.
- The user is a member of the
videonodegroup.
If you ran apt install with sudo, the postinst script enrolls $SUDO_USER into the videonode group automatically. Log in to the UI with your usual username and password. Otherwise, add yourself manually:
sudo adduser "$USER" videonodeYou'll need to log out and back in (or run newgrp videonode) for the new group membership to take effect for new shells. The daemon itself never reads /etc/shadow: password checks run in videonode-session, a setuid-root helper installed with the package that performs the PAM conversation and returns a yes/no verdict.
To add another operator later, run the same adduser ... videonode command for their account.
Bypassing Linux auth (basic credentials)
If you'd rather skip the Linux account / group setup entirely (for example on a single-user box, or during initial bring-up), switch the daemon to basic auth. Edit /etc/videonode/config.toml:
[auth]
type = "basic"
username = "admin"
password = "change-me"Then sudo systemctl restart videonode. Log in with the username and password from the file. Change the defaults before exposing the daemon to a network: basic auth ships passwords in cleartext over HTTP unless you terminate TLS upstream.
For the full list of [auth] and other settings, see config.toml reference.
Verify the service is running
To confirm the service started, check its status:
systemctl status videonode.serviceTo follow live logs:
journalctl -u videonode.service -fThe API is available at http://localhost:8090 once the service is up. See the quickstart for first steps after installation.