DOVE - Online Video Editor
Project description
DOVE — Online Video Editor
|
|
DOVE is an API driven Video/Audio Editor for live mixing with an intuitive web based Interface.
Developed by and for DORFTV. Inspired by bbc/brave. |
Concept
Inputs → Scenes → Program → Outputs
Inputs — media sources: local files, network streams, web pages, yt-dlp URLs, cameras, test patterns.
Scenes — compositor layouts combining multiple inputs. Each scene has slots with per-slot position, size, z-order, alpha, and volume controls.
Program — the currently live scene, sent to all active outputs simultaneously. Cut or crossfade between scenes.
Outputs — streaming destinations (SRT, RTMP, HLS, WebRTC, Decklink, etc.). Multiple outputs can share an encoder; dedicated encoders per output are also possible.
Features
Inputs
| Type | Description |
|---|---|
uridecodebin3 |
Local files and streams (HTTP, SRT, RTMP, RTSP) |
playlist |
Sequence of video clips and HTML pages |
wpesrc |
Web page rendered as video (HTML/CSS/JS overlays) |
ytdlp |
YouTube, Twitch, and hundreds of other sites via yt-dlp |
nodecg |
NodeCG broadcast graphics |
v4l2src |
Webcams and capture cards (V4L2) |
imagesrc |
Still images (PNG, JPEG, WebP, SVG) |
testsrc |
SMPTE color bars and test patterns |
whip |
Browser screen share or webcam via WebRTC (experimental) |
Outputs
| Type | Description |
|---|---|
srtsink |
SRT push to a remote listener |
srtserversink |
SRT server mode (remotes connect to DOVE) |
rtmpsink |
RTMP push |
rtspclientsink |
RTSP push |
hlssink2 |
HLS segments (also used for previews) |
splitmuxsink |
Segmented file recording |
decklink |
SDI/HDMI via Blackmagic Design card |
shout2send |
Icecast/Shoutcast audio stream |
Encoders
Hardware-accelerated encoding via VAAPI (AMD/Intel) or Vulkan. Software fallback via x264/x265. Set video_encoder.name = "auto" to pick the best available encoder at startup. Multiple outputs can share a single encoder, or each output can have its own dedicated encoder.
| Encoder | Type |
|---|---|
x264 |
Software (always available) |
openh264 |
Software alternative |
vah264enc / vaapih264enc |
VAAPI (AMD/Intel) |
vulkanh264enc |
Vulkan (Mesa 26+, GStreamer 1.28+) |
mpph264enc |
Rockchip hardware |
Audio & Video Filters
Per-input dynamic filter chains, applied at runtime without pipeline restart.
Audio: highpass, lowpass, 3-band/10-band EQ, compressor (LSP), expander (LSP), gate (LSP), limiter, amplify, pan, invert, echo, denoise, loudnorm. See docs/audio-filters.md.
Video: color balance, flip/mirror, crop, color effects, blur, chroma key. Experimental (requires frei0r-plugins): pixelate, cartoon, glow, vignette, film grain, glitch, scanlines, sobel edge, color halftone. See docs/video-filters.md.
Previews
- WebRTC — sub-second latency preview in the browser.
- HLS — works in restricted networks, through any reverse proxy over HTTPS.
Keyboard Shortcuts
Full keyboard control for live production: scene selection (1–9), cut/crossfade (Enter), transition toggle (T), and more. Press ? in the UI for the full list. See docs/keyboard-shortcuts.md.
Quick Start
Want a ready-to-run setup with example inputs and scenes? See dove-demo for a pre-configured docker-compose stack you can spin up in one command.
To install DOVE from scratch:
Docker Compose
git clone https://github.com/dorftv/dove.git && cd dove
cp config-example.toml config.toml
Software rendering (no GPU):
docker compose up
AMD GPU (VAAPI + Vulkan):
docker compose -f docker-compose.yml -f docker-compose.amd.yml up
Intel GPU (VAAPI + Vulkan):
docker compose -f docker-compose.yml -f docker-compose.intel.yml up
Configuration
Copy config-example.toml to config.toml and edit as needed. See docs/config.md for all options.
[main]
default_resolution = "HD720" # QHD, FullHD, HD720, nHD, …
default_framerate = "30/1"
volume = 0.7
[preview.scenes]
type = ["webrtcbin", "hlssink2"]
video_encoder.name = "auto"
Authentication
Optional OIDC authentication (Keycloak, Authentik, Authelia, etc.). Disabled by default — enable with:
[auth]
enabled = true
issuer = "https://auth.example.com/realms/dove"
client_id = "dove-app"
client_secret = "your-secret"
Four roles: User, Supervisor, Outputs, Admin. See docs/auth.md for setup, role details, API tokens, and nginx integration.
Documentation
In-app help is available at /help after starting DOVE. All docs are in the docs/ directory:
Setup — Interface overview · Configuration · Authentication
Pipeline — Inputs (uridecodebin3 · playlist · wpesrc · ytdlp · nodecg · testsrc) · Scenes · Outputs · Encoders
Effects & Output — Audio filters · Video filters · Previews
Operations — Debugging
Tech Stack
- GStreamer 1.26+
- FastAPI + uvicorn — REST API and WebSocket
- Nuxt 4 — web frontend
- Python 3.12+
Development
Running DOVE natively from a Python venv: see docs/install.md.
Contributing
Contributions are welcome! Please open an issue first to discuss larger changes. For bug reports, include the GStreamer version, config, and relevant logs.
Notes
- Decklink requires a supported Blackmagic Design card and the
decklinkGStreamer plugin - WebRTC previews use
announced_ipfor the server's public IP — set inconfig.tomlor viaANNOUNCED_IPenv var
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dove_video_editor-1.0.0rc1.tar.gz.
File metadata
- Download URL: dove_video_editor-1.0.0rc1.tar.gz
- Upload date:
- Size: 138.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9287a3b381dfec90c5b776e5b0ba29c99c9eea26e781686475bfd2c7f388e41a
|
|
| MD5 |
aa4b35b18495aa9f9369777d8a959036
|
|
| BLAKE2b-256 |
0ea2766108a58c608f5813345bfa3d4bf052f7401da0f807fbff3672f79ede7c
|
Provenance
The following attestation bundles were made for dove_video_editor-1.0.0rc1.tar.gz:
Publisher:
pypi-publish.yml on dorftv/dove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dove_video_editor-1.0.0rc1.tar.gz -
Subject digest:
9287a3b381dfec90c5b776e5b0ba29c99c9eea26e781686475bfd2c7f388e41a - Sigstore transparency entry: 1541105370
- Sigstore integration time:
-
Permalink:
dorftv/dove@ec7d204da02c53bbadb8af72551116f4b7fe1d09 -
Branch / Tag:
refs/tags/v1.0.0-rc1 - Owner: https://github.com/dorftv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@ec7d204da02c53bbadb8af72551116f4b7fe1d09 -
Trigger Event:
push
-
Statement type:
File details
Details for the file dove_video_editor-1.0.0rc1-py3-none-any.whl.
File metadata
- Download URL: dove_video_editor-1.0.0rc1-py3-none-any.whl
- Upload date:
- Size: 180.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fc4514c17dc27619a89866f3b514d9e4e7b72f24a673e3780622a6f5a3e0f9c
|
|
| MD5 |
017bd5dbe3ba4e3d02bebcb7541c82bd
|
|
| BLAKE2b-256 |
7689579fa02586cfa24d95862326ed4fceaa7a1fb99229839a1f3ee2de2b3d4b
|
Provenance
The following attestation bundles were made for dove_video_editor-1.0.0rc1-py3-none-any.whl:
Publisher:
pypi-publish.yml on dorftv/dove
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dove_video_editor-1.0.0rc1-py3-none-any.whl -
Subject digest:
5fc4514c17dc27619a89866f3b514d9e4e7b72f24a673e3780622a6f5a3e0f9c - Sigstore transparency entry: 1541105472
- Sigstore integration time:
-
Permalink:
dorftv/dove@ec7d204da02c53bbadb8af72551116f4b7fe1d09 -
Branch / Tag:
refs/tags/v1.0.0-rc1 - Owner: https://github.com/dorftv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@ec7d204da02c53bbadb8af72551116f4b7fe1d09 -
Trigger Event:
push
-
Statement type: