目标:使用配备 DVB-T2 TV HAT 调谐器和/或 RTL-SDR 键的 Raspberry Pi 在本地接收 DTT 电视。
使用 2 个工具进行测试: dvblast
和mumudvb
。
在conf/dvblast
和conf/mumudvb
目录中是巴黎可用的DTT 多路复用器的配置,每个频道都有一个多播广播地址。
我们首先将多播 IP 范围限制在本地环路,以免在交换机未针对多播进行优化的情况下淹没网络(请参阅 IGMP 侦听)。
ip route add 239.10.10.0/24 dev lo src 127.0.0.1
然后查看网卡路由:
$ 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
注意: route
命令是Debian
下net-tools
包的一部分。
或者
$ 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
要使该规则持久化:
Debian
下创建文件/etc/network/if-up.d/local-multicast
(并使其可执行),内容如下: #! /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
下创建一个文件/etc/sysconfig/network-scripts/route-lo
内容如下: 239.10.10.0/24 via 127.0.0.1 dev lo
然后重启网络服务
systemctl restart network
dvblast
的作用是解复用来自调谐器卡的信号,并在网络上广播 IP 流(默认情况下以rtp
。
设施
apt install dvblast
确认
$ dvblast --version
DVBlast 3.4 (release)
mumudvb
是dvblast
的演变
设施
apt install mumudvb
将新用户_mumudvb
添加到video
和plugdev
组
usermod -a -G video _mumudvb
usermod -a -G plugdev _mumudvb
默认为udp
。对于rtp
请在配置中使用rtp_header
为1
。
ffmpeg
是视听领域的瑞士军刀。它允许转码、分析、生成媒体文件。我们将使用它来读取 rtp/udp 流并将其直接显示在标准输出上。在平坦通过模式下。
设施
apt install ffmpeg
确认
$ ffmpeg 2>&1 | head -1
ffmpeg version 4.3.4-0+deb11u1+rpt3 Copyright (c) 2000-2021 the FFmpeg developers
在systemd
目录中,提供了2个服务文件。让我们将它们复制到正确的位置:
cp systemd/[email protected] /etc/systemd/system
cp systemd/[email protected] /etc/systemd/system
systemctl daemon-reload
注意:应用程序和日志的路径可能需要调整。
要开始流式传输 Multiplex,请使用以下示例命令之一:
systemctl start mumudvb@0_r1
systemctl enable --now dvblast@1_r15
参数的形式为CARD_MUX
:
CARD
卡标识符 (0 ... 7)MUX
多路复用标识符 (r1 ... r15)链接:Systemd 文档
我们可以使用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
注意:使用mumudvb
时,netstat 结果不同...
另一方面, iptraf
工具允许您在文本界面中概览网络流量。
apt install iptraf
使用ffmpeg
ffmpeg -i rtp://239.10.10.2:1234 -c copy -map 0 rec.ts
或者使用multicat
更好( bitstream
依赖,易于编译)
multicat -X @239.10.10.2:1234 /dev/null 2> /dev/null > rec.ts
参数说明:
-X
:我们要求ts流通过标准输出@239.10.10.2:1234
:指定要订阅的多播组/dev/null
:我们不希望将流写入磁盘2>/dev/null
:我们隐藏错误输出-u
添加流是否为“原始” udp
而不是rtp
> rec.ts
:我们将流程重定向到文件在网络不兼容多播的情况下,为了避免泛洪,将多播流转换为单播可能会很有趣。但是,如果有许多客户端连接到源,请注意网络量。
安装udpxy
git clone https://github.com/pcherenkov/udpxy
cd udpxy/chipmunk
make
sudo make install
手动启动服务:
sudo udpxy -p 80 -c 8
该服务将在端口 80 ( -p
) 上运行,最多有 8 个客户端 ( -c
)。
通过systemd
启动:
这里还有 udpxy 的 systemd 服务文件。
cp conf/systemd/udpxy.service /etc/systemd/system
systemctl daemon-reload
sudo systemctl enable --now udpxy
检查服务是否正在运行:
$ netstat -an | grep " :80 "
tcp 0 0 0.0.0.0:80 0.0.0.0: * LISTEN
现在,在我们的本地网络上,我们将能够通过 http 协议以单播和 TCP 方式发出如下请求:
vlc http://dvbstream/rtp/239.10.10.2:1234
dvbstream
是运行udpxy
机器的 IP/主机/rtp/
或/udp/
取决于源使用的流协议239.10.10.2:1234
源组播组的ip和端口这是此项目中声明的所有频道(所有巴黎 TNT 多路复用器)的完整 .m3u 播放列表。
在 1920x1080 屏幕上放置 2x2 窗口的无声马赛克示例:
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
总计: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
总计:74.4 Mb/秒
sudo systemctl enable --now dvblast@0_r9
sudo systemctl enable --now dvblast@0_r15
总计:50 Mb/s
/dev/dvb
目录必须至少包含一个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
查看通过 USB 连接的 2 个 RTL-SDR 密钥:
$ 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