这是一篇教程,目的是让读者能搭建出一个系统,可以在家中电脑、手机上或是其他位置,观看家中IPTV的直播节目,甚至可以手工选择录制节目。
0. 准备工作
你需要有下列硬件/软件以完成该教程。
- 家里的宽带有IPTV订阅,本文以广州电信IPTV为例
- 稍微高级一点的路由器,本文以Mikrotik的RB5009为例,但openwrt/LEDE之类的也可以
- 家中有一台常开的主机,本文以HP Gen 8 microserver为例,但树莓派4也可以
- Plex,需要有Pass订阅,emby和Jellyfin也可以
- 一定的网络知识和动手能力
1. 这样有什么好处
普通机顶盒,只能接在光猫上,因此只能在固定地点(例如客厅)的电视上看直播节目,而我们需要突破这个限制。
也有一些基于互联网电视的方案,可以支持用客户端观看,但基于互联网的直播会受网络带宽影响,画质较差,甚至在高峰期出现打不开的情况。而我们基于组播的方案不会受到这个影响。
虽然机顶盒支持一定天数的回放,但我们支持录制直播,多少算是弥补了这个短板。
2. 打通组播信号
电信IPTV是通过IGMP协议传输的,信号是通过一个vlan(广州是45)接到光猫。如果你用的是电信送的光猫,那么它会把信号分离到一个专用的网口,一般标着iTV。如果你跟我一样用的Pon Stick,需要自己设立一个vlan把信号接进来。
接下来,如果你不需要用之前的机顶盒,在这个vlan上用IPTV的用户名和密码做pppoe拨号就行了,如果还需要用机顶盒,那么需要把这个口绑定到一个单独的bridge,把机顶盒接入的eth口也加入这个bridge,然后再创建pppoe拨号。
接下来,需要设置一个IGMP Proxy,注意下图的subnets和upstream。
这个Quick Leave非常重要,后面会解释。
完成了这一步后,你应该可以通过一台用网线连着路由器的电脑,用potplayer或者其他类似播放器打开IPTV的组播地址看到直播节目。
广州电信的组播地址可以在这里找到 https://github.com/Tzwcard/ChinaTelecom-GuangdongIPTV-RTP-List,其中rtp开头的就是组播地址了。
这个时候你在想,原来就这样啊,链路打通了,地址有了,扔进播放器就好啦。
然而,过了不久(大约250秒)你会发现,为啥直播总是断呢?而且为什么一定要用网线连接,不能躺在床上用手机看吗?
3. 解决组播的一些问题
IGMP这个协议确实很适合用来做广播,但是,也因为它的广播性质,导致以下两个问题:
- 客户端并不总会向服务器汇报状态,而服务器也不可能一直就这么发送数据包。
- 无线网络不适合组播信号传输(会阻塞),因此多数AP根本就禁止组播信号,或者在有组播信号的时候调为极低的速率。
为了解决这个问题,我们需要用udpxy这个软件将组播转为单播,也就是普通的TCP连接。udpxy是个相当有年头的软件,你如果不想自己编译的话,可以在这里下载 https://github.com/ihipop/udpxy-binary
将udpxy下载到你的主机上,记得运行参数加上 -M 55 ,这会让它每55秒离开组播再立刻加入,让上游服务器持续传送数据过来。而上面提到的Quick Leave设置,就是为了让这个信号正确的传到上游服务器,否则IGMP Proxy会什么都不做。
到这里,你已经可以在LAN里面用udpxy转换的地址播放IPTV直播了。
4. 加上EPG和台标
看直播怎么能没有节目单呢,这个时候就需要EPG了。Tzwcard本身整合了一部分EPG,但是不够优美,没有台标。
http://epg.51zmt.top:8000 这个网站提供的频道更多,也支持台标。你只要把m3u播放清单上传,就可以加上频道信息和台标。
每天手工传太麻烦,所以我写了个脚本。 https://gist.github.com/fqx/05e37db80ea7de115f475a06af7f16ec
5. 导入Plex
Plex并不直接支持m3u,因此需要下载xTeVe https://github.com/xteve-project/xTeVe
xTeVe的文档写的比较清楚,基本上只要导入m3u,导入EPG,做一下自动关联就好了。
最后在Plex里面添加xTeVe为tuner,用xTeVe生成的XEPG地址做节目单就OK啦。