Manual STL · Liquidsoap · Opus · SRT

Engenharia de Broadcast · STL 24×7

Manual técnico: Liquidsoap + Opus + SRT em Windows 11

Guia completo de implantação de um link studio-to-transmitter (STL) de áudio em operação contínua, com codificação Opus e transporte SRT criptografado, em topologia 1 transmissor → N receptores, sobre Windows 11 x64 25H2.

Codec

Opus 64–160 kbps

Transporte

SRT AES-256

Latência

200–800 ms

SO

Windows 11 25H2

01

Visão geral e arquitetura

Um STL (Studio-to-Transmitter Link) entrega o áudio do estúdio até o(s) transmissor(es) com qualidade broadcast, disponibilidade 24×7 e latência controlada. Esta arquitetura usa Liquidsoap como motor de áudio (ingest, processamento, codificação), Opus como codec (eficiência espectral superior a MP3/AAC-LC nas mesmas taxas) e SRT (Secure Reliable Transport) como camada de rede com recuperação de pacotes, criptografia AES-256 e jitter buffer adaptativo.

Topologia 1 TX → N RXs

O TX opera como SRT listener em uma porta UDP pública (ex.: 9000). Cada RX abre uma conexão como SRT caller, autenticando via passphrase e identificando-se por streamid. Não há multicast: cada RX consome banda independente no uplink do TX. Para cenários de NAT duplo (raros), usa-se modo rendezvous.

Fluxo de sinalascii
┌─────────────────────────────────────────────────────────────────┐
│                          ESTÚDIO (TX)                            │
│                                                                  │
│  Console / Automação → VB-Cable / VoiceMeeter                    │
│                              │                                   │
│                              ▼                                   │
│                     ┌──────────────────┐                         │
│                     │   Liquidsoap TX  │  normalize → compress   │
│                     │   (WSL2/Docker)  │  → limit → Opus 128k    │
│                     └────────┬─────────┘                         │
│                              │ SRT listener :9000 (AES-256)      │
└──────────────────────────────┼───────────────────────────────────┘
                               │
                  ┌────────────┼────────────┐    Internet pública
                  │            │            │    (UDP, NAT/Firewall)
                  ▼            ▼            ▼
        ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
        │  RX-A       │ │  RX-B       │ │  RX-N       │
        │ Liquidsoap  │ │ Liquidsoap  │ │ Liquidsoap  │
        │ SRT caller  │ │ SRT caller  │ │ SRT caller  │
        │     │       │ │     │       │ │     │       │
        │     ▼       │ │     ▼       │ │     ▼       │
        │ Placa áudio │ │ Icecast LAN │ │ AES/EBU out │
        └─────────────┘ └─────────────┘ └─────────────┘

Por que SRT em vez de Icecast/HLS?

ProtocoloLatênciaCaracterística
SRT200 ms – 2 sBaixa latência, ARQ (retransmissão seletiva), criptografia nativa, ideal para STL.
Icecast (Opus/Ogg)2 – 8 sPull HTTP, simples, escala via relay; sem ARQ, sensível a perda.
HLS6 – 30 sSegmentado, escala via CDN; latência inviável para STL profissional.

Por que Opus?

Opus (RFC 6716) oferece transparência perceptual a partir de 96 kbps estéreo, latência algorítmica mínima (5–22,5 ms) e adaptação contínua de bitrate. Para broadcast musical recomenda-se application="audio" e signal="music" a 128 kbps estéreo; voz pode operar com qualidade ampla em 48–64 kbps mono.

02

Dimensionamento e premissas de engenharia

Tabela de bitrate Opus

BitrateUso recomendadoFrame / aplicação
64 kbps monovoice / talkframe_size=20., signal="voice", application="voip"
96 kbps stereorádio falada / popframe_size=20., signal="music", application="audio"
128 kbps stereomúsica transparente (recomendado)frame_size=20., signal="music", application="audio"
160 kbps stereoalta fidelidade / FM premiumframe_size=20., complexity=10

Latência alvo

Latência total = latência de codificação (~22 ms) + jitter buffer SRT (latency=) + buffer de saída. Regra prática: latency = max(RTT × 4, 200 ms). Valores típicos:

RTT médioSRT latencyTotal estimado
10 ms (LAN/MPLS)120 ms~150 ms ponta a ponta
30 ms (regional)200 ms~250 ms ponta a ponta
80 ms (nacional)400 ms~450 ms ponta a ponta
200 ms (internacional)800 ms~850 ms ponta a ponta

Cálculo de banda no uplink do TX

text
Banda_uplink = bitrate_opus × overhead_srt × N_RXs

Onde:
  overhead_srt ≈ 1.15  (cabeçalhos SRT + UDP + IP)
  oheadbw      = 25%   (margem para retransmissão ARQ — padrão SRT)

Exemplo: 128 kbps × 1.15 × 10 RXs = 1.472 Mbps mínimo
Com oheadbw 25%:                    ≈ 1.84 Mbps recomendado
Provisione +30% de folga:           ≈ 2.4 Mbps
03

Pré-requisitos no Windows 11 25H2

PowerShell como Administrador

Configurar política de execuçãopowershell
# Abrir PowerShell como Admin (Win+X → Terminal (Admin))
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine -Force
Get-ExecutionPolicy -List

Plano de energia e suspensão

powershell
# Ativar plano "Alto desempenho"
powercfg -setactive SCHEME_MIN

# Nunca desligar display nem suspender (AC + DC)
powercfg -change -monitor-timeout-ac 0
powercfg -change -monitor-timeout-dc 0
powercfg -change -standby-timeout-ac 0
powercfg -change -standby-timeout-dc 0
powercfg -change -hibernate-timeout-ac 0
powercfg -h off  # desabilita hibernação totalmente

Windows Update — janelas de manutenção

Configure horário ativo amplo para evitar reinício durante a operação: Configurações → Windows Update → Opções avançadas → Horário ativo (ex.: 04:00 – 03:00). Em produção crítica, considere pausar atualizações por 5 semanas e validar patches em ambiente espelho antes de aplicar no TX.

Firewall e roteador

Liberar UDP 9000 inbound (TX)powershell
New-NetFirewallRule -DisplayName "SRT-Liquidsoap-Listener" \
  -Direction Inbound -Protocol UDP -LocalPort 9000 \
  -Action Allow -Profile Any

No roteador de borda: encaminhar UDP/9000 para o IP interno do TX (port-forwarding). Se o TX estiver atrás de CGNAT, contratar IP público dedicado ou usar VPS intermediário como SRT relay.

Sincronização de horário (NTP)

powershell
w32tm /config /syncfromflags:manual /manualpeerlist:"a.st1.ntp.br,b.st1.ntp.br,pool.ntp.org" /reliable:yes /update
Restart-Service w32time
w32tm /resync /force
w32tm /query /status
04

Instalação do Liquidsoap no Windows

O Liquidsoap não tem build nativo oficial para Windows. Três caminhos viáveis, em ordem de recomendação:

Opção A — WSL2 + Ubuntu 24.04 (recomendada)

PowerShell (Admin)powershell
# Instalar WSL2 com Ubuntu 24.04
wsl --install -d Ubuntu-24.04
wsl --set-default-version 2
wsl --update

# Reiniciar e abrir o Ubuntu para criar usuário
Dentro do Ubuntu (WSL2)bash
sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:savonet/liquidsoap-master
sudo apt update
sudo apt install -y liquidsoap liquidsoap-plugin-all ffmpeg

liquidsoap --version
# Deve retornar 2.2.x ou superior, com suporte a srt e opus

Exposição da porta UDP do WSL2 para a rede

%UserProfile%\.wslconfigini
[wsl2]
networkingMode=mirrored
firewall=true
dnsTunneling=true
autoProxy=true

[experimental]
hostAddressLoopback=true
powershell
wsl --shutdown
# Reabrir o Ubuntu. Agora a porta UDP 9000 do WSL = porta 9000 do host.

Opção B — Build nativo via OPAM no MSYS2

powershell
# Baixar e instalar MSYS2: https://www.msys2.org/
# Abrir "MSYS2 MINGW64" e executar:
pacman -Syu
pacman -S mingw-w64-x86_64-{toolchain,opam,pkg-config,opus,ffmpeg}
opam init --disable-sandboxing
opam switch create 5.1.1
eval $(opam env)
opam install -y liquidsoap srt opus ffmpeg

Tempo de build: ~40 min em hardware moderno. Vantagem: serviço Windows nativo sem camada WSL. Desvantagem: manutenção complexa e plugins menos completos.

Opção C — Docker Desktop

Docker (Windows)powershell
# Instalar Docker Desktop, habilitar WSL2 backend
docker pull savonet/liquidsoap:rolling-release-2.2.x

# Rodar TX expondo UDP/9000
docker run -d --name liquidsoap-tx --restart=unless-stopped \
  -p 9000:9000/udp \
  -v C:\liquidsoap:/etc/liquidsoap \
  savonet/liquidsoap:rolling-release-2.2.x \
  /etc/liquidsoap/tx.liq

Verificação

bash
liquidsoap --version
liquidsoap --list-plugins | grep -E '(srt|opus|ffmpeg)'
liquidsoap --check 'output.dummy(mksafe(noise()))'
05

Captura de áudio no TX (Windows)

Cadeia recomendada

  1. Automação / console (PlayoutONE, RadioBOSS, mAirList, ZaraRadio etc.) envia saída para um dispositivo virtual.
  2. VB-Audio Virtual Cable ou VoiceMeeter Banana recebe o áudio e o expõe como dispositivo de gravação WASAPI.
  3. FFmpeg dentro do WSL/Docker captura via DirectShow e entrega ao Liquidsoap via pipe ou via input.ffmpeg.

Listar dispositivos DirectShow

powershell
ffmpeg -list_devices true -f dshow -i dummy 2>&1 | findstr "CABLE\|VoiceMeeter"

Captura com FFmpeg → stdout (PCM)

captura.bat (host Windows)powershell
@echo off
ffmpeg -hide_banner -loglevel warning ^
  -f dshow -audio_buffer_size 50 ^
  -i audio="CABLE Output (VB-Audio Virtual Cable)" ^
  -ac 2 -ar 48000 -f s16le -acodec pcm_s16le -

Ingest pelo Liquidsoap (dentro do WSL/Docker)

liquidsoap
# Via input.ffmpeg direto (mais simples, requer ffmpeg na mesma máquina)
src = input.ffmpeg(
  format = "dshow",
  "audio=CABLE Output (VB-Audio Virtual Cable)"
)

# Alternativa: via pipe TCP (se o WSL não enxerga DirectShow)
src = input.harbor("live", port=8000, password="mudeisso")
06

Configuração do TX (Liquidsoap, SRT listener)

Arquivo tx.liq de referência: ingest WASAPI/Virtual Cable, processamento DSP leve, fallback de silêncio com jingle, codificação Opus 128 kbps estéreo, saída SRT listener AES-256.

/etc/liquidsoap/tx.liqliquidsoap
#!/usr/bin/liquidsoap

# ========== Configurações globais ==========
settings.frame.audio.samplerate := 48000
settings.frame.audio.channels   := 2
settings.log.file               := true
settings.log.file.path          := "/var/log/liquidsoap/tx.log"
settings.log.stdout             := true
settings.log.level              := 3
settings.server.telnet          := true
settings.server.telnet.bind_addr:= "127.0.0.1"
settings.server.telnet.port     := 1234

# ========== Fonte principal (ingest) ==========
live = input.ffmpeg(
  format = "dshow",
  "audio=CABLE Output (VB-Audio Virtual Cable)"
)

# Detecção de silêncio: se >5s sem áudio, marca como inválido
live = blank.strip(max_blank=5., threshold=-50., live)

# ========== Fallback de emergência ==========
emergency = playlist(
  reload_mode = "watch",
  mode = "randomize",
  "/etc/liquidsoap/emergency"
)
emergency = mksafe(emergency)

# Fallback: live → emergency → silence
source = fallback(
  track_sensitive = false,
  [live, emergency, blank()]
)

# ========== Processamento DSP ==========
source = normalize(source, target=-14., window=0.5, gain_min=-12., gain_max=12.)
source = compress(source, ratio=3., threshold=-18., attack=10., release=200.)
source = limit(source, threshold=-1., attack=5., release=50.)

# ========== Saída SRT (listener, AES-256) ==========
output.srt(
  mode      = "listener",
  port      = 9000,
  bind_address = "0.0.0.0",
  passphrase   = "TROQUE_ESTA_SENHA_FORTE_32CHARS",
  pbkeylen     = 32,        # 32 bytes = AES-256
  latency      = 400,       # ms — ajustar conforme RTT
  streamid     = "tx/main",
  payload_size = 1316,      # MTU-safe para SRT/UDP
  messageapi   = false,     # live mode
  %ffmpeg(
    format  = "mpegts",
    %audio(
      codec   = "libopus",
      b       = "128k",
      ac      = 2,
      ar      = 48000,
      vbr     = "constrained",
      compression_level = 10,
      frame_duration    = 20,
      application       = "audio"
    )
  ),
  source
)

Parâmetros SRT críticos

ParâmetroValorDescrição
modelistenerTX aguarda conexões dos RXs (callers).
latency200–800 msJitter buffer; quanto maior, mais robusto a perdas.
passphrase≥ 10 charsChave AES; recomendo 32 chars random.
pbkeylen16/24/32AES-128/192/256 respectivamente.
payload_size1316Padrão SRT; cabe em MTU 1500 sem fragmentar.
streamidstringIdentifica o stream; usado para roteamento/auth.

Serviço Windows (via NSSM)

Instalar NSSM e criar serviçopowershell
# Baixar NSSM: https://nssm.cc/download
# Extrair para C:\nssm\

C:\nssm\nssm.exe install LiquidsoapTX
# Application: C:\Windows\System32\wsl.exe
# Arguments:   -d Ubuntu-24.04 -- liquidsoap /etc/liquidsoap/tx.liq
# Startup directory: C:\
# I/O tab → redirect stdout/stderr para C:\logs\tx-stdout.log e tx-stderr.log
# Details tab → Startup type: Automatic
# Process tab → Priority: High

C:\nssm\nssm.exe start LiquidsoapTX
07

Configuração dos RXs (Liquidsoap, SRT caller)

Cada RX abre uma conexão SRT caller para o TX, decodifica Opus e entrega o áudio ao destino: placa de som física, Icecast local para redistribuição interna, ou saída AES/EBU via interface profissional.

/etc/liquidsoap/rx.liqliquidsoap
#!/usr/bin/liquidsoap

settings.frame.audio.samplerate := 48000
settings.frame.audio.channels   := 2
settings.log.file               := true
settings.log.file.path          := "/var/log/liquidsoap/rx.log"
settings.server.telnet          := true
settings.server.telnet.port     := 1234

# ========== Input SRT (caller para o TX) ==========
srt_input = input.srt(
  mode      = "caller",
  host      = "tx.minharadio.com.br",   # IP ou hostname do TX
  port      = 9000,
  passphrase   = "TROQUE_ESTA_SENHA_FORTE_32CHARS",
  pbkeylen     = 32,
  latency      = 400,
  streamid     = "rx/site-a",
  payload_size = 1316,
  max          = 10.,                   # buffer interno em segundos
  on_connect   = fun () -> log("SRT conectado ao TX"),
  on_disconnect= fun () -> log("SRT desconectado — tentando reconectar"),
  content_type = "application/ffmpeg;format=mpegts"
)

# ========== Fallback local (música de emergência) ==========
backup = playlist(
  reload_mode = "watch",
  mode = "randomize",
  "/etc/liquidsoap/backup"
)
backup = mksafe(backup)

source = fallback(
  track_sensitive = false,
  [srt_input, backup, blank()]
)

# ========== Saídas ==========

# (1) Placa de som física (driver ALSA dentro do WSL via PulseAudio, ou ao no nativo)
output.ao(id="placa_principal", fallible=true, source)

# (2) Redistribuição via Icecast local para a LAN da emissora
output.icecast(
  %opus(bitrate=128, channels=2, signal="music", application="audio"),
  host = "127.0.0.1",
  port = 8000,
  password = "hackme",
  mount = "/live.opus",
  name  = "STL Local Relay",
  source
)

Considerações de saída em Windows

  • WSL2: áudio via PulseAudio bridge ou via FFmpeg pipe de volta para o host (DirectShow não tem driver de saída fácil dentro do WSL).
  • Nativo (Opção B): output.ao usa WaveOut/WASAPI diretamente.
  • Para placas profissionais (RME, Focusrite, ASIO): rote a saída do PulseAudio/Icecast local para o ASIO bridge (ex.: FlexASIO + VoiceMeeter).
08

Segurança e criptografia

Criptografia SRT

SRT implementa AES em modo CTR com chave derivada da passphrase via PBKDF2. Sempre use pbkeylen=32 (AES-256) em produção. Passphrases fracas ou compartilhadas comprometem todos os RXs simultaneamente.

Gerar passphrase fortepowershell
# 32 bytes random em base64
[Convert]::ToBase64String((1..24 | ForEach-Object {Get-Random -Maximum 256}))

Boas práticas

  • streamid único por RX — facilita auditoria de quem está conectado, possibilita revogação seletiva.
  • Firewall restritivo — quando os RXs têm IPs fixos, restrinja UDP/9000 inbound apenas a esses IPs.
  • Rotação de passphrase — a cada 90 dias, ou imediatamente após desligamento de qualquer RX.
  • Gestão de credenciais — nunca versione .liq com passphrase em Git. Use variáveis de ambiente ou arquivo separado em /etc/liquidsoap/secrets.liq com permissão 600.
  • Telnet do Liquidsoap — sempre bind em 127.0.0.1; nunca em 0.0.0.0.
Carregar segredo de arquivo separadoliquidsoap
%include "/etc/liquidsoap/secrets.liq"

output.srt(
  mode = "listener",
  port = 9000,
  passphrase = srt_passphrase,   # definido em secrets.liq
  pbkeylen   = 32,
  ...
)
09

Hardening do sistema operacional

Prioridade e afinidade de processo

powershell
# Definir prioridade Alta no NSSM (Properties → Process tab → Priority: High)
# Ou via PowerShell em tempo de execução:
$p = Get-Process liquidsoap -ErrorAction SilentlyContinue
if ($p) {
  $p.PriorityClass = 'High'
  $p.ProcessorAffinity = 0x0C   # CPUs 2 e 3 dedicadas (máscara binária)
}

Desabilitar serviços não essenciais

powershell
# Game Mode
Set-ItemProperty -Path "HKCU:\Software\Microsoft\GameBar" -Name "AllowAutoGameMode" -Value 0
Set-ItemProperty -Path "HKCU:\Software\Microsoft\GameBar" -Name "AutoGameModeEnabled" -Value 0

# Notificações
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\PushNotifications" -Name "ToastEnabled" -Value 0

# SysMain (Superfetch) — pode causar picos de I/O
Stop-Service SysMain -Force; Set-Service SysMain -StartupType Disabled

# Telemetria
Stop-Service DiagTrack -Force; Set-Service DiagTrack -StartupType Disabled

Exceções no antivírus

powershell
Add-MpPreference -ExclusionPath "C:\Program Files\WSL"
Add-MpPreference -ExclusionPath "\\wsl$\Ubuntu-24.04\usr\bin\liquidsoap"
Add-MpPreference -ExclusionPath "C:\liquidsoap"
Add-MpPreference -ExclusionProcess "liquidsoap.exe"
Add-MpPreference -ExclusionProcess "wsl.exe"

UPS e shutdown gracioso

UPS dimensionado para no mínimo 15 min de autonomia. Configure o software do UPS (APC PowerChute, Eaton IPM) para executar um script de shutdown que envie shutdown via telnet do Liquidsoap antes do power-off, garantindo flush dos buffers e log limpo:

C:\\scripts\\ups-shutdown.ps1powershell
# Avisa o Liquidsoap para encerrar limpo
$tcp = New-Object System.Net.Sockets.TcpClient('127.0.0.1', 1234)
$stream = $tcp.GetStream()
$writer = New-Object System.IO.StreamWriter($stream)
$writer.WriteLine('shutdown')
$writer.Flush()
Start-Sleep -Seconds 3
$tcp.Close()

Stop-Service LiquidsoapTX
Start-Sleep -Seconds 5
Stop-Computer -Force
10

Monitoramento e observabilidade

Servidor telnet do Liquidsoap

bash
# Conectar via telnet local
echo "uptime" | nc 127.0.0.1 1234
echo "list"   | nc 127.0.0.1 1234
echo "var.list" | nc 127.0.0.1 1234

# Comandos úteis:
#   uptime              — tempo desde o start
#   request.alive       — fontes ativas
#   <source>.skip       — pula faixa
#   <source>.remaining  — tempo restante
#   shutdown            — encerra limpo

Endpoint HTTP de status

Adicionar ao tx.liqliquidsoap
harbor.http.register(port=8001, method="GET", "/status", fun (_, _) -> begin
  status = json.stringify(payload = [
    ("uptime",     string_of_seconds(time() - startup_time)),
    ("source",     source.id(live)),
    ("is_ready",   "#{source.is_ready(live)}"),
    ("clients",    "#{srt.stats(srt_out).accepted_sockets}")
  ])
  http.response(
    code = 200,
    headers = [("Content-Type", "application/json")],
    data = status
  )
end)

Métricas para Prometheus

  • windows_exporter no host — CPU, RAM, disco, rede, ProcessV2 (filtre liquidsoap).
  • srt-stats-exporter ou parser do JSON acima → métricas customizadas (RTT, dropped packets, bitrate efetivo).
  • Painel Grafana com: RTT médio por RX, bitrate de saída, contagem de retransmissões, % de uptime últimas 24h.

Alertas mínimos

SinalLimiarAção
silence_detected> 10sPagerDuty/Telegram imediato — possível perda de fonte.
srt_dropped_pct> 1%/minAumentar latency ou investigar rede.
cpu_liquidsoap> 70% sustainedReduzir bitrate ou processamento DSP.
rtt_to_rx> 2× baselineVerificar uplink/ISP.
process_down0NSSM restart automático + alerta.
11

Failover e alta disponibilidade

Topologia ativa/standby

Dois TXs idênticos (TX-A primário e TX-B standby) ingerindo a mesma fonte de áudio. Os RXs usam DNS com TTL baixo (60 s) ou IP virtual (VIP) gerido por heartbeat. Quando o monitor detecta perda do TX-A, atualiza o DNS/VIP para o TX-B; os RXs reconectam automaticamente (SRT caller tenta reconexão indefinida).

C:\\scripts\\heartbeat.ps1 (rodando no TX-B)powershell
# Pinga o TX-A a cada 10s; após 3 falhas consecutivas, promove TX-B
$primary = "tx-a.minharadio.com.br"
$failures = 0
$threshold = 3

while ($true) {
  if (Test-Connection -ComputerName $primary -Count 1 -Quiet -TimeoutSeconds 2) {
    $failures = 0
  } else {
    $failures++
    if ($failures -ge $threshold) {
      Write-Host "[$(Get-Date)] Promovendo TX-B"
      # Atualizar DNS via API (Cloudflare, Route53, etc.)
      Invoke-RestMethod -Uri $env:DNS_API -Method PATCH \
        -Headers @{Authorization="Bearer $env:DNS_TOKEN"} \
        -Body (@{content=$env:TX_B_IP} | ConvertTo-Json)
      $failures = 0
      Start-Sleep -Seconds 120  # cooldown
    }
  }
  Start-Sleep -Seconds 10
}

Fallback no RX

Independente do failover de TX, todo RX deve ter playlist local de emergência (ver Seção 07). Sequência de prioridade: SRT_live → playlist_emergency → silence.

12

Troubleshooting

SintomaCausa provávelDiagnóstico / fix
Cortes intermitentesjitter buffer baixoAumentar latency em 100 ms incrementais até estabilizar. Medir RTT com ping.
Connection refusedfirewall / NAT / portaTest-NetConnection -ComputerName tx -Port 9000. Verificar port-forward no roteador e regra New-NetFirewallRule.
Áudio mudo no RXsample rate / dispositivoConfirmar 48000 Hz em toda a cadeia. ffprobe no stream SRT recebido. Trocar output.ao por output.ffmpeg com device explícito.
CPU acima de 70%bitrate ou DSP excessivoReduzir compression_level do Opus de 10 para 8. Remover compress/normalize se não essenciais.
Dessincronia / driftNTP / frame_sizew32tm /query /status. Garantir mesmo frame_duration (20 ms) em TX e RX.
Auth failed (SRT)passphrase divergenteComparar bytes — espaços invisíveis e quebras de linha quebram a comparação. Reescrever em ambos os lados.
RX não reconectaDNS cache / TTLipconfig /flushdns. Reiniciar serviço Liquidsoap no RX. Reduzir TTL do DNS do TX para 60s.

Comandos de diagnóstico úteis

powershell
# Listar conexões UDP na porta SRT
netstat -an | findstr ":9000"

# Testar SRT isoladamente (sem Liquidsoap)
# No TX:
srt-live-transmit -t:5 srt://:9000 file://con

# No RX:
srt-live-transmit srt://tx.minharadio.com.br:9000 file://con

# Inspecionar stream
ffprobe -hide_banner -i "srt://tx.minharadio.com.br:9000?streamid=rx/debug&passphrase=..."

# Capturar tráfego para análise (Wireshark)
pktmon start --capture --pkt-size 0 -p UDP --port 9000
13

Apêndices

A — Glossário

TermoSiglaDefinição
Studio-to-Transmitter LinkSTLEnlace que leva o áudio do estúdio ao transmissor de RF.
Secure Reliable TransportSRTProtocolo UDP com ARQ, criptografia AES e jitter buffer.
OpusRFC 6716Codec de áudio com baixa latência e alta eficiência.
Jitter bufferBuffer no receptor que absorve variação de atraso de pacotes.
Round-Trip TimeRTTTempo de ida e volta de um pacote entre dois pontos.
Automatic Repeat RequestARQMecanismo de retransmissão seletiva de pacotes perdidos.
Maximum Transmission UnitMTUTamanho máximo do pacote IP sem fragmentação (≈1500).

B — Configs prontas

Os arquivos tx.liq e rx.liq das Seções 06 e 07 são base de produção. Mantenha secrets.liq separado, fora do Git:

/etc/liquidsoap/secrets.liq (chmod 600)liquidsoap
srt_passphrase = "GERAR_32_CHARS_RANDOM_AQUI"
icecast_password = "outra_senha_forte"
telnet_host = "127.0.0.1"

C — Checklist de comissionamento

Checklist0/20

D — Referências