# Fase 6 — Live Gateway + grades

**Status:** concluída neste ambiente  
**Data:** 2026-08-19  
**URL:** https://vms.restor.app.br/ao-vivo  
**Serviço:** `ipcam-live.service`

## Princípio

Navegadores não falam RTSP. O **Live Gateway** reempacota para HLS e o Laravel só autentica/serve.  
O Recorder **não** participa deste fluxo. Restart do painel ou do live não mata gravações.

```
Câmera RTSP (sub) ──▶ Live Gateway (FFmpeg on-demand) ──▶ HLS ──▶ browser (auth)
```

## O que foi entregue

- `ipcam-live` (systemd, `www-data`) — FFmpeg só para câmeras com viewer nos últimos 15 s
- Tetos: `IPCAM_LIVE_MAX_TILES` (default 9)
- URL de live: `live_stream_role` (default **sub**), fallback main; `lavfi:` para o simulador
- FFmpeg via argv, sem shell; RTSP `-c copy`; lavfi libx264 zerolatency
- UI **Ao vivo**: grades 1, 2×2 e 3×3, seleção por tile, tela cheia
- Playlist/segmentos só com sessão autenticada (sem senha RTSP no browser)
- Heartbeat JSON → tabela `live_viewers`

## Latência

HLS de 1 s (hls.js `lowLatencyMode`). Ordem de grandeza **~3–6 s**, não WebRTC.  
WebRTC/MediaMTX permanece a evolução de baixa latência (ICE/UDP atrás do Apache HTTPS).

## Testes

`php artisan test --filter=LiveGatewayTest` — argv, substream, auth, path traversal, HLS lavfi.

## Aceite

| Critério | Resultado |
|---|---|
| Grade 1 / 2×2 / 3×3 | OK |
| Substream (com fallback) | OK |
| Auth nas URLs de mídia | OK |
| Gateway independente do Recorder | OK (unit systemd sem Requires) |
| Sem `if fabricante` | OK |
| WebRTC primeiro | Adiado (HLS estável neste Apache/HTTPS) |

## Fora desta fase

Pesquisa / timeline / playback: [`docs/FASE-7-RESULTADOS.md`](FASE-7-RESULTADOS.md). Fora da Fase 6: export, retenção, WebRTC.
