Media infrastructure
for developers
Sube, transcodifica y transmite video. Sirve imágenes y archivos. Genera captions automáticamente. Un SDK, cero costos de egress. Self-host o déjanos correrlo por ti.
import { createMediaRouter, video } from "@devultur/core";
const media = createMediaRouter({
apiKey: process.env.DEVULTUR_API_KEY,
video: video({
maxSize: "2GB",
locales: ["es-CO", "en"],
}),
});
const { url, key } = await media.createUploadUrl({
filename: "lesson-1.mp4",
contentType: "video/mp4",
});Funciona con tu stack
Qué incluye
Upload
Tus usuarios suben. Nosotros nos encargamos del resto.
URLs pre-firmadas, tracking de progreso, validación de archivos. UploadZone funciona listo para usar o en modo headless para UI custom.
Transcode
Video crudo entra, streaming HLS sale.
FFmpeg corre en máquinas Fly.io por segundo. Single-bitrate o adaptativo. Auto-thumbnails. Nunca administras una cola.
Deliver
Cero egress. En serio.
Cloudflare R2 almacena tus archivos. El bandwidth no cuesta nada. URLs firmadas, range requests, CDN caching incluido.
Captions
Transcripción en cualquier idioma, automáticamente.
Groq Whisper transcribe con timestamps por palabra. Mistral traduce a cualquier idioma. Archivos VTT se guardan junto al video.
Player
Agrega un video player con un componente.
hls.js por debajo. Atajos de teclado, selector de captions, reanudar desde última posición. Estilizado o headless.
Security
Tokens JWT vinculados a la sesión.
Vinculación por IP, huella de sesión, expiración configurable. Cuatro niveles desde URLs firmadas hasta segmentos HLS encriptados con AES-128.
SDK
Empieza con
import { createMediaRouter, video, image, file } from "@devultur/core";
export const media = createMediaRouter({
apiKey: process.env.DEVULTUR_API_KEY,
video: video({ maxSize: "2GB", locales: ["es-CO", "en"] }),
image: image({ maxSize: "10MB" }),
file: file({ maxSize: "500MB" }),
});import { UploadZone, VideoPlayer } from "@devultur/react";
<UploadZone
onUploadUrl={async (file) => {
const res = await media.createUploadUrl({
filename: file.name,
contentType: file.type,
});
return { url: res.url, key: res.key };
}}
onComplete={(r) => console.log("Uploaded:", r.key)}
/>
<VideoPlayer
src={playlistUrl}
captions={[
{ locale: "es-CO", label: "Espanol", src: captionUrl },
]}
onProgress={(time) => saveProgress(id, time)}
/>Precios
Starter
/mes mínimo
- $120 COP/GB storage
- $20 COP/GB bandwidth
- $20 COP /transform
- Video, captions, progress add-ons
- Dashboard + SDK
Pro
/mes mínimo
- $80 COP/GB storage
- $16 COP/GB bandwidth
- Transforms ilimitados
- Soporte prioritario
- Custom domain
Todos los planes pagos son por uso. Pagas por lo que usas, no una asignación fija.