Linux 系统下使用 Hauppauge TV tuner 踩了一堆坑。所以我决定单独写一篇文章记录一下各种问题和解决方法。
安装与设置
1. 安装 TV tuner 驱动
Hauppauge 官方给了详细的驱动安装方式,而且还提供了 PPA 源,可以直接通过 apt 安装。
# Ubuntu 20.04 LTS
$ sudo add-apt-repository ppa:b-rad/kernel+mediatree+hauppauge
$ sudo apt update && sudo apt install linux-hwe-mediatree -y
# Ubuntu 22.04 LTS
$ sudo add-apt-repository ppa:b-rad/kernel+mediatree+hauppauge
$ sudo apt update && sudo apt install linux-mediatree -y
2. 安装 Plex Media Server
Plex 官网主页上给出的是 deb 下载,但是经过搜索,找到了 Plex 官方提供的 PPA 源。这里推荐用 PPA 方式安装,方便升级。
# Ubuntu 20.04 LTS
$ curl https://downloads.plex.tv/plex-keys/PlexSign.key | sudo apt-key add -
$ echo deb https://downloads.plex.tv/repo/deb public main | sudo tee /etc/apt/sources.list.d/plexmediaserver.list
$ sudo apt update && sudo apt install plexmediaserver -y
# Ubuntu 22.04 LTS
$ curl https://downloads.plex.tv/plex-keys/PlexSign.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/plexmediaserver.gpg
$ echo deb https://downloads.plex.tv/repo/deb public main | sudo tee /etc/apt/sources.list.d/plexmediaserver.list
# If using Intel UHD Graphics, Install Intel Packages
# Note: For now, intel-opencl-icd must stay at 21.49.21786.
$ wget https://github.com/intel/compute-runtime/releases/download/21.49.21786/intel-gmmlib_21.3.3_amd64.deb
$ wget https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.9441/intel-igc-core_1.0.9441_amd64.deb
$ wget https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.9441/intel-igc-opencl_1.0.9441_amd64.deb
$ wget https://github.com/intel/compute-runtime/releases/download/21.49.21786/intel-opencl-icd_21.49.21786_amd64.deb
$ sudo dpkg -i intel-gmmlib_21.3.3_amd64.deb intel-igc-core_1.0.9441_amd64.deb intel-igc-opencl_1.0.9441_amd64.deb intel-opencl-icd_21.49.21786_amd64.deb
$ sudo apt-mark hold intel-opencl-icd
$ sudo apt update && sudo apt install plexmediaserver -y
3. 确认 TV tuner 正常工作
我这里使用的是 TV tuner for Xbox,实际上就是 WinTV-HVR-955Q 的换壳版本。可以通过 dmesg 确认 TV tuner 的内核驱动工作正常。
$ dmesg | grep -P "(dvb)|(cx231xx)"
[ 3.459264] rc rc0: Conexant Hybrid TV (cx231xx) MCE IR no TX (2040:b123) as /devices/pci0000:00/0000:00:17.1/0000:14:00.0/usb3/3-3/3-3:1.0/rc/rc0
[ 3.459347] input: Conexant Hybrid TV (cx231xx) MCE IR no TX (2040:b123) as /devices/pci0000:00/0000:00:17.1/0000:14:00.0/usb3/3-3/3-3:1.0/rc/rc0/input6
[ 3.809380] cx231xx 3-3:1.1: New device Hauppauge Hauppauge Device @ 480 Mbps (2040:b123) with 7 interfaces
[ 3.809704] cx231xx 3-3:1.1: Identified as Hauppauge WinTV-HVR-955Q (111401) (card=21)
[ 4.037824] cx25840 4-0044: cx23102 A/V decoder found @ 0x88 (cx231xx #0-0)
[ 6.266374] cx25840 4-0044: loaded v4l-cx231xx-avcore-01.fw firmware (16382 bytes)
[ 6.358990] cx231xx 3-3:1.1: v4l2 driver version 0.0.3
[ 6.538517] cx231xx 3-3:1.1: Registered video device video0 [v4l2]
[ 6.538570] cx231xx 3-3:1.1: Registered VBI device vbi0
[ 6.538572] cx231xx 3-3:1.1: video EndPoint Addr 0x84, Alternate settings: 5
[ 6.538574] cx231xx 3-3:1.1: VBI EndPoint Addr 0x85, Alternate settings: 2
[ 6.538575] cx231xx 3-3:1.1: sliced CC EndPoint Addr 0x86, Alternate settings: 2
[ 6.538576] cx231xx 3-3:1.1: TS EndPoint Addr 0x81, Alternate settings: 6
[ 6.538691] usbcore: registered new interface driver cx231xx
[ 6.568896] cx231xx 3-3:1.1: audio EndPoint Addr 0x83, Alternate settings: 3
[ 6.568900] cx231xx 3-3:1.1: Cx231xx Audio Extension initialized
[ 6.660767] dvbdev: DVB: registering new adapter (cx231xx #0)
[ 6.660769] cx231xx 3-3:1.1: DVB: registering adapter 0 frontend 0 (LG Electronics LGDT3306A VSB/QAM Frontend)...
[ 6.660771] dvbdev: dvb_create_media_entity: media entity 'LG Electronics LGDT3306A VSB/QAM Frontend' registered.
[ 6.661006] dvbdev: dvb_create_media_entity: media entity 'dvb-demux' registered.
[ 6.661306] cx231xx 3-3:1.1: Successfully loaded cx231xx-dvb
[ 6.661308] cx231xx 3-3:1.1: Cx231xx dvb Extension initialized
ESXi 下,如果出现 Error 27 或者 Error 110 之类的,则意味着虚拟化不成功。如果使用 USB 直通可能会被误标记成鼠标设备。推荐使用单独的 PCIe 转 USB 3.0/3.1 卡,然后将整个卡直通给虚拟机使用。
驱动成功之后就可以进入 Plex 的 Live TV & DVR 里面扫描频道了。
给 Plex 录制功能分配临时空间
在使用 Live TV 时,Plex 需要将节目实时录制。此项功能无法关掉,猜测是为了加入暂停和回放功能。虽然在退出 Live TV 的时候,Plex 会自动回收相应的临时存储空间,但是如果要长时间看电视的话,依然要分配足够多的时间给视频录制功能。
这个临时空间是在 设置 -> 转码器(Transcoder) 下面设置的。将 Transcoder temporary directory 设置到一块独立硬盘上面,避免塞满 root 造成系统运行异常。
另外,也有教程指导将转码临时空间设置到内存上去(/dev/shm),这个就要取决于系统内存大小了。毕竟家用服务器上吃内存的服务也挺多的,机械硬盘的写入速度也完全够用,还是放到硬盘上比较好。
重启 TV tuner
Live TV 在使用过程中经常会遇到服务崩溃的情况,Plex 官方修了很久也没完全修好。有时候重启 Plex Media Server 服务之后,Live TV 依然报错,这个时候就要重启 TV tuner 了。
首先,找到 TV tuner 所在的 USB 控制器以及接口(USB 树节点)。
$ sudo grep Hauppauge /sys/bus/usb/devices/*/product
/sys/bus/usb/devices/3-3/product:Hauppauge Device
然后,通过禁用再重新启用对应的 USB 接口,来重启 TV tuner。
$ sudo systemctl stop plexmediaserver.service
$ echo 0 | sudo tee /sys/bus/usb/devices/3-3/authorized
0
$ echo 1 | sudo tee /sys/bus/usb/devices/3-3/authorized
1
$ sudo systemctl start plexmediaserver.service
用这种方式可以单独重启 TV tuner,避免重启整个系统。
重置 PCIe to USB 3.0 转换卡
在使用过程中,我还遇到过完全找不到 TV Tuner 的情况。可以通过重置 PCIe to USB 3.0 转换卡来解决。
首先,找到 USB 卡的 PCI 总线 ID。
$ lspci
...
14:00.0 USB controller: Renesas Technology Corp. uPD720201 USB 3.0 Host Controller (rev 03)
...
然后,重置 PCIe 设备
$ echo 1 | sudo tee /sys/bus/pci/devices/0000\:14\:00.0/remove
1
$ sleep 1
$ echo 1 | sudo tee /sys/bus/pci/rescan
1
然后再通过 dmesg | grep dvb
来确认系统已找到并成功驱动 TV tuner。