LiveSubtitles
Una herramienta de subtitulado en tiempo real que incrusta subtítulos en vivo dentro de los flujos de vídeo para que el público sordo y con dificultades auditivas pueda seguir charlas públicas, conferencias y eventos en directo — con precisión de fotograma, controlado por el operador, listo para RTMP. Desplegado por una de las organizaciones más grandes del mundo en varios países.
Resumen
Construí LiveSubtitles para resolver un problema que veía repetirse en los eventos: las personas sordas o con dificultades auditivas o recibían una impresión horas después, o no recibían nada. La herramienta da al operador un editor de texto donde navega por líneas de subtítulos preparadas — y en el momento en que mueve el cursor, ese texto se compone píxel a píxel sobre cada fotograma de vídeo saliente. El flujo subtitulado sale entonces en directo por RTMP a YouTube, Twitch o cualquier endpoint que el local ya use. Sin servicio de subtitulado aparte. Sin suscripción a un CDN. Un portátil, un operador.
El pipeline que diseñé corre como: VideoReader → VideoSubtitleFilter → AudioInputFilter → VideoStreamer. JavaCV y FFmpeg hacen el trabajo pesado — codificación H.264 a bitrate y preset configurables, audio AAC a 120 kbit/s, y un proxy de playlist HLS para que los dispositivos del público puedan consumir el flujo directamente desde la máquina del operador cuando no hay CDN externo. Un logger SRT de sesión marca con timestamp cada cambio de subtítulo y exporta un archivo .srt completo al final de cada sesión, dando a las organizaciones un registro permanente de accesibilidad.
La variante overlay fue la primera build — un proyecto NetBeans reducido hecho para una de las organizaciones más grandes del mundo, ahora desplegada en varios países. Incluye una ventana overlay siempre encima que abarca el proyector, límites de caracteres por línea y un formato propio para guiones preparados, pensado para eventos en grandes auditorios donde los operadores siguen un texto previamente revisado. Las lecciones de ese despliegue global impulsaron la reescritura 1.0 – 1.2 hacia un proyecto Maven más limpio, con edición multi-pestaña, pestañas de subtítulos con drag-and-drop, soporte push-to-talk y apariencia de subtítulos totalmente configurable.
Arquitectura
Cómo leer el diagrama: Cuatro entradas del operador — fuente de vídeo (archivo, HLS o URL de YouTube), línea de micrófono, documento de subtítulos preparado y playlist HLS opcional — alimentan un único pipeline de fotogramas basado en FFmpeg. El pipeline compone el texto del subtítulo sobre cada fotograma de vídeo antes de que alcance cualquier salida. Las salidas se abren en abanico: push RTMP para emisión en directo, un log SRT de sesión para archivo, grabación local opcional y — en la variante overlay empresarial — una ventana overlay siempre encima mapeada a la pantalla del proyector. Cada componente es intercambiable desde el panel de ajustes sin tocar el pipeline.
El trabajo en accesibilidad no entra en el resumen de los grandes éxitos, pero es el código que más importa. Cada fotograma que este pipeline acertó fue una frase que un miembro sordo del público pudo seguir.
Seis cosas entregadas,
tres difíciles resueltas.
Contribuciones clave
- Construí un pipeline de incrustación de subtítulos con precisión de fotograma:
VideoReader → VideoSubtitleFilter → AudioInputFilter → VideoStreamer, componiendo el texto del subtítulo elegido por el operador sobre vídeo H.264 a 30 fps antes del push RTMP. - Diseñé la capa de streaming RTMP con JavaCV y FFmpeg — bitrate configurable, preset/tune H.264, audio AAC — apuntando a YouTube Live, Twitch y cualquier endpoint RTMP.
- Implementé un motor de descarga HLS con un proxy HTTP local para que las pantallas del público pudieran consumir el flujo subtitulado desde cualquier CDN sin instalar software.
- Escribí un parser de subtítulos multiformato que cubre HTML, XML, .docx/.doc (Apache POI), SubRip (.srt) y un formato binario propio para la variante overlay empresarial.
- Construí el logger SRT de sesión que marca con timestamp cada transición de subtítulo y exporta un archivo .srt completo al final de la sesión — un registro permanente de accesibilidad.
- Entregué la variante overlay standalone adoptada por una de las organizaciones más grandes del mundo — overlay siempre encima para proyector, controles de transparencia y fuente, aplicación de límite de caracteres y un formato propio para guiones preparados — desplegada en varios países.
Desafíos resueltos
- Back-pressure en el pipeline de fotogramas — el filtro de subtítulos tenía que componer texto sobre búferes de vídeo crudo a la tasa de fotogramas sin acumular un memory leak por objetos JavaCV Frame persistentes; resuelto con un CircularFifoQueue de capacidad fija y caché asíncrono de imágenes de subtítulos.
- Drift de audio/vídeo en sesiones largas — la reproducción HLS inicial mostraba el audio alejándose del cursor de subtítulos; requirió un PausableRelativeClock propio y un búfer adaptativo de 2,5 segundos ajustado a lo largo de varios ciclos de release (v1.0.5 → v1.1.1).
- Cero infraestructura para el público — la herramienta tenía que funcionar en grandes auditorios y locales comunitarios sin equipo de servidores; el proxy HTTP HLS local hacía que el portátil del operador fuera toda la cadena de emisión.
Qué hay bajo el capó.
¿Listo para arreglar, construir
o escalar?
30 minutos, conmigo personalmente. Leo tu sistema como un archivo de logs y te digo qué haría primero. Sin presentaciones, sin embudo de ventas.
— Davor Majc, fundador, Numen
