DVB-T

出自 ArchWiki

DVB-T 是用于传输地面数字视频广播的标准,广泛应用于非洲、亚洲、澳大利亚和欧洲的大部分地区。可以使用多种不同的硬件设置来接收 DVB-T,但本文将重点介绍基于 RTL2832U 芯片组的 DVB-T USB 加密狗(它们也很受欢迎,作为使用 RTL-SDR 的廉价软件定义无线电)。

驱动

正在使用的主要驱动是 dvb_usb_rtl28xxu,它存在于最新的内核中。如果它没有加载,请手动加载

# modprobe dvb_usb_rtl28xxu

您可能还需要加载 rtl2832rtl2830

# modprobe rtl2830
# modprobe rtl2832
注意: 如果您安装了 RTL-SDR,请注意它与此驱动程序冲突,因此会将其列入黑名单。在加载驱动程序之前,请务必删除任何必要的黑名单。黑名单文件的默认位置在 /etc/modprobe.d/rtlsdr.conf

插入设备后,dmesg 的输出应显示如下内容

[ 4009.326338] usb 7-5: new high-speed USB device number 4 using ehci-pci
[ 4009.466712] usb 7-5: dvb_usb_v2: found a 'Realtek RTL2832U reference design' in warm state
[ 4009.531594] usb 7-5: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer
[ 4009.531613] DVB: registering new adapter (Realtek RTL2832U reference design)
[ 4009.534554] usb 7-5: DVB: registering adapter 0 frontend 0 (Realtek RTL2832 (DVB-T))...
[ 4009.534627] r820t 4-001a: creating new instance
[ 4009.546177] r820t 4-001a: Rafael Micro r820t successfully identified
[ 4009.552681] Registered IR keymap rc-empty
[ 4009.552783] input: Realtek RTL2832U reference design as /devices/pci0000:00/0000:00:1d.7/usb7/7-5/rc/rc1/input20
[ 4009.552854] rc1: Realtek RTL2832U reference design as /devices/pci0000:00/0000:00:1d.7/usb7/7-5/rc/rc1
[ 4009.553275] input: MCE IR Keyboard/Mouse (dvb_usb_rtl28xxu) as /devices/virtual/input/input21
[ 4009.554466] rc rc1: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0
[ 4009.554474] usb 7-5: dvb_usb_v2: schedule remote query interval to 400 msecs
[ 4009.565930] usb 7-5: dvb_usb_v2: 'Realtek RTL2832U reference design' successfully initialized and connected
注意: 在这种情况下,我们看到加密狗具有 R820T 调谐器,但您可能会遇到其他几种流行的调谐器。另请注意已识别的 IR 传感器设备,如果配置正确,可以与设备遥控器一起使用。有关更多信息,请参见 LIRC

此外,您现在应该在 /dev/dvb/adapter0 下看到适配器设备。某些卡需要额外的固件,这些固件由于各种原因而未分发。通常,您会在 dmesg 中找到有关此的明确消息。使用您喜欢的搜索引擎查找您看到的文件名,一旦您拥有它们,请将所需的固件放入 /usr/lib/firmware 中。可能在 AUR 中存在一个软件包。

实用程序

各种 DVB 实用程序可以在 linuxtv-dvb-appsAUR 软件包中找到。

扫描

w_scan_cppAUR 允许自动扫描频道,无需配置。安装它,然后发出

# w_scan_cpp -ft -c [country_code] --output-mplayer > ~/channels.conf

如果您不知道您的国家代码,请输入以下内容以获取代码列表。

# w_scan_cpp -c "?"

该应用程序现在提供帮助。使用 w_scan_cpp --help 获取更多信息。

更多高级扫描选项可以在 DVB-S#扫描频道 下找到。

w_scan_cpp 无法找到所有预期的频道时,您可以尝试 w_scan2AUR。它是原始 w_scan 的一个分支,可以在 GitHub 上找到。

客户端

另请参阅 如何在播放视频/电视时禁用屏幕保护程序,通过使用配置文件或在播放器启动前后使用 xset 命令来启用/禁用它。如果您安装了 xscreensaver,那么您将需要使用 xscreensaver-command 而不是 xset 从命令行激活/停用屏幕保护程序。

Kaffeine

Kaffeine 在 Wayland 上无法工作。在 X11 上,DVB-T 在 Kaffeine 中开箱即用,包括多台 DVB-T 设备的管理、频道调谐、频道选择、EPG 和录制。不需要外部播放列表生成。可以同时使用多台 DVB-T 设备(例如,在观看另一个多路复用时从一个多路复用录制)。许多单调谐器 DVB-T 设备甚至可以提供两个不同的电视频道,只要它们共享相同的多路复用;此功能在 Kaffeine 中也很容易获得。

Smplayer

Smplayer 可以通过 tvheadend 播放 DVB-T

VLC

使用 VLC 观看 DVB-T 频道的最简单方法是首先生成播放列表

$ w_scan_cpp -ft -c [country_code] -L > dvb.xspf
$ vlc dvb.xspf

您还可以手动指定频率和节目。这可以使用以下方法完成

$ vlc dvb://frequency=543000000

其中频率以赫兹为单位设置,应与您所在地区的传输基频相匹配。您还可以显式指定要使用的解调方式,因此可以使用 dvb-tdvb-t2 等代替 dvb

VLC 还接受各种命令行参数,例如,如果您想调谐到不同的节目

$ vlc dvb://frequency=543000000 :program=3

如果某些 DVB-T 流无法工作安装 aribb24

MPlayer / mpv

对于 DVB 流,MPlayer(或 mpv)需要在 ~/.mplayer/channels.conf 中有一个频道配置文件。按照 #扫描 中的说明生成它,但如果您使用 w_scan_cpp,请务必使用 -M 标志生成 MPlayer 的正确格式

$ w_scan_cpp -ft -c [country_code] -M > ~/.mplayer/channels.conf

对于 mpv,使用

$ w_scan_cpp -ft -c [country_code] -M > ~/.config/mpv/channels.conf

使用 mplayer dvb:// 尝试配置,它应该开始播放第一个频道。如果它没有,您可能需要使用 -demuxer lavf-demuxer mpegts 以便正确接收流。

如果配置有效,您可以简单地运行

$ mplayer dvb://"STREAM NAME"

使用频道配置文件中的有效 STREAM NAME

注意: MPlayer 无法处理和播放频道名称中包含某些 Linux 特殊符号(如 /)的频道,但您可以通过编辑 ~/.mplayer/channels.conf 手动重命名它们。

频道选择器

这是一个 lstvAUR 脚本,它将通过从 ~/.mplayer/channels.conf 文件读取数据来显示编号的频道列表。您将能够通过使用脚本关联的数字而不是必须在命令行中键入整个频道名称来观看频道,例如 lstv 3。脚本关联的频道号等于其调谐配置的行号。该脚本在启动 mplayer 之前禁用显示器节能和屏幕保护程序,并在您关闭它后再次启用两者。要禁用此脚本中的屏幕保护程序管理,请删除 MPlayer 前后的 xset ...;

/usr/local/bin/lstv
#!/bin/bash
if [ "$1" ];then
CC='^[0-9]+$';
  if ! [[ "$@" =~ $CC ]];then echo Is not a channel number!;
   else
##
    awk -F':' -v AA="$1" '//{ZZ++;
     if(AA == ZZ)system("xset -dpms s off;mplayer dvb://""\""$1"\";xset +dpms s on")}
     END{if(AA > ZZ)printf "The highest channel number is: "ZZ"\n"}' "$HOME/.mplayer/channels.conf"
##
  fi;
else
awk -F':' '// { ZZ++; printf  ZZ " | " $1 "\n"}' "$HOME/.mplayer/channels.conf"
fi;
注意
  • 假设 channels.conf 文件是使用以下命令创建的:w_scan_cpp -ft -c country_code -C UTF-8 -M -E 0 -O 0 > ~/.mplayer/channels.conf
  • 如果频道列表太长,那么您可以使用类似 lstv | less 的命令,并通过按 / 并写入其名称来搜索频道名称。找到后,按 q 退出 less(1),并使用与 lstvAUR 关联的频道号。
  • 如果您在播放视频时遇到问题,请参阅 Arch Linux 论坛
警告: 如果有多个同名频道,mplayer 将只播放列表中最接近的频道。

ffmpeg

FFmpeg 可以将 DVB-T MPEG 流作为输入,但需要 tzap(在 linuxtv-dvb-appsAUR 中)才能这样做。

注意: 这可能不一定是这种情况,如果已知更好的方法,请更新。

首先,使用 w_scan_cpp 生成与 tzap 兼容的 channels.conf 文件

$ w_scan_cpp -ft -A1 -X > ~/.tzap/channels.conf

然后,您可以运行

$ tzap -r "CHANNEL NAME"

如果设置正确,它应该产生类似于以下的输出

using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
reading channels from file '/home/user/.tzap/channels.conf'
Version: 5.10  	 FE_CAN { DVB-T }
tuning to 506000000 Hz
video pid 0x0a21, audio pid 0x0a22
status 00 | signal 0000 | snr 0000 | ber 0000ffff | unc 00007fbd | 
status 1f | signal 0000 | snr 0126 | ber 00000000 | unc 00007fbd | FE_HAS_LOCK
status 1f | signal 0000 | snr 0129 | ber 0000000f | unc 00007fbd | FE_HAS_LOCK
status 1f | signal 0000 | snr 0120 | ber 00000003 | unc 00007fbd | FE_HAS_LOCK
status 1f | signal 0000 | snr 0125 | ber 00000011 | unc 00007fbd | FE_HAS_LOCK
# ....

有关 tzap 的更多信息,请访问 zap wiki 页面

一旦 tzap 正在编码流,/dev/dvb/adapter0/dvr0 应该可供 ffmpeg(或任何其他程序)使用。

一个简单的流式传输程序的命令,无需额外编码,可能如下所示

$ ffmpeg -f mpegts -i /dev/dvb/adapter0/dvr0 out.mp4

(注意:如果卡需要设置前端和/或解复用器,则上述命令不会生成输出)。

您可能还希望仅使用 tzap 录制流,并在稍后使用 ffmpeg 重新编码它

$ tzap -t <recording duration in seconds> -o foo.ts "<channel name>"

dvbjet

DVB 卡接收多个同时多路复用的节目。命令行 dvbjet 独立工具(没有依赖项)通过选择频率(如收音机)来调谐电视卡,并保存完整的 MPEG-TS 流。为了从中播放或提取单独的节目(及其所有音频、视频和字幕轨道),它的配套 python 脚本列出节目并调用 ffmpeg。

故障排除

多个前端

许多 DVB 加密狗可能会注册多个前端。这可以在 dmesg 中发现

[ 9080.196561] usb 1-6: DVB: registering adapter 0 frontend 0 (Realtek RTL2832 (DVB-T))...
[ 9080.196567] dvbdev: dvb_create_media_entity: media entity 'Realtek RTL2832 (DVB-T)' registered.
[ 9080.196626] usb 1-6: DVB: registering adapter 0 frontend 1 (Sony CXD2837ER DVB-T/T2/C demodulator)...
[ 9080.196630] dvbdev: dvb_create_media_entity: media entity 'Sony CXD2837ER DVB-T/T2/C demodulator' registered.

可以通过执行以下操作列出它们

$ ls /dev/dvb/adapter0/frontend*

每个前端可能有特定的用途,并且可能仅支持解码特定的 DVB 标准。某些软件可能没有能力或适当的文档来选择要使用哪个前端,并且将默认使用 frontend0,如果广播采用 frontend0 不支持的标准(在上面的示例中,如果广播采用 DVB-T2,但前端只能执行 DVB-T,则它将无法工作),这将导致问题

其他

如果您遇到问题,这些工具可以帮助调试问题

  • dvbsnoopAUR 是一个高级工具,可以显示有关带宽、信号、前端等的所有必要数据。
  • femon -H 显示信号统计信息