目標:使用配備 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/秒
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