Ir al contenido

Video y audio de Recon

Transmite video en vivo y grabado desde cada una de las cámaras de un robot Recon, y su audio en vivo: obtén las URL de transmisión de todas las cámaras con getAllMediaUris, elige la cámara que quieres y reprodúcela como cualquier cámara de Rhombus.

En esta página

Un robot lleva una o más cámaras y un micrófono. Cada uno es una faceta del robot: las facetas de video se llaman v0, v1, etc., y las de audio, a0. Sus transmisiones funcionan igual que las de una cámara de Rhombus, así que se aplican las guías de transmisión y Medios y transmisiones. Los ejemplos usan la función auxiliar robot_api de la descripción general.

Necesitas una credencial con acceso solo en vivo al robot para las transmisiones en vivo, y acceso de solo lectura para el video grabado.

Obtén las URL de transmisión

getAllMediaUris devuelve las URL de todas las facetas a la vez:

Python
media = robot_api("getAllMediaUris", {"deviceUuid": ROBOT_UUID})
for facet, uris in media["videoFacetUris"].items():
    print(facet, uris.get("wanLiveM3u8Uri"))
for facet, uris in media["audioFacetUris"].items():
    print(facet, uris.get("wanLiveOpusUri"))
CampoContiene
videoFacetUrisPara cada faceta de video: wanLiveM3u8Uri (HLS), wanLiveMpdUri (DASH), wanLiveH264Uri (H.264 por WebSocket), wanVodM3u8UriTemplate y wanVodMpdUriTemplate (video grabado), y sus equivalentes lan…
audioFacetUrisPara cada faceta de audio: wanLiveOpusUri (Opus por WebSocket) y lanLiveOpusUris
wanLiveRobotUriEl socket en vivo del robot, para control y telemetría
lanCheckUrlsURL que responden 204 cuando tu cliente puede llegar al robot por la red local

Vuelve a obtener las URL antes de reconectarte a una transmisión. El host de medios del robot puede cambiar.

Elige una cámara

getFullState indica qué facetas tiene el robot y hacia dónde apunta cada cámara:

Python
state = robot_api("getFullState", {"deviceUuid": ROBOT_UUID, "force": False})["fullState"]
directions = (state.get("robotPlatformCapability") or {}).get("facetOrientationDegrees") or {}
names = state.get("facetNameMap") or {}
for facet in state.get("supportedFacets", []):
    if facet in media["videoFacetUris"]:
        print(facet, names.get(facet, ""), directions.get(facet), "degrees")
  • supportedFacets enumera las facetas que el robot tiene realmente. Usa solo las facetas que aparecen tanto ahí como en getAllMediaUris.
  • facetOrientationDegrees da la dirección de cada cámara, en sentido antihorario desde la dirección de avance del robot: 0 mira hacia adelante y 180, hacia atrás.
  • facetNameMap contiene el nombre de cada faceta.

Reproduce video en vivo

Reproduce la URL de una faceta como la de una cámara. En un navegador, genera un token federado en tu servidor y agrégalo a la URL:

JavaScript
const url = `${videoFacetUris.v0.wanLiveM3u8Uri}?x-auth-scheme=federated-token&x-auth-ft=${encodeURIComponent(token)}`;
if (video.canPlayType("application/vnd.apple.mpegurl")) {
  video.src = url;
} else {
  const hls = new Hls();
  hls.loadSource(url);
  hls.attachMedia(video);
}

Desde un servidor o una app nativa, envía en su lugar los encabezados de tu clave de API en cada solicitud. DASH y el WebSocket H.264 funcionan como se describe en Video en vivo y grabado.

Video grabado

Las plantillas wanVodM3u8UriTemplate y wanVodMpdUriTemplate de una faceta reproducen lo que grabó esa cámara. Reemplaza {START_TIME} (hora Unix en segundos) y {DURATION} (segundos) en la plantilla:

Python
template = media["videoFacetUris"]["v0"]["wanVodM3u8UriTemplate"]
url = template.replace("{START_TIME}", str(start_seconds)).replace("{DURATION}", "300")

Para encontrar los momentos que vale la pena ver, usa los eventos del robot: cada llegada a una parada de patrulla tiene un timestampMs.

Audio en vivo

wanLiveOpusUri es un WebSocket que transmite audio Opus desde el micrófono del robot. Autentícalo igual que el WebSocket H.264 (WebSocket (H.264 y audio)).

En la red local

Cuando tu cliente está en la red del robot, solicita una de las lanCheckUrls. Si responde 204, usa las URL lan… para tener menos latencia y no generar tráfico por internet. Streaming por LAN explica los certificados y la autenticación en la red local.