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
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.
┌─────────────────────────────────────────────────────────────────┐
│ 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?
| Protocolo | Latência | Característica |
|---|---|---|
| SRT | 200 ms – 2 s | Baixa latência, ARQ (retransmissão seletiva), criptografia nativa, ideal para STL. |
| Icecast (Opus/Ogg) | 2 – 8 s | Pull HTTP, simples, escala via relay; sem ARQ, sensível a perda. |
| HLS | 6 – 30 s | Segmentado, 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.
Dimensionamento e premissas de engenharia
Tabela de bitrate Opus
| Bitrate | Uso recomendado | Frame / aplicação |
|---|---|---|
| 64 kbps mono | voice / talk | frame_size=20., signal="voice", application="voip" |
| 96 kbps stereo | rádio falada / pop | frame_size=20., signal="music", application="audio" |
| 128 kbps stereo | música transparente (recomendado) | frame_size=20., signal="music", application="audio" |
| 160 kbps stereo | alta fidelidade / FM premium | frame_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édio | SRT latency | Total 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
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 MbpsPré-requisitos no Windows 11 25H2
PowerShell como Administrador
# Abrir PowerShell como Admin (Win+X → Terminal (Admin))
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine -Force
Get-ExecutionPolicy -ListPlano de energia e suspensão
# 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 totalmenteWindows 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
New-NetFirewallRule -DisplayName "SRT-Liquidsoap-Listener" \
-Direction Inbound -Protocol UDP -LocalPort 9000 \
-Action Allow -Profile AnyNo 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)
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 /statusInstalaçã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)
# 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áriosudo 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 opusExposição da porta UDP do WSL2 para a rede
[wsl2]
networkingMode=mirrored
firewall=true
dnsTunneling=true
autoProxy=true
[experimental]
hostAddressLoopback=truewsl --shutdown
# Reabrir o Ubuntu. Agora a porta UDP 9000 do WSL = porta 9000 do host.Opção B — Build nativo via OPAM no MSYS2
# 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 ffmpegTempo 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
# 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.liqVerificação
liquidsoap --version
liquidsoap --list-plugins | grep -E '(srt|opus|ffmpeg)'
liquidsoap --check 'output.dummy(mksafe(noise()))'Captura de áudio no TX (Windows)
Cadeia recomendada
- Automação / console (PlayoutONE, RadioBOSS, mAirList, ZaraRadio etc.) envia saída para um dispositivo virtual.
- VB-Audio Virtual Cable ou VoiceMeeter Banana recebe o áudio e o expõe como dispositivo de gravação WASAPI.
- FFmpeg dentro do WSL/Docker captura via DirectShow e entrega ao Liquidsoap via pipe ou via
input.ffmpeg.
Listar dispositivos DirectShow
ffmpeg -list_devices true -f dshow -i dummy 2>&1 | findstr "CABLE\|VoiceMeeter"Captura com FFmpeg → stdout (PCM)
@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)
# 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")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.
#!/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âmetro | Valor | Descrição |
|---|---|---|
| mode | listener | TX aguarda conexões dos RXs (callers). |
| latency | 200–800 ms | Jitter buffer; quanto maior, mais robusto a perdas. |
| passphrase | ≥ 10 chars | Chave AES; recomendo 32 chars random. |
| pbkeylen | 16/24/32 | AES-128/192/256 respectivamente. |
| payload_size | 1316 | Padrão SRT; cabe em MTU 1500 sem fragmentar. |
| streamid | string | Identifica o stream; usado para roteamento/auth. |
Serviço Windows (via NSSM)
# 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 LiquidsoapTXConfiguraçã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.
#!/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.aousa WaveOut/WASAPI diretamente. - Para placas profissionais (RME, Focusrite, ASIO): rote a saída do PulseAudio/Icecast local para o ASIO bridge (ex.: FlexASIO + VoiceMeeter).
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.
# 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
.liqcom passphrase em Git. Use variáveis de ambiente ou arquivo separado em/etc/liquidsoap/secrets.liqcom permissão 600. - Telnet do Liquidsoap — sempre bind em
127.0.0.1; nunca em0.0.0.0.
%include "/etc/liquidsoap/secrets.liq"
output.srt(
mode = "listener",
port = 9000,
passphrase = srt_passphrase, # definido em secrets.liq
pbkeylen = 32,
...
)Hardening do sistema operacional
Prioridade e afinidade de processo
# 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
# 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 DisabledExceções no antivírus
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:
# 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 -ForceMonitoramento e observabilidade
Servidor telnet do Liquidsoap
# 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 limpoEndpoint HTTP de status
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
| Sinal | Limiar | Ação |
|---|---|---|
| silence_detected | > 10s | PagerDuty/Telegram imediato — possível perda de fonte. |
| srt_dropped_pct | > 1%/min | Aumentar latency ou investigar rede. |
| cpu_liquidsoap | > 70% sustained | Reduzir bitrate ou processamento DSP. |
| rtt_to_rx | > 2× baseline | Verificar uplink/ISP. |
| process_down | 0 | NSSM restart automático + alerta. |
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).
# 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.
Troubleshooting
| Sintoma | Causa provável | Diagnóstico / fix |
|---|---|---|
| Cortes intermitentes | jitter buffer baixo | Aumentar latency em 100 ms incrementais até estabilizar. Medir RTT com ping. |
| Connection refused | firewall / NAT / porta | Test-NetConnection -ComputerName tx -Port 9000. Verificar port-forward no roteador e regra New-NetFirewallRule. |
| Áudio mudo no RX | sample rate / dispositivo | Confirmar 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 excessivo | Reduzir compression_level do Opus de 10 para 8. Remover compress/normalize se não essenciais. |
| Dessincronia / drift | NTP / frame_size | w32tm /query /status. Garantir mesmo frame_duration (20 ms) em TX e RX. |
| Auth failed (SRT) | passphrase divergente | Comparar bytes — espaços invisíveis e quebras de linha quebram a comparação. Reescrever em ambos os lados. |
| RX não reconecta | DNS cache / TTL | ipconfig /flushdns. Reiniciar serviço Liquidsoap no RX. Reduzir TTL do DNS do TX para 60s. |
Comandos de diagnóstico úteis
# 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 9000Apêndices
A — Glossário
| Termo | Sigla | Definição |
|---|---|---|
| Studio-to-Transmitter Link | STL | Enlace que leva o áudio do estúdio ao transmissor de RF. |
| Secure Reliable Transport | SRT | Protocolo UDP com ARQ, criptografia AES e jitter buffer. |
| Opus | RFC 6716 | Codec de áudio com baixa latência e alta eficiência. |
| Jitter buffer | — | Buffer no receptor que absorve variação de atraso de pacotes. |
| Round-Trip Time | RTT | Tempo de ida e volta de um pacote entre dois pontos. |
| Automatic Repeat Request | ARQ | Mecanismo de retransmissão seletiva de pacotes perdidos. |
| Maximum Transmission Unit | MTU | Tamanho 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:
srt_passphrase = "GERAR_32_CHARS_RANDOM_AQUI"
icecast_password = "outra_senha_forte"
telnet_host = "127.0.0.1"