封面来源:秋天的神明大人們 | oO大黄Oo #pixiv https://www.pixiv.net/artworks/59128984
自去年卡塔尔世界杯开始,在下开始逐渐有了观看在线 IPTV 直播源的需求。后来,在下经由 Formula 1: Drive to Survive 这部纪录片小小入了 F1 的坑,每逢大奖赛周末,也或多或少想着关注一下比赛的情况,然而 F1 大奖赛分布于全球各地,比赛的时间落在北京时间的凌晨一两点也相当正常,在下很难做到在这个时间点爬起来去开电视(在下比较爱看五星体育的解说,央视频和腾讯体育的解说氛围不足),因而观看在线 IPTV 直播源的需求与日俱增了。
当然,Github 上存在不少公开的 IPTV 直播源列表,不过,它们当中的大部分都存在重量而不重质的问题,这也不是说没有佼佼者存在,例如 fanmingming 大佬分享的直播源,无论从速度、稳定性还是台标、节目单的适配方面皆属翘楚。只是在下接触到该直播源时,其已经把免费的 Vercel 流量给用完,作者不得已临时将其搭建在了一个树莓派上运作(当然,只是临时,该项目直到目前还是相当稳定的,在下也相当推荐),可靠性到底还是令在下担忧,遂决定自己来研究一下 IPTV 直播源的问题。
关于上海电信 IPTV
在下家中有一条上海电信的宽带入户,附带 IPTV,光猫是电信配装的 SDN 网关,没有改桥接(实际上有无桥接对本实现方案并无影响),只在用于管理 SDN 网关的网络管家 APP 处设置了 DMZ 到路由器。光猫的四个 LAN 口都融合了网络业务和 IPTV 业务,无论 IPTV 盒子接在哪一个口上,都可以正常收看(实际上就算是非融合接口也无大碍)。因此,在下要做的,就是充分发挥一下这 IPTV 业务,使任一局域网设备,都能愉快地观看到 IPTV。
根据在下了解到的资料,上海电信的 IPTV 业务采用了 A/B 面结构,A 面用作鉴权、B 面则用作转发。其中,鉴权是由 SDN 网关进行的,IPTV 盒子可以获取到两个 IP 地址,多出来的一个是 23 开头的 IPTV 用专网地址;转发经由虚拟局域网 VLAN 51/85 进行,VLAN 51 实现回看服务(点播),而 VLAN 85 则实现直播服务(组播)。
利用 udpxy 服务转发 IPTV 直播流
在下不需要回看服务,只需能够观看直播服务即可,因此,只要能在一台接了 SDN 网关的局域网设备上把 VLAN 85 这一专网转发出来,就可以实现在任意局域网设备中观看 IPTV 了。此处,通常采用的方案是 udpxy,这样就可以将组播的数据流变成 TCP 协议的单播流,也避免了 IPTV 视频流在数据链路层广播。
一般来说,udpxy 服务运行在路由器上就好,当然其他接了 SDN 网关的 NAS 之类的设备也是可以的。主流的路由器系统都支持运行 udpxy 服务,这里以在下家中路由器的 Padavan 系统为例,其余路由器系统诸如 Openwrt 等,网上业有不少配置方案,故在此不做赘述:
进入路由器管理页面,选择内部网络(LAN) - IPTV,做如下配置:
在外部网络(WAN)- 端口隔离和 VLAN 过滤一栏做如下配置:
如果将来想实现在公网观看家中 IPTV,则需要去防火墙 - 通用设置 - 从外网访问路由器服务中打开允许外网访问 UDP-HTTP 代理开关,并设置外网 UDP-HTTP 代理端口。
一切设置完成之后,浏览器访问 http://YOUR_ROUTER_IP:4000/status
即可看到 udpxy 服务运行状态,在 Multicast address 一栏可以看到 IPTV 的专网 IP 已经被成功获取。
这张截图中,在下有一个 Active clients,是当时在下在用手机看 CCTV-16 4K 奥林匹克频道(这一频道在 IPTV 盒子观看甚至需要付费)。
获取组播地址
实际上到上一步结束,局域网内设备就已经有了看 IPTV 直播流的能力了,只不过还缺少各个频道的组播地址,只有拥有组播地址,才能通过 http://YOUR_ROUTER_IP:4000/udp/MULTICAST_ADDRESS
这个地址来看到各个频道的直播流。以在下的 udpxy status 截图为例,其中出现的 239.45.0.12:5140 即为 CCTV-16 4K 奥林匹克频道的组播地址,也就是说,在局域网中任意支持网络视频流的播放器中输入 http://YOUR_ROUTER_IP:4000/udp/239.45.0.12:5140
即可观看到 CCTV-16 4K 奥林匹克频道的直播流了。
搜集各频道的组播地址着实是令人头疼的一件事,毕竟 IPTV 随随便便就有几十甚至上百个频道,每一个频道都有一个对应的组播地址;不过这还没完,这些组播地址还不是一成不变的,它们会随着频道的调整等种种原因发生变动,因而,维护组播地址令个人折腾 IPTV 直播流的成本上升颇高。
好在还是有人把这事给解决了,恩山无线论坛的 deny12138 大佬通过抓取机顶盒数据,实现了自动更新组播地址,甚至还附带准确的节目单等信息,并定期将信息生成数据并上传。这个组播源去除重复频道和购物频道,设置了精致的台标,还适配了 xteve 的 UDPxy 地址替换,实属不可多得。大佬发布的的原帖在此,这里附上组播源列表以及 EPG 节目单。
收看 IPTV
拿到组播地址后,就可以在任意局域网设备中愉快地收看 IPTV 了,deny12138 大佬提供的源支持 xteve 的 UDPxy 地址替换,在 xteve 中就可以自动替换成自己的路由器地址正常观看了,若使用其他不具备此功能的播放器,则需要自己修改 udp://@
字段为 http://YOUR_ROUTER_IP:4000/udp/
才可收看。在下直接在 Github 上开了个仓库,用 Github Actions 每天自动拉取大佬的组播源,改了之后传到 Gist 上托管,这样一来就方便许多。
另外,如果想要在公网观看家中的 IPTV 视频流,也是相当简单的,只要在 YOUR_ROUTER_IP
字段处填上 DDNS 地址即可,或是使用 VPN 连回家(前提是得有公网 IP),若没有公网 IP,也可自己折腾内网穿透。
至于播放器的选择,诸如 xteve 这种专门为观看 IPTV 设计的自然最好,如果观看频次少,用 PotPlayer 观看也并非不行,只是没法观看台标和节目单而已;安卓上则可以用 Kodi、Televizo 等 APP,选择也很多;iOS 也有 APTV、iPlayTV 等应用可供选择。
最后放一张 Windows 端使用 Potplayer 观看的效果作结: