Transcode video and audio into any format or quality level on your own hardware. Full FFmpeg pipeline with job queuing, GPU acceleration, and adaptive bitrate output — no per-minute cloud encoding fees.
FFmpeg is bundled inside the plugin container. GPU acceleration (NVENC, VAAPI, VideoToolbox) is detected automatically when the host exposes the device.
nself license set nself_pro_...
nself plugin install media-processing
nself build
nself startnself-media-processing wraps FFmpeg in a job queue backed by Redis. Submit a transcode job via HTTP (source URL, target format, quality presets) and the plugin picks it up, encodes using FFmpeg, and uploads the output to your object storage. Job status is tracked in Postgres and queryable via REST or Hasura GraphQL.
Adaptive bitrate (ABR) output generates multiple quality renditions (1080p, 720p, 480p, 360p) from a single source in one job. nself-streaming picks up the ABR output directly for HLS delivery. You can also transcode single files — a 4K MKV to a 1080p H.264 MP4, for example — without setting up ABR.
GPU acceleration is optional but significant: NVENC on an RTX card encodes at 8–12x realtime vs 2–3x for software x264. The plugin auto-detects available hardware encoders at startup and falls back to software encoding if none are found.
| Variable | Required | Description |
|---|---|---|
DATABASE_URL | Yes | Postgres connection string (auto-set by nself) |
MEDIA_REDIS_URL | Yes | Redis URL for job queue. Defaults to built-in Redis |
MEDIA_STORAGE_BUCKET | Yes | Object storage bucket for transcoded output |
MEDIA_WORKERS | No | Concurrent transcode workers. Default: 2 |
MEDIA_GPU_ENABLED | No | Enable GPU hardware encoding. Default: auto |
MEDIA_DEFAULT_PRESET | No | FFmpeg speed/quality preset: ultrafast–veryslow. Default: fast |
| Endpoint | Method | Description |
|---|---|---|
/media/jobs | POST | Submit a transcode job |
/media/jobs/:id | GET / DELETE | Get job status and output URLs, or cancel a pending job |
/media/jobs/:id/progress | GET | Real-time transcode progress as Server-Sent Events |
/media/presets | GET | List built-in quality presets (1080p-ABR, 720p-ABR, etc.) |
/health | GET | Plugin health, FFmpeg version, GPU status |
| Table | Purpose |
|---|---|
np_media_jobs | Job queue: source, preset, status, progress %, output paths, duration |
np_media_renditions | Output files per job: resolution, bitrate, format, storage path |
| Event | Payload |
|---|---|
media.job.started | Job ID, source URL, preset, worker ID |
media.job.completed | Job ID, output URLs per rendition, wall-clock duration |
media.job.failed | Job ID, FFmpeg exit code, stderr excerpt |
nself-media-processing is the encode engine for ɳTV. When nself-file-processing ingests a new media file, it submits a transcode job here. The ABR output feeds nself-streaming for HLS delivery. nself-recording also uses it to transcode captured streams into playable MP4s.
| Feature | nself-media-processing | AWS Elemental MediaConvert | Mux |
|---|---|---|---|
| Cost model | $0.99/mo bundle | $0.0075–$0.015/min of output | $0.0035–$0.085/min of stored content |
| Data leaves server | No | Yes | Yes |
| GPU acceleration | NVENC / VAAPI / VideoToolbox | Yes (managed) | Yes (managed) |
Jobs stuck in pending: Check Redis is reachable — nself plugin status media-processing. Confirm MEDIA_WORKERS is at least 1.
GPU not detected: Run docker exec <container> ffmpeg -hwaccels to list available hardware encoders. For NVENC, the NVIDIA container runtime must be installed on the host and the GPU device must be passed through in your nself config.
Port: 3510 (moved from 3088) | Bundle: ɳTV ($0.99/mo) or ɳSelf+ ($3.99/mo) | Last Updated: May 2026 | Plugin Version 1.0.13