Auto-stream DJI
Cuando un dock DJI está en línea y asignado a una misión, ARGUS aprovisiona automáticamente un ingreso WHIP de TACLINK y le dice al dock que empuje su stream de la cámara de la aeronave hacia él. Sin botón del operador. Sin segunda herramienta. El stream simplemente aparece en la sala de la misión en pocos segundos y se desmantela limpiamente cuando el dock se desasigna o queda offline.
Esta página cubre qué hace el piloto automático, las precondiciones que espera, cómo anularlo y qué hacer cuando las cosas no funcionan.
Las precondiciones
El piloto automático observa un estado compuesto por dock y sólo actúa cuando las tres condiciones son verdaderas:
dji_docks/{sn}.online === true— el dock está conectado actualmente a EMQX.dji_docks/{sn}.missionIdestá definido — el dock ha sido asignado a una operación.dji_docks/{sn}.liveCapacity.device_listreporta al menos una cámara de aeronave.
La tercera condición importa porque live_capacity es el campo DJI que
nos dice qué cámaras están realmente disponibles para streaming. Un dock
sin aeronave adjunta o una todavía en arranque con cubierta cerrada no
tiene capacidad disponible — el piloto automático espera a que se
estabilicen update_topo + live_capacity antes de actuar.
El debounce de 2 segundos
Tras una actualización del dock escrita en Firestore, el piloto automático espera 2 segundos a que se estabilice el estado antes de actuar. En el encendido del dock, el estado compuesto (online, missionId, capacidad) tiende a escribirse en una ráfaga rápida durante unos cientos de ms; el debounce los coalesce en una sola reconciliación.
Qué hace el piloto automático cuando las precondiciones coinciden
- Crea un ingreso WHIP mediante IngressClient de
livekit-server-sdk, con:roomName= id de misión.participantIdentity=dji-dock-{sn}-{videoSlug}(el prefijo coincide con el peer de telemetría para queisDjiPeer()capture ambos).participantMetadata= JSON{source: 'dji-cloud', role: 'video', dockSn, videoId, dockModel, autopilot: true}para que la webapp pueda clasificar sin olfatear el prefijo.
- Publica MQTT
live_start_pushal dock conurl_type: 4(WHIP) y la URL WHIP compuesta. - El dock hace stream de H.264 sobre HTTPS WHIP → ingreso TACLINK → los participantes se suscriben a la pista de vídeo.
No se necesita un round-trip a argus-api — argus-dji llama directamente a LiveKit usando las credenciales que ya tiene. Esto mantiene la ruta resiliente a caídas de argus-api.
Qué cámara + lente se auto-selecciona
Por defecto, el piloto automático elige la cámara normal-0 de la
aeronave — el stream de lente wide, calidad predeterminada. Los
operadores pueden cambiar lente (wide / zoom / ir) y calidad
(smooth / SD / HD / UHD) a mitad de stream mediante los
controles del tile del stream del dron — el
piloto automático no pelea contra el cambio manual.
Desmontaje
El piloto automático también observa las condiciones de desmontaje:
missionId: null → setfue lo que nos inició.missionId: set → null— el dock fue desasignado. Desmontar.online: true → false— el dock quedó offline. Desmontar.- Documento del dock eliminado. Desmontar.
- Misión completada. Desmontar.
En el desmontaje, ARGUS publica live_stop_push al dock + elimina el
ingreso LiveKit. Sin ingresos filtrados o sesiones MQTT huérfanas.
Condiciones de carrera manejadas
- Carreras de snapshot — si el dock parpadea online/offline en rápida sucesión, el debounce de 2 s lo absorbe.
- Cambio de misión — si
missionIdcambia (dock reasignado a mitad de operación), el piloto automático desmantela el ingreso antiguo y aprovisiona uno nuevo para la sala de la nueva misión. - Doble reconciliación — la reconciliación es idempotente — si se ejecuta dos veces con el mismo estado, la segunda ejecución no encuentra trabajo por hacer.
Anulación manual
Aún puedes iniciar un stream manualmente incluso con auto-stream en marcha:
POST /api/dji/streams/start— la ruta de inicio manual de argus-api. Útil para iniciar una segunda cámara (por ejemplo, la FPV del dock además de la cámara wide de la aeronave). La ruta manual usa el mismo esquema de identidad + metadatos para que la webapp la renderice junto a los participantes de auto-stream sin problemas.- El operador también puede desactivar auto-stream por misión desde Detalle de misión → Configurar → DJI → Desactivar auto-stream — deja los streams existentes en paz pero no iniciará nuevos.
Fallback: RTMP
Si el dock hace NACK a WHIP (live_start_push devuelve distinto de
cero), argus-dji devuelve el flag de fallo hasta la ruta
/api/dji/streams/fallback-rtmp de argus-api, que crea un ingreso
RTMP y reintenta. El reintento usa el mismo esquema de sala +
metadatos-de-participante — el stream aterriza en la sala de cualquier
manera, sólo con latencia ligeramente mayor para RTMP. Éste es el
único caso donde se usa RTMP; auto-stream prefiere WHIP
universalmente.
Solución de problemas
- El stream no aparece. Verifica las tres precondiciones. Causa
más común:
liveCapacityaún no poblado (aeronave todavía arrancando). - Fugas de ingreso. El piloto automático es riguroso con la limpieza; si ves un ingreso no desmantelado tras terminar una misión, reporta el ID de la misión al soporte — puede haber una carrera rara que no hayamos cogido todavía.
- El stream cae a mitad de vuelo. Normalmente un problema de red
en el lado del dock — verifica el estado
dji_docks/{sn}.onliney el enlace WAN del dock.
Relacionado
- Streams → pestaña DOCKS
- Tile del stream del dron — dónde se abre el stream.
- Visión general DJI