{{ $camera->name }}

@can('manage-cameras')
@csrf
@csrf
Gravações Ao vivo Editar
@csrf @method('DELETE')
@endcan
@if (session('status'))
{{ session('status') }}
@endif @if (session('error'))
{{ session('error') }}
@endif
Fabricante
{{ $camera->manufacturer?->name ?? '—' }}
Modelo
{{ $camera->model?->name ?? '—' }}
Host
{{ $camera->host }}
Localização
{{ $camera->location ?? '—' }}
ONVIF / RTSP
{{ $camera->onvif_port }} / {{ $camera->rtsp_port }}
Protocolo
{{ $camera->primary_protocol }}
Gravação / Live
{{ $camera->record_stream_role }} / {{ $camera->live_stream_role }}
Status / Gravação
{{ $camera->status }} · {{ $camera->recording_enabled ? 'habilitada' : 'desabilitada' }} · {{ $camera->recorder_state }}
Último segmento
{{ $camera->last_segment_at?->timezone(config('app.timezone'))?->format('d/m/Y H:i:s') ?? '—' }}
@if ($camera->health_headline)
{{ $camera->health_headline }}
Quedas (offline): {{ $healthStats['drops'] }} · tempo acumulado sem gravação: {{ \App\Support\Duration::human($healthStats['no_recording_seconds']) }}
@endif @if ($camera->recorder_error)
{{ $camera->recorder_error }}
@endif

Streams

@forelse ($camera->streams as $stream)
{{ $stream->role }} · origem {{ $stream->source }} @if ($stream->codec)
{{ $stream->codec }} {{ $stream->width }}×{{ $stream->height }} @ {{ $stream->fps }} fps @if ($stream->bitrate_kbps) · {{ $stream->bitrate_kbps }} kbps @endif @if ($stream->has_audio) · áudio {{ $stream->audio_codec }} @else · sem áudio @endif
@endif @if ($stream->redactedUrl())
{{ $stream->redactedUrl() }}
@endif @if ($stream->probed_at)
Último probe: {{ $stream->probed_at->timezone(config('app.timezone'))->format('d/m/Y H:i:s') }}
@endif
@empty

Nenhum stream cadastrado. Use “Descobrir ONVIF” ou informe a URL RTSP manual na edição.

@endforelse

Segmentos recentes

@forelse ($camera->recordings as $rec) @empty @endforelse
Início Fim Disco Tamanho Codec
{{ $rec->started_at?->timezone(config('app.timezone'))->format('d/m H:i:s') }} {{ $rec->ended_at?->timezone(config('app.timezone'))->format('H:i:s') ?? '—' }} {{ $rec->disk?->label ?? $rec->disk_id }} {{ \App\Support\Bytes::format($rec->size_bytes) }} {{ $rec->codec }} {{ $rec->width }}×{{ $rec->height }}
Nenhum segmento ainda. Habilite a gravação e aguarde o Recorder.
@if ($camera->healthEvents->isNotEmpty())

Eventos de saúde

    @foreach ($camera->healthEvents as $ev)
  • {{ \App\Monitor\HealthEvaluator::labels()[$ev->dimension] ?? $ev->dimension }} · @if ($ev->isOpen()) aberto @endif {{ $ev->started_at?->timezone(config('app.timezone'))->format('d/m H:i:s') }} · {{ \App\Support\Duration::human($ev->durationSeconds()) }}
  • @endforeach
@endif @if ($camera->capabilities->isNotEmpty()) @php $cap = $camera->capabilities->sortByDesc('discovered_at')->first(); @endphp

Última descoberta ONVIF

Fonte: {{ $cap->source }} · {{ $cap->discovered_at?->timezone(config('app.timezone'))?->format('d/m/Y H:i:s') }}
@if (!empty($cap->capabilities['summary']))
Media: {{ !empty($cap->capabilities['summary']['media']) ? 'sim' : 'não' }} · Eventos: {{ !empty($cap->capabilities['summary']['events']) ? 'sim' : 'não' }} · PTZ: {{ !empty($cap->capabilities['summary']['ptz']) ? 'sim' : 'não' }}
@endif @if (!empty($cap->capabilities['firmware']))
Firmware: {{ $cap->capabilities['firmware'] }}
@endif
@endif