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.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 (/etc/shadow). 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 has read access to /etc/shadow via its membership in the shadow group, granted automatically at install time.
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.