背景

最近眼瞅着就要过年了嘛,过年一家人总是要看春晚的。但我家的光猫,上网口跟iptv口是两条口,一旦把电视接到iptv口就看不了bilibili了。。。所以我家几乎从来都没接过iptv。。。

但过年总是要看春晚的,所以前两年我家就是在各大视频网站或cntv上看春晚。但除夕夜网络总是不太好。

所以就想着,能不能把光猫的iptv口也用上,让电视不用换网线,就既可以看b站,又可以看电视呢?(当然,不用网络直播源,不清晰又卡。。。)

获取电视机顶盒信息

把一直没用的机顶盒翻出来,直连接在光猫的iptv口上,将机顶盒连接电视,开机。

点击遥控器的设置键,要求输入密码。别慌,电信的是通用的10000 。别的品牌的百度一下也有。

然后我们调到设备信息的页签,记下IP地址、子网掩码、网关、主备DNS、有线MAC,无线MAC也可以记一下,不过好像没用。

然后就可以关机,把机顶盒继续收在柜子里啦。

同时接入网络口和iptv口

主流方案:单路复用

现在主流的方案就是修改光猫配置,将网络流量和iptv流量不绑定出端口,从而实现一条网线单路复用,同时传输网络流量和iptv。

我的方案:双wan口

虽然电信用一条光纤单路复用同时传输网络流量和iptv到家,但网线的带宽还是要远远小于光纤的。而且我家的网口只是千兆口,让我从光猫里出来继续单路复用,总感觉会影响网速。

那有没有不用单路复用的方案呢?当然是有的啦。我家的工控机软路由有6个网口呢。

所以我从原先的聚合lan口中,拆了一个网口,作为iptv的接入wan口。

在iKuai中配上wan2,选择基于物理网卡的混合模式,这样可以设置多个登录方式,从而让我们直连光猫。

  1. 配置静态ip,192.168.1.x,网关写光猫的ip就行。这样家里的设备就可以在不同网段中,直连光猫了。此条线路命名为vwan_model。
  2. 配置动态ip。这里要填写上面我们记录的机顶盒mac地址,因为iptv都是绑定设备的,其他mac地址分配不到ip。(当然,蒙对了说不定也行)至于这边貌似也可以填写同网段下的静态ip,但我觉得还是伪装mac来自动dhcp获取ip会更保险一些。此条线路命名为vwan_iptv。

vlc

伪装截取组播流

这时候,虽然我们的软路由通过伪装mac,同时接入了网络流和iptv流,但iptv使用的是组播协议,如果不运行组播协议的话那还是看不到电视。

所以我们在iKuai中打开IGMP代理,选择IGMPv3协议版本,上联端口选择我们刚才设置动态IP的线路vwan_iptv,下联端口选择lan1线路,这样家里的所有设备就都可以通过组播代理,获取到组播流了。

组播流转单播流

到上一步,我们获取到的依然是组播流,但是大多数家庭设备并不支持组播流,所以我们还需要把组播流转为单播流,才能无障碍的在任意设备观看iptv。

这里我们在iKuai路由器系统中设置UDPXY,信号源接口选择我们代理的线路vwan_iptv,服务端口(也就是给内网设备观看iptv服务使用的端口)随便写一个吧 。

获取iptv节目地址(组播订阅地址)

其实在上一步做完时,我们就已经可以看iptv了。但是,我们的串流地址写啥呢?

这其实是因为组播建立了连接之后,还需要订阅一个源,才会有数据传来。但我们不知道这个订阅地址是啥呀。。。

主流方案:机顶盒抓包

一般的主流方案就是,既然没有订阅地址,那直接对机顶盒抓包就行了。一般他们需要一个双端口网卡,我虽然有交换机,也可以进行抓包,但终究还是烦了点,所以只是当后备方案预备着。

我的方案:找现成的iptv源

那既然是抓包,就肯定有人抓过并共享了,而且iptv讲究稳定性,订阅地址肯定不会经常更换,所以我只需要找到人们共享出来的iptv源就行啦。

但尝试了几个失败后才发现,原来iptv并不是我想象中的全国一个巨大的组播树。而是借鉴了CDN的思路,先把组播流缓存到各个地级缓存服务器,再从该服务器向周边人群建立组播树。

所以我找了一个南京电信的iptv组播源 https://github.com/shawze/IPTV ,把里面的ip和端口改成我自己路由器的ip和设置的udpxy服务端口,得到m3u文件,比如:

1
2
#EXTINF:-1, CCTV1
http://x.x.x.x:y/udp/239.49.8.19:9614

播放器

pc:vlc等

把上面的m3u节目单,即iptv源,拖进vlc的播放列表,再随便选择一个节目(频道): vlc

安卓:vlc等

我用的小米8,也可以安装vlc哈。亲测很好用。而且发现可以多个不同的节目同时看,一个节目差不多要流量1.多MB,我在pc和手机上看不同的节目,总流量速度就是2.28MB/s。

iphone:nplayer

vlc

vlc

TV:Kodi

我用的是海信的电视,自己装了蚂蚁市场,里面直接就有Kodi,安装。

进入Kodi后,点击设置,选择Interface -> Skin,将font改为Arial based,不然中文显示的都是乱码。

如果需要将界面都给改成中文,可以进入插件,选择look and feel -> language,安装简体中文,选择确认切换语言,即可。

接下来,我们安装iptv客户端。

依然是进入插件页,选择PVR客户端,安装PVR IPTV Simple Client插件。然后进入插件配置,将m3u位置改为本地,然后选择nfs。。。

导入后,即可正常观看iptv啦。

vlc

若想要节目单的话,可以在PVR IPTV Simple Client插件的设置中,找到节目单指南标签,填上http://epg.51zmt.top:8000/cc.xml.gz,即可匹配到电子节目单信息了。

当然,我们还可以再把台标也给加上。具体操作是,打开http://epg.51zmt.top:8000/网站,把修改好的m3u文件上传,就可以得到匹配上台标的m3u文件。 但是这个文件里会把没匹配上的台名称信息丢掉,所以我们需要把台标信息加回到原先的m3u文件中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
m3u_context = []
with open('江苏电信-组播-全部_zsd.m3u.bak', 'r', encoding='utf-8') as m3u_file, open('江苏电信-组播-全部_zsd_epg.m3u', 'r', encoding='utf-8') as epg_file:
    for m3u_line, epg_line in zip(m3u_file.readlines(), epg_file.readlines()):
        m3u_elements = m3u_line.split(' ')
        epg_elements = epg_line.split(' ')
        
        if len(epg_elements) < 4:
            m3u_context.append(m3u_line)
            continue
            
        logo = 'tvg-logo=""'
        if epg_elements[3] != logo:
            logo = epg_elements[3]
        m3u_elements.insert(3, logo)
        
        m3u_context.append(' '.join(m3u_elements))

with open('江苏电信-组播-全部_zsd.m3u', 'w', encoding='utf-8') as m3u_file:
    m3u_file.writelines(m3u_context)