Objetivo: receber televisão TDT localmente com um Raspberry Pi equipado com sintonizador TV HAT DVB-T2 e/ou teclas RTL-SDR.
Teste com 2 ferramentas: dvblast
e mumudvb
.
Nos diretórios conf/dvblast
e conf/mumudvb
estão as configurações dos multiplexes TDT disponíveis em Paris com um endereço de difusão multicast para cada canal.
Primeiro restringiremos o intervalo IP multicast ao loop local para não inundar a rede se os switches não estiverem otimizados para multicast (consulte IGMP Snooping).
ip route add 239.10.10.0/24 dev lo src 127.0.0.1
Então, para verificar as rotas da placa de rede:
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default lan.home 0.0.0.0 UG 202 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
239.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 lo
Nota: o comando route
faz parte do pacote net-tools
no Debian
.
Ou
$ ip route show
default via 192.168.1.1 dev eth0 src 192.168.1.74 metric 202
192.168.1.0/24 dev eth0 proto dhcp scope link src 192.168.1.74 metric 202
239.10.10.0/24 dev lo scope link src 127.0.0.1
Para tornar esta regra persistente:
Debian
crie o arquivo /etc/network/if-up.d/local-multicast
(e torne-o executável) com o seguinte conteúdo: #! /bin/sh
# à mettre dans /etc/network/if-up.d/local-multicast (rendre exécutable)
# le multicast ne sort pas de la boucle locale pour éviter de flooder le réseau
if [ " $IFACE " = " lo " ] ; then
ip route add 239.10.10.0/24 dev lo src 127.0.0.1
fi
CentOS7
crie um arquivo /etc/sysconfig/network-scripts/route-lo
com o seguinte conteúdo: 239.10.10.0/24 via 127.0.0.1 dev lo
então reinicie o serviço de rede
systemctl restart network
A função do dvblast
é demultiplexar o sinal da placa sintonizadora e transmitir um fluxo IP na rede, em rtp
por padrão.
Instalação
apt install dvblast
Verificação
$ dvblast --version
DVBlast 3.4 (release)
mumudvb
é uma evolução do dvblast
Instalação
apt install mumudvb
Adicione o novo usuário _mumudvb
aos grupos video
e plugdev
usermod -a -G video _mumudvb
usermod -a -G plugdev _mumudvb
udp
por padrão. para rtp
use rtp_header
como 1
na configuração.
ffmpeg
é o canivete suíço do audiovisual. Permite transcodificação, análise, geração de arquivos de mídia. Iremos usá-lo para ler um fluxo RTP/UDP e exibi-lo diretamente na saída padrão. No modo de passagem plana.
Instalação
apt install ffmpeg
Verificação
$ ffmpeg 2>&1 | head -1
ffmpeg version 4.3.4-0+deb11u1+rpt3 Copyright (c) 2000-2021 the FFmpeg developers
No diretório systemd
, são fornecidos 2 arquivos de serviço. Vamos copiá-los para o lugar certo:
cp systemd/[email protected] /etc/systemd/system
cp systemd/[email protected] /etc/systemd/system
systemctl daemon-reload
Nota: o caminho dos aplicativos e logs pode precisar ser adaptado.
Para iniciar o streaming de um multiplex, use um dos seguintes comandos de exemplo:
systemctl start mumudvb@0_r1
systemctl enable --now dvblast@1_r15
o parâmetro tem o formato CARD_MUX
:
CARD
o identificador do cartão (0 ... 7)MUX
o identificador multiplex (r1 ... r15)Link: Documentação do Systemd
Podemos verificar se um multiplex é transmitido no loop local com netstat
:
$ netstat -nu
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 127.0.0.1:41809 239.10.10.14:1234 ESTABLISHED
udp 0 0 127.0.0.1:52565 239.10.10.3:1234 ESTABLISHED
udp 0 0 127.0.0.1:39327 239.10.10.2:1234 ESTABLISHED
udp 0 0 127.0.0.1:45600 239.10.10.27:1234 ESTABLISHED
udp 0 0 127.0.0.1:37410 239.10.10.30:1234 ESTABLISHED
Nota: com mumudvb
não há o mesmo resultado netstat...
Por outro lado, a ferramenta iptraf
permite ter uma visão geral do tráfego de rede em uma interface de texto.
apt install iptraf
com ffmpeg
ffmpeg -i rtp://239.10.10.2:1234 -c copy -map 0 rec.ts
ou melhor ainda com multicat
(dependência bitstream
, compila facilmente)
multicat -X @239.10.10.2:1234 /dev/null 2> /dev/null > rec.ts
Descrição dos parâmetros:
-X
: pedimos que o fluxo ts passe pela saída padrão@239.10.10.2:1234
: especifique o grupo multicast no qual deseja se inscrever/dev/null
: não queremos que o fluxo seja gravado no disco2>/dev/null
: ocultamos a saída de erro-u
para adicionar se o fluxo for udp
"bruto" e não rtp
> rec.ts
: redirecionamos o fluxo para um arquivo No caso de uma rede não compatível com multicast e para evitar inundações, pode ser interessante converter o fluxo multicast em unicast. Porém, preste atenção ao volume da rede se muitos clientes se conectarem à origem.
Instalando udpxy
git clone https://github.com/pcherenkov/udpxy
cd udpxy/chipmunk
make
sudo make install
Lançamento manual do serviço:
sudo udpxy -p 80 -c 8
O serviço será executado na porta 80 ( -p
), com no máximo 8 clientes ( -c
).
Inicie via systemd
:
Também aqui está um arquivo de serviço systemd para udpxy.
cp conf/systemd/udpxy.service /etc/systemd/system
systemctl daemon-reload
sudo systemctl enable --now udpxy
Verificando se o serviço está em execução:
$ netstat -an | grep " :80 "
tcp 0 0 0.0.0.0:80 0.0.0.0: * LISTEN
Agora, na nossa rede local poderemos solicitar, em unicast e TCP, via protocolo http, uma solicitação como esta:
vlc http://dvbstream/rtp/239.10.10.2:1234
dvbstream
sendo o ip/host da máquina executando udpxy
/rtp/
ou /udp/
dependendo do protocolo de stream usado pela fonte239.10.10.2:1234
o ip e a porta do grupo multicast de origemAqui está a playlist .m3u completa de todos os canais declarados neste projeto (todos os multiplexes TNT parisienses).
Exemplo de mosaico silencioso com posicionamento de janela 2x2 em tela 1920x1080:
mpv http://dvbstream/rtp/239.10.10.2:1234 --mute=yes --no-border --geometry=960x540+0+0 --deinterlace=yes &
mpv http://dvbstream/rtp/239.10.10.27:1234 --mute=yes --no-border --geometry=960x540+960+0 --deinterlace=yes &
mpv http://dvbstream/rtp/239.10.10.10:1234 --mute=yes --no-border --geometry=960x540+0+540 --deinterlace=yes &
mpv http://dvbstream/rtp/239.10.10.11:1234 --mute=yes --no-border --geometry=960x540+960+540 --deinterlace=yes &
sudo systemctl enable --now dvblast@0_r1
sudo systemctl enable --now dvblast@1_r2
sudo systemctl enable --now dvblast@2_r3
Total: 74,4 Mb/s
sudo systemctl enable --now dvblast@0_r4
sudo systemctl enable --now dvblast@1_r6
sudo systemctl enable --now dvblast@2_r7
Total: 74,4 Mb/s
sudo systemctl enable --now dvblast@0_r9
sudo systemctl enable --now dvblast@0_r15
Total: 50 Mb/s
O diretório /dev/dvb
deve conter pelo menos um adapter
:
$ ll /dev/dvb/
total 0
drwxr-xr-x 2 root root 120 Mar 8 22:41 adapter0
drwxr-xr-x 2 root root 120 Mar 8 22:41 adapter1
drwxr-xr-x 2 root root 100 Mar 8 22:41 adapter2
Visualizando 2 chaves RTL-SDR conectadas via USB:
$ lsusb | grep RTL
Bus 001 Device 004: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Bus 001 Device 005: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T