StreamHub
En beta — probalo gratis

Tu media server self-hosted WebRTC + RTMP + HLS + grabación, todo self-hosted

StreamHub es una capa de gestión sobre LiveKit: WebRTC sub-segundo, ingest multi-protocolo, HLS en vivo, grabación a tu propio S3 y un SDK JavaScript liviano y drop-in para publicar y suscribirte por WebRTC. Multi-tenant, con webhooks firmados y observabilidad.

  • WebRTC
  • RTMP
  • WHIP
  • RTSP
  • HLS
Open source · self-hosteable …o lo hosteamos nosotros
app.streamhub.studio
Dashboard de StreamHub: estado del servidor, CPU/memoria/disco, streams activos, apps e ingress/egress en vivo
Funciones

Un media server completo, self-hosted

WebRTC, RTMP, WHIP, RTSP y HLS; grabación a tu S3; realtime, multi-tenant, webhooks firmados y un SDK WebRTC liviano. Sobre LiveKit, self-hosted.

Streaming

Ingest y salida multi-protocolo

Entrá por donde quieras, salí en WebRTC de baja latencia o en HLS embebible.

WebRTC de baja latencia

sub-segundo

Player WebRTC sobre LiveKit con latencia sub-segundo para "ver en vivo ahora" y videollamadas. Tokens de subscribe efímeros por room.

Ingest RTMP

RTMP · OBS

Push desde OBS/ffmpeg a rtmp://…:1935/live/<key>. Stream key + password opcional: StreamHub corta el push que no se validó antes.

WHIP

WebRTC-HTTP

Endpoint WHIP para publicar desde el navegador o encoders modernos por WebRTC, sin pasar por RTMP.

RTSP relay

RTSP pull

Tirá de una fuente remota (rtsp://camara/stream) y republicala en la room. Ideal para cámaras IP y NVRs.

HLS en vivo

video.js

Egress HLS segmentado servido en /hls/<app>/<room>/index.m3u8 (video.js, CORS abierto). ~6-15s, embebible en cualquier lado.

Grabación y salida

Grabá en tu propio S3, restreameá a donde quieras

La media es tuya: se sube a tu bucket. Las salidas van a YouTube, Twitch o tu CDN.

Grabación a TU S3

AWS · Wasabi · MinIO

Egress a MP4 y subida a tu propio bucket S3 (AWS, Wasabi, MinIO). Un bucket/prefijo por app; las claves nunca viven en el YAML.

VOD listo para reproducir

VOD

Cada grabación queda como VOD en tu S3 con snapshot, metadatos (duración/resolución/codec) y URL pública o presignada.

Split MP4 por partes

split N min

Cortá la grabación cada N minutos: cada parte es su propio MP4 = su propio VOD, indexado y con callback recording_part_ready.

Snapshots periódicos

JPEG cada Ns

Capturá un JPEG cada N segundos durante la grabación, subido a tu S3. También snapshots on-demand de cualquier room.

Broadcast webcam → RTMP

YouTube · Twitch

Reenviá una room a un RTMP/RTMPS externo (YouTube/Twitch/custom) con el widget Transmitir: webcam del navegador → restream.

Realtime

Interacción en vivo y eventos

Chat, reacciones y viewers sobre data-channels; webhooks firmados de todo lo que pasa.

Chat en vivo

data-channel

Chat sobre data-channels de LiveKit (con emojis). El backend puede inyectar mensajes y dispara el callback chat_message.

Reacciones

reactions

Reacciones animadas flotantes sobre el topic reaction: corazones y likes en tiempo real, con su callback reaction.

Contador de viewers

en vivo

Conteo de subscribers reales por stream en vivo, excluyendo publishers y participantes ocultos/QC. Exportado a Prometheus.

Webhooks firmados

HMAC-SHA256

StreamHub postea un JSON firmado (HMAC-SHA256) por CADA evento: room, participantes, ingress/egress, grabación, VOD y HLS.

Players embebibles

/play · /embed

Páginas públicas /play y /embed + snippet iframe. Players WebRTC y HLS sin auth, con panel de chat/reacciones/viewers incluido.

Escala

Multi-tenant, adaptativo y observable

Apps aisladas, transcoding adaptativo con GPU opcional y métricas Prometheus de todo.

Transcoding adaptativo

720 / 480 / 240

Ladder de renditions vía simulcast de LiveKit + ingress multi-layer para un player adaptativo por app, sin config extra.

GPU opcional

NVENC · VAAPI

Detección de GPU por nodo (NVIDIA nvidia-smi / VAAPI /dev/dri) y hwaccel auto/gpu/cpu por app. Nunca falla si no hay GPU.

Apps multi-tenant aisladas

apps

Cada "app" es un tenant: rooms/streams namespaced, su S3, sus VODs/DB, sus tokens y callbacks. Totalmente aisladas.

Teams, roles y cuotas

RBAC · quotas

Equipos aislados por tenant, roles/permisos y cuotas: apps, streams concurrentes, minutos de grabación y GB de egress al mes.

Observabilidad

Prometheus

Métricas Prometheus en /metrics (streams, viewers, VODs, uploads S3, callbacks, GPU…), health probe, stats y logs consultables.

Per-app SQLite

SQLite

Registro global streamhub.db + una vods.db por app. Sin base pesada que operar: SQLite por tenant y media en S3 por app.

Devs

API, SDK drop-in y open source

Todo por API, todo self-hosteable. Sumás el SDK y empezás a publicar en pocas líneas.

SDK JS drop-in

@streamhub/adaptor

Un SDK JavaScript liviano: sumás @streamhub/adaptor (npm o un <script>) y StreamHubAdaptor te deja publicar y suscribirte por WebRTC en pocas líneas.

API REST

/api/v1

API bajo /api/v1 con envelope { data, error }. Apps, ingress, grabación, VODs, tokens, broadcast y HLS: todo por HTTP.

Auth + API tokens

JWT · sk_ tokens

Auth built-in (signup/login JWT, teams, superadmin) + API tokens sk_ para server-to-server. Bearer en todos los endpoints.

Radio / audio-only

audio-only

Rooms audio-only (voz estilo Discord) + modo radio: un locutor publica y los oyentes entran subscribe-only ocultos, con listen-token público.

Open source o hosted

self-host · hosted

Self-hosteable de punta a punta (Docker + LiveKit). En beta y gratis. ¿No querés operarlo? Lo hosteamos por vos.

Así se ve

El backoffice, en vivo

Capturas reales del panel de StreamHub. Un solo lugar para tus apps, streams, grabaciones, tokens y webhooks — corriendo sobre LiveKit.

app.streamhub.studio live
Dashboard en tiempo realPlayer en vivo, sub-segundoSalas multi-participanteIngest multi-protocoloEntrega adaptativa por appApps aisladas, multi-tenant

Dashboard en tiempo real

Estado del core de un vistazo: CPU, memoria y disco en vivo, streams activos, apps registradas y conexiones de ingress/egress. Con salud de LiveKit y uptime.

Métricas liveSalud LiveKitPrometheus
Verlo en la app

Claro u oscuro, vos elegís — todo el backoffice tematizado.

Dashboard · tema claro
Dashboard · tema claro
Auth built-in · login
Auth built-in · login

Cómo funciona

De cero al aire en tres pasos.

01

Creá una app

Cada app es un tenant aislado: su prefijo de sala, su bucket S3, sus tokens y cuotas. Listo en segundos desde el backoffice.

02

Publicá

Enviá tu señal por RTMP, WHIP, RTSP o directo desde la webcam. Copiás la URL y el stream key en OBS y salís al aire.

03

Mirá, grabá y embebé

WebRTC sub-segundo o HLS, grabación a tu propio S3 (VOD + snapshots) y players embebibles con link público o iframe.

Probalo con tus propios streams

Estamos en beta y es gratis. Open source y self-hostable — o lo hospedamos nosotros por vos.

Documentación

Docs y API

Un stack completo y self-hostable, documentado de punta a punta. Una API REST (global y por app), webhooks firmados, config por app, integraciones nativas y un deploy en un comando. Cada ruta vive detrás de un único dominio, con un explorador OpenAPI en vivo.

Funciones

Guías a fondo por función, de WebRTC a las cuotas.

  • WebRTC · ingest · HLS en vivo
  • Grabación → S3 · VOD
  • Transmisión · transcoding/GPU
  • Chat · reacciones · espectadores

API Global

Superficie REST de todo el server, protegida por tokens sk_.

  • GET /health · /stats
  • CRUD /apps
  • POST /tokens (emite sk_)
  • GET /logs
Abrir en Swagger →

API por app

Todo acotado a una única app tenant.

  • tokens · ingress · grabación
  • vods · streams · snapshots
  • HLS start/stop
  • config · capas de transcoding
Abrir en Swagger →

Webhooks y callbacks

Eventos entrantes de LiveKit y POST firmados salientes.

  • firma HMAC-SHA256
  • stream_started / _ended
  • vod_ready · recording_failed
  • chat_message · reaction

Referencia de config

El config.yaml por app, sin secretos.

  • recording · rtmp · webrtc
  • bucket S3 por app
  • bloque features
  • callbacks url + secret

Integraciones

Clientes nativos y de dispositivos, y el protocolo que habla cada uno.

  • Android (livekit-android)
  • iOS (LiveKitClient)
  • C++ (ffmpeg → RTMP)
  • ESP32-CAM → relay → RTMP

Self-hosting

Un docker compose up, o systemd + nginx.

  • Compose + Caddy / nginx
  • cada variable ENV documentada
  • runbook · backups · rollback
  • Prometheus + Grafana

Arquitectura

Cómo está construido y hacia dónde va.

  • core mono-Node + LiveKit
  • modelo de datos SQLite por app
  • cluster origin + edge
  • WebRTC vs HLS/CDN

La API REST en cinco llamadas

Autenticá con un sk_ token. Los nombres de sala llevan el prefijo de la app (live + demolive-demo).

base ·https://streamhub.digitalhub.com.ar/api/v1
# Scaffold an isolated tenant: config, per-app SQLite, S3 prefix, samples
curl -s -X POST https://streamhub.digitalhub.com.ar/api/v1/apps \
  -H "Authorization: Bearer $STREAMHUB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"live","displayName":"Live","roomPrefix":"live"}'
Webhooks firmados HMAC-SHA256
// Every callback is a signed POST. Verify the HMAC-SHA256 over the raw body.
import crypto from 'node:crypto';

app.post('/streamhub', express.raw({ type: 'application/json' }), (req, res) => {
  const sig = req.header('X-StreamHub-Signature');                 // "sha256=<hex>"
  const expected =
    'sha256=' + crypto.createHmac('sha256', SECRET).update(req.body).digest('hex');
  if (!sig || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)))
    return res.status(401).end();

  const evt = JSON.parse(req.body.toString('utf8'));              // { event, app, data }
  switch (evt.event) {
    case 'stream_started':   /* a publisher/ingress went live */  break;
    case 'vod_ready':        /* recording uploaded to your S3 */  break;
    case 'recording_failed': /* upload failed, local file kept */ break;
  }
  res.status(200).end();
});
Self-host en un comando docker compose
# Open source — self-host it, or let us host it for you.
git clone <vision-media-server>       # repo: vision-media-server
cp .env.example .env                  # LiveKit keys, per-app S3, PUBLIC_BASE_URL
docker compose up -d                  # core + LiveKit + ingress/egress, HTTPS via Caddy

# Swagger / OpenAPI:  /api/v1/docs      Metrics:  /metrics      Health:  /api/v1/health

Esto es un recorrido, no el mapa completo — la referencia entera cubre arquitectura, operación, testing y cada variable de entorno. Exploralo en vivo en los docs OpenAPI, o leé los streamhub-docs en el repo.

streamhub-adaptor

Un SDK WebRTC liviano — publicá y suscribite en pocas líneas

@streamhub/adaptor es un SDK JavaScript liviano para publicar y suscribirte por WebRTC, construido sobre livekit-client. Un constructor mínimo, un puñado de métodos y callbacks simples por string — poné una cámara al aire o reproducí una sala en pocas líneas.

un import
import { StreamHubAdaptor } from "@streamhub/adaptor";

// A lightweight WebRTC client, built on livekit-client.
const adaptor = new StreamHubAdaptor({ /* config below */ });
Instalar npm
npm install @streamhub/adaptor livekit-client
import { StreamHubAdaptor } from "@streamhub/adaptor";

const adaptor = new StreamHubAdaptor({
  // StreamHub mints the LiveKit token for you (prefer a pre-minted token + wsUrl in prod)
  streamhubApiUrl:   "https://streamhub.digitalhub.com.ar/api/v1",
  appName:           "live",
  streamhubApiToken: STREAMHUB_TOKEN,        // dev only — mint server-side for production
  mediaConstraints:  { video: true, audio: true },
  localVideoId:      "localVideo",           // <video id="localVideo"> preview element
  callback: (info, obj) => {
    if (info === "initialized")        adaptor.joinRoom("demo", "camera-1");
    else if (info === "joinedTheRoom") adaptor.publish(obj.streamId);   // send cam + mic
    else if (info === "publish_started") console.log("on air");
  },
  callbackError: (err, msg) => console.warn(err, msg),
});
¿Sin build? Sumá una sola etiqueta IIFE · CDN
<!-- No build step? Drop in one script tag and you're ready. -->
<script src="https://streamhub.digitalhub.com.ar/sdk/streamhub-adaptor.global.js"></script>
<script>
  const viewer = new StreamHubAdaptor({ isPlayMode: true, /* ...config */ });
</script>
Reproductor embebible <iframe>
<!-- The mint call returns a ready-to-paste embed. Public player, no SDK needed. -->
<iframe
  src="https://streamhub.digitalhub.com.ar/embed/live/live-demo"
  width="640" height="360" frameborder="0"
  allow="autoplay; fullscreen; camera; microphone"
  allowfullscreen>
</iframe>

Callbacks por string

initialized, publish_started, newStreamAvailable, roomInformation, data_received…

Métodos

joinRoom, publish, play, sendData, switchVideoCameraCapture, enableStats…

Control de dispositivo y bitrate

cambiá cámara o micrófono al vuelo y ajustá el bitrate por emisor, en vivo

Canales de datos

chat y reacciones viajan por DataPackets de LiveKit; canPublishData va en cada token

LiveKit maneja simulcast y streaming adaptativo de forma nativa. Para producción, emití los tokens del lado del server y pasá token + wsUrl para que el token de administración nunca llegue al navegador.

En beta — probá gratis

Empezá hoy: open source o gestionado

StreamHub es 100% open source y self-hostable — o, si preferís, lo hosteamos nosotros. Estamos en beta, así que podés probarlo gratis mientras lo pulimos.

Open source

Self-hosteálo

Cloná el repo y corré tu propio media server sobre LiveKit. Grabación a tu S3, tus apps, tus reglas. Sin lock-in.

  • Tu infra, tu S3
  • Docker o systemd + nginx
  • Webhooks + SDK incluidos
Lo hosteamos

Lo corremos nosotros

¿No querés operar la infra? Te damos StreamHub gestionado, actualizado y monitoreado. Vos te enfocás en transmitir.

  • Cero DevOps
  • Actualizaciones y monitoreo
  • Onboarding asistido

Hablemos de tu stream

Contanos tu caso de uso — WebRTC de baja latencia, ingest RTMP/WHIP/RTSP, grabación a tu S3, restream a YouTube/Twitch o multi-tenant. Te ayudamos a arrancar, ya sea self-hosted o gestionado.

Escribinos

¿Dudas, un caso de uso o querés que lo hosteemos nosotros? Contanos.

Te respondemos en 1–2 días hábiles.