# Fase 4 — Recorder Service (FFmpeg)

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

## Princípio

O Recorder **não** roda dentro do Apache/`php-fpm`. É um processo systemd próprio. Reiniciar o painel HTTP não mata o FFmpeg.

| Componente | Papel |
|---|---|
| Laravel (painel) | Liga/desliga `recording_enabled`, mostra status e segmentos |
| `ipcam-recorder` | Lê o banco, spawna FFmpeg, fecha segmento, INSERT em `recordings` |
| Storage Manager | Escolhe disco independente (`disk_id` em cada arquivo) |

## O que foi entregue

- `App\Recorder\RecorderSupervisor` — loop com um worker por câmera habilitada
- `CameraRecorder` — um FFmpeg por segmento (`-t N`), backoff sem bloquear as demais
- `FfmpegCommand` — argv, sem shell; RTSP usa `-c copy`; `lavfi:` só para testes
- Segmentos em MKV (configurável), default 300 s (`IPCAM_SEGMENT_SECONDS`)
- Metadados em `recordings` com `disk_id` + `relative_path` + codec/resolução (ffprobe)
- Heartbeats em `service_heartbeats` (supervisor usa `camera_id=0`)
- UI: badge gravando, botão Iniciar/Pausar, tabela de segmentos, card no dashboard
- systemd: `deploy/systemd/ipcam-recorder.service` → `User=www-data`
- CLI: `php artisan ipcam:recorder` (`--seconds=` só para testes)

## Testes

`php artisan test --filter='RecorderTest|StorageManagerTest'` — passando (gravação lavfi → `recordings.disk_id`).

## Aceite

| Critério | Resultado |
|---|---|
| FFmpeg via argv, sem shell | OK (teste) |
| Segmento registrado com `disk_id` | OK (teste lavfi) |
| Disco offline/maintenance ignorado | OK (Storage Manager, Fase 3) |
| Recorder independente do Apache | OK (unit systemd sem `Requires=apache2`) |
| Núcleo sem `if fabricante` | OK |
| Gravação nas câmeras 192.168.20.10/11 | **Não habilitada** — VLAN ainda inacessível deste host |

## Como usar

1. Cadastre a câmera e um stream RTSP (ONVIF ou URL manual).
2. Na ficha, clique **Iniciar gravação**.
3. O supervisor assume em ~1 s e grava o primeiro arquivo após `IPCAM_SEGMENT_SECONDS`.
4. Status: `systemctl status ipcam-recorder` e card “Recorder Service” no dashboard.

Teste sem câmera física (somente lab): stream `lavfi:testsrc=size=320x240:rate=5`.

## Operação

```bash
sudo systemctl status ipcam-recorder
sudo journalctl -u ipcam-recorder -f
# Restart do painel NÃO deve interromper:
sudo systemctl restart apache2
```

## Fora desta fase

Monitor de estados compostos: [`docs/FASE-5-RESULTADOS.md`](FASE-5-RESULTADOS.md). Fora da Fase 4: playback, live view, retenção.
