Otro de los proyectos en los que he aplicado de manera exitosa la IA generativa ha sido el de cómo proporcionar información contextual en vídeos deportivos. Soy un aficionado al ciclismo de montaña y gravel, y me gusta grabar vídeos deportivos con el dron y con la cámara de acción, y subir el contenido a redes sociales. Uno de los problemas que venía observando en este tipo de vídeos era la falta de información de contexto relativo al recorrido que estás realizando: velocidad, altitud, perfil de la etapa… Algo que era una pena, dado que hay una gran cantidad de metainformación a tu disposición por el mero hecho de grabar el vídeo. Y más si, como es mi caso, registrar el recorrido mediante GPS con alguna aplicación deportiva.

Fotograma de una secuencia de vídeo con los indicadores

Así fue cómo me decidí a desarrollar una aplicación con IA generativa que permitiera extraer esta metainformación para enriquecer el contexto de los vídeos deportivos. La idea de partida era generar una serie de indicadores para mostrar la información más relevante de una etapa ciclista, a saber:

  • Velocímetro semicircular, con indicación de la velocidad actual con respecto al máximo de la etapa
  • Brújula, o mejor dicho, rosa de los vientos, para conocer el rumbo actual
  • Minimapa con traza GPS, para tener una indicación visual del recorrido y el punto de progreso en el mismo.
  • Indicador vertical de altitud, con referencia del incremento/decremento de altitud relativa, e indicación de altitud absoluta con respecto al nivel del mar
  • Perfil de elevación de etapa con progreso respecto al total de la etapa
  • Barra de distancia, igualmente con progreso respecto al total de la etapa

En este sentido, he realizado una distinción entre indicadores de «contexto global» (minimapa, perfil de elevación y barra de progreso), que están pensandos para mostrar información de la ruta completa si tienes registrado el recorrido en GPS, y que muestran esta información con el tramo del corte del dron destacado dentro de ella; y los indicadores «locales» (velocímetro, brújula, barra de altitud), que siguen usando exclusivamente datos del del corte de vídeo.

Además, el objetivo era generar toda esta información de manera completamente automática, y generar vídeos overlay ajustados al tamaño de los cortes de vídeo grabados, para facilitar la edición posterior. Hice un primer proceso de investigación con Claude Code para evaluar la viabilidad del proyecto, lo que me confirmó que era factible e, incluso, tras algunas iteraciones, me permitió incorporar algunas ideas adicionales al proyecto. EL origen de la información a utilizar serían los ficheros SRT que los drones DJI generan de manera complementaria a la pista MP4, y donde almacenan toda la información de contexto que el dron genera. Así, preparé un CLAUDE.md y un prompt adecuados, y pude empezar a implementar la aplicación.

Enfoqué el desarrollo como un proceso estructurado en fases iterativas, en el que fui implementando distintos aspectos del proceso, a saber:

  1. Parser de telemetría y estructura base: El punto de partida fue entender el formato SRT que generan los drones DJI, como es mi caso. Cada fotograma del vídeo tiene asociada una entrada con coordenadas GPS, altitud relativa y absoluta, e información de cámara. El primer reto fue que los dos modelos de dron disponibles (DJI Neo y Mini 3 Pro) usan formatos ligeramente distintos: diferente nombre del contador de frames (FrameCnt vs SrtCnt), diferente espaciado en los campos y campos exclusivos de cada modelo. Se implementó un parser flexible capaz de manejar ambos formatos y extraer los datos necesarios a un DataFrame de pandas. El punto clave de este paso es que ninguno de los dos modelos incluye velocidad en el SRT, así que hubo que calcularla a partir de la distancia geodésica entre coordenadas GPS consecutivas, teniendo en cuenta que el GPS del dron sólo actualiza cada ~3 fotogramas. Lo mismo con el rumbo (bearing), calculado por trigonometría esférica entre posiciones sucesivas.
  2. Diseño de widgets y composición visual: Se diseñaron seis indicadores estilo HUD, cada uno como módulo independiente renderizado con matplotlib sobre fondo transparente:
    • Velocímetro semicircular con aguja animada y escala dinámica adaptada a la velocidad máxima del recorrido.
    • Brújula con rosa de los vientos fija y flecha de dirección rotada según el rumbo calculado.
    • Minimapa con la traza GPS completa y un indicador de posición actual, coloreado por pendiente.
    • Barra vertical de altitud con degradado verde-naranja y marcador de posición.
    • Perfil de elevación mostrando distancia vs. altitud con relleno de progreso y color por pendiente.
    • Barra de progreso horizontal con distancia recorrida, total y tiempo transcurrido.

      Se implementó un compositor que instancia los indicadores, los posiciona sobre un lienzo RGBA transparente respetando márgenes y sin solapamientos, y escala automáticamente todo en función de la resolución del vídeo fuente (referencia base: 1920×1080).
  3. Pipeline de renderizado con ffmpeg: El renderizado procesa fotograma a fotograma: para cada fotograma del vídeo se interpola la telemetría al timestamp exacto, se componen los indicadores sobre un lienzo transparente y se envía el resultado como RGBA en bruto a ffmpeg por stdin. La salida es un vídeo con canal alpha(codec qtrle en MOV o PNG en MP4) listo para superponer como pista de overlay en DaVinci Resolve. El suavizado de la telemetría fue clave para la calidad visual: media móvil de 21 frames para velocidad y rumbo (con descomposición sen/cos para manejar el cruce 360°/0°), y ventanas más cortas para altitud y pendiente.
  4. Integración de GPX para ruta completa: Los cortes del dron cubren sólo fragmentos de una ruta de ciclismo. Al añadir soporte para ficheros GPX (exportados desde Strava, Garmin, etc.), los indicadores de «contexto global» (minimapa, perfil de elevación y barra de progreso) pueden mostrar la ruta completa, con el tramo del corte del dron destacado dentro de ella. Los widgets «locales» (velocímetro, brújula, barra de altitud) siguen usando exclusivamente datos del SRT.
  5. Fallback de GPS desde GPX: El DJI Neo tiene un problema frecuente: al inicio de cada clip, el GPS aún no ha fijado señal y devuelve coordenadas (0, 0) durante decenas de frames. Se implementó un sistema de fallback automático que, cuando detecta frames sin GPS válido y hay un GPX disponible, rellena latitud, longitud y velocidad interpolando temporalmente desde el GPX. La velocidad se calcula a resolución nativa del GPX (1 Hz) antes de interpolar, para evitar artefactos de precisión que surgían al calcularla entre posiciones interpoladas a 30 fps.
  6. Detección automática de offset UTC: La correlación temporal entre el SRT del dron y el GPX de la actividad requiere conocer la zona horaria: el SRT usa hora local sin indicador de zona, mientras que el GPX almacena timestamps en UTC. Inicialmente se usaba un offset fijo (CEST = UTC+2), pero esto
    fallaría con grabaciones de invierno (CET = UTC+1) o en otras zonas horarias. Se implementó una detección automática, comparando el creation_time UTC del MP4 (extraído con ffprobe) con el primer datetime del SRT, eliminando cualquier dependencia de la zona horaria.
  7. Soporte para DJI Osmo Action 5 Pro: Una pequeña evolución sobre mi idea base. En mi caso, también grabo determinadas secuencias con una cámara de acción, la DJI Osmo Action 5 Pro. Ésta graba vídeo con un fichero LRF que contiene metadatos protobuf (acelerómetro, parámetros de exposición), pero sin ningún dato de posición GPS. Se añadió un modo –origin action que genera telemetría sintética completa a partir de un fichero GPX: usando el creation_time UTC del MP4 como referencia temporal, se interpola posición, altitud, distancia y velocidad del GPX a la frecuencia de frames del vídeo mediante np.interp vectorizado. La altitud relativa se calcula respecto al punto de inicio del vídeo, no del GPX. Un problema sutil surgió en esta fase: el procesador de telemetría recalculaba la distancia acumulada desde cero a partir de las coordenadas, machacando las distancias originales del GPX. Esto hacía que el perfil de elevación mostrara el progreso desde el inicio de la ruta en lugar de desde la posición real donde empieza el vídeo. Se resolvió preservando las distancias GPX originales cuando ya vienen calculadas en el DataFrame de entrada.
  8. Documentación del proyecto

Como resultado final, para un vídeo se generan los siguientes indicadores:

IndicadorDescripciónPosición
VelocímetroVelocímetro semicircular con aguja animada. Rango dinámico según la velocidad máxima del SRT. Aguja naranja, roja a velocidades altas.Inferior izquierda
BrújulaIndicador de rumbo con puntos cardinales. El rumbo se calcula a partir de transiciones GPS, suavizado para evitar saltos.Lateral derecho
MinimapaTraza GPS de la ruta con marcador de posición actual y color por pendiente.Superior derecha
Indicador de altitudBarra vertical que muestra la altitud relativa actual dentro del rango mín/máx del recorrido.Centro izquierda
Perfil de elevaciónGráfica distancia frente altitud mostrando el perfil completo de la ruta con relleno de progreso.Inferior centro
Barra de progresoBarra horizontal con la distancia recorrida sobre la distancia total.Superior centro

Todos los indicadores se renderizan sobre fondo completamente transparente y se escalan automáticamente según la resolución del vídeo de origen, ya sea 720p, 1080p o 4K, para que se vean correctamente independientemente del tamaño del vídeo.

Posteriormente, el proceso para incorporar los indicadores a la secuencia de vídeo es muy simple, ya sea en DaVinci Resolve, KDEnlive o cualquier otro editor de vídeo similar:

  • Colocar el metraje original del DJI en la pista V1
  • Colocar el vídeo overlay en la pista V2 (encima)
  • El canal alpha se reconoce automáticamente: los indicadores de telemetría aparecen sobre el metraje sin necesidad de keying ni efectos
Interfaz de DaVinci Resolve, para un vídeo generado con la Osmo Action 5 Pro

Tengo algunas mejoras en mente, pero el proyecto es actualmente completamente funcional, y permite, de una manera extremadamente sencilla, aprovechar toda esa información de contexto para enriquecer la visualización de vídeos deportivos. Información que, de otra manera, se desaprovecharía.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.