北京移动IPTV组播转单播

2

在任何设备都可以看 IPTV,包括手机和电脑。

1. 前置工作

1.1 测试 IPTV 信号

1.2 单线复用

端口绑定
  • 单线复用教程:https://www.right.com.cn/forum/thread-8342082-1-1.html
    • 绑定上网业务(含有 INTERNET 的名称)和 IPTV 业务(含有 Other 的名称)到网口 1,这一步是实现单线复用,也就是光猫的网口 1 到路由器 WAN 口一根网线同时传输上网 +IPTV 两种信号。
  • 测试单线复用
    • 北京联通的 rtp://239.3.1.241:8000 或者北京移动的rtp://228.1.1.115:8000
    • 如果可以播放出画面,那接下来再看看能不能上网,如果还可以上网,那光猫这个接口就属于可以单线复用

1.3 IPTV 组播和单播

  • 单播 (Unicast) 就像是网上购物后收快递:你想买一件特定商品,下单后,商家会把这个包裹专门打包,通过快递员,一对一地送到你家。你的邻居就算也买了同样的东西,商家也需要为他另外打包一个包裹,再派一个快递员送过去。你收你的,他收他的,互不干扰。
    • 主要用于视频点播 (VOD)、时移电视 (Time-shifting) 和回看 (Playback)。
    • 当你打开电视盒子,选择一部电影《流浪地球》开始观看时,你的电视盒子就向 IPTV 服务器发出了一个 “ 单播 “ 请求。服务器随即为你创建一个专属的数据流,从头开始播放,并只发送给你。你可以随意快进、暂停、后退,因为这条数据流是为你量身定制的。
  • 组播 (Multicast) 就像是看电视直播:电视台在晚上 7 点播放新闻联播。它只发射一个信号,所有把电视频道调到这个台的观众,都能接收到完全相同的内容。电视台不需要为每一个观众都单独发射一次信号,大大节省了资源。想看的人就 “ 加入 “(调台),不想看的人就 “ 离开 “(换台)。
    • 组播是一种 “ 一对多 “(one-to-many) 的通信模式。服务器只发送一份数据包到一个特定的 “ 组播地址 “,网络中所有对这个 “ 组 “ 感兴趣的客户端都可以加入该组,并接收这份数据。数据包在网络传输路径的分叉点上才会被复制和分发。
    • 主要用于电视频道直播 (Live TV)。

2. 配置

光猫桥接模式,路由器宽带拨号,刷了 ImmortalWrt 系统,目前电脑连接光猫的 iptv 口可以看组播,怎么设置电脑连接路由器的 lan 口也可以看组播。光猫 ip 地址 192.168.1.1,路由器地址 192.168.6.1

  • 你的路由器(OpenWrt)目前只处理了上网的流量,对于 IPTV 的组播流量,它默认会当成普通的外网流量给 “ 挡 “ 在门外,不会主动转发到你的局域网(LAN)里。
  • 要解决这个问题,我们需要让路由器 “ 认识 “IPTV 流量,并 “ 代理 “ 你局域网里电脑的请求,去向光猫获取组播视频流,然后再转发给你的电脑。
  • 获取 IPTV 的 VLAN ID。
  • 新增网络接口 eth1.1010
  • 网桥设备 lan 开启 IGMP 嗅探
IGMP嗅探

2.1 新增网络接口

1
2
3
4
5
6
7
cat /etc/config/network

config interface 'IPTV'
option proto 'static'
option device 'eth1.1010'
option ipaddr '169.254.101.1'
option netmask '255.255.255.0'
iptv接口

2.2 配置防火墙

我们需要告诉防火墙,允许 iptv 区域的流量和 lan 区域的流量进行通信。

iptv防火墙
  1. 进入 网络 -> 防火墙
  2. 你会看到刚才新建的 iptv 区域。点击它旁边的 编辑
  3. 常规设置:
    • 入站数据出站数据转发 都设置为 接受 (accept)
    • 勾选 IP动态伪装 (Masquerading)
    • 在 允许转发到目标区域 中,确保 WAN(或者你的 pppoe-wan 所在区域)被勾选。
    • 在 允许从源区域转发 中,确保 LAN 被勾选。
  4. 回到防火墙主页面,我们还需要添加两条重要的通信规则。
    • 规则一:允许 IGMP 流量
      • 在 通信规则 标签下,点击 添加
      • 名称:Allow-IGMP-From-IPTV
      • 源区域:选择 iptv
      • 目标区域:选择 设备(输入)
      • 协议:选择 IGMP
      • 动作:选择 接受 (accept)
      • 点击 保存
    • 规则二:允许 IPTV 组播流进入 LAN
      • 再次点击 添加
      • 名称:Allow-Multicast-To-LAN
      • 源区域:选择 iptv
      • 目标区域:选择 lan
      • 协议:选择 UDP (因为视频流通常是 UDP)。
      • 动作:选择 接受 (accept)
      • 点击 保存

防火墙通信规则

2.3 配置 Igmpproxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@ImmortalWrt:~# cat /etc/config/igmpproxy
config igmpproxy
option quickleave 1
option verbose 3

config phyint
option network 'IPTV'
option direction upstream
list altnet '0.0.0.0/0'

config phyint
option network 'lan'
option direction downstream
list altnet '192.168.6.0/24'
1
2
3
4
5
6
7
8
9
10
# 查看 IPTV 网络
ubus call network.interface.IPTV status
/etc/init.d/network restart
/etc/init.d/network reload

# 命令
/etc/init.d/igmpproxy start
/etc/init.d/igmpproxy stop
/etc/init.d/igmpproxy status
logread -e igmpproxy

2.4 配置 Udpxy

udpxy配置
已启用✅ 勾选启用 udpxy 服务
刷新✅ 勾选网络变动时自动重启 udpxy
详细日志记录⬜ 可选开启会增加日志量,排错时才用
客户端统计信息✅ 勾选在 /status 页面显示连接统计
HTTP 监听接口br-lan(或 lan这是 udpxy 提供 HTTP 流的接口,供局域网客户端访问
端口4022默认即可,除非你有冲突
多播订阅源网络不填或默认一般留空
组播订阅源接口选你的 IPTV 上行接口,比如 eth1.1010 或 wan.iptv对应你 igmpproxy “ 上游 “ 那个接口(即光猫出来的 VLAN)
客户端数量上限20(根据路由器性能酌情)一般 10-30 比较合理
日志文件/var/log/udpxy系统默认即可
入口缓冲区大小4096(默认)不需要改
缓冲区消息数 / 时间限制默认值可保持 1 和 -1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# udpxy 启动命令
/etc/init.d/udpxy enable
/etc/init.d/udpxy start
/etc/init.d/udpxy stop


/etc/init.d/udpxy status


# 查看 udpxy 状态
http://192.168.6.1:4022/status

# 组播转单播
http://192.168.6.1:4022/udp/228.1.1.189:8000

# 修改单播地址
https://raw.githubusercontent.com/unix2dos/Beijing-IPTV/refs/heads/master/IPTV-Mobile.m3u

实测:udpxy 成功后可以关闭 igmpproxy

udpxystatus

2.5 新工具 rtp2httpd

配置后可以直接网页看,更方便。上游接口选择 eth1.1010

1
2
/etc/init.d/rtp2httpd status
/etc/init.d/rtp2httpd enable
rtp2httpd 1

3. 资源

3.1 播放软件

  • mac: vlc
  • window: vlc
  • ios: zfuse(最快),ntplayer,senplayer
  • android: vlc
  • 安卓电视: DIYP

3.2 直播资源

4. 提问问题

ICMP 协议是什么?和 TCP 和 UDP 的核心区别是什么?

ICMP 全称是 Internet Control Message Protocol(互联网控制报文协议)。

  • 它的角色: 它是 TCP/IP 协议族的一个子协议,主要用于在 IP 主机、路由器之间传递控制消息。
  • 它的作用: 它不传输用户数据(比如你发的微信、下载的电影),它传输的是网络本身的状态信息。比如:
    • 报告错误(例如:” 你访问的这个地址找不到 “/Destination Unreachable)。
    • 诊断状况(例如:” 那个服务器还活着吗?”)。
      TCP 和 UDP 都是为了 “ 运送数据 “,而 ICMP 是为了 “ 检查路况 “。

IGMP 协议是什么?和 TCP 和 UDP 的核心区别是什么?

全称: Internet Group Management Protocol(互联网组管理协议)。一句话解释: 它是用于 “ 组播(Multicast)” 的报名登记协议。它的作用: IGMP 运行在主机(电脑/电视机顶盒)和直接相连的路由器之间。它的作用是让主机告诉路由器:” 我想加入某个特定的组,请把这个组的数据发给我。”

生活中的类比: 想象一下传统的 订报纸:

  • IGMP 就像是你给邮局填写的 “ 订阅单 “。
  • 你在订阅单上写:” 我要定《足球周刊》(加入组播组)”。
  • 邮局(路由器)收到单子后,就会把《足球周刊》的内容投递给你。
  • 如果你不想看了,发送一个 IGMP 离组消息,邮局就不送了。

如果没有 IGMP,路由器不知道谁需要数据,可能会把数据发给所有人(浪费带宽),或者谁都不发。IPTV 确实大量使用了 IGMP,但不是用来传视频,而是用来 “ 换台 “ 的。

  • IGMP 的作用(组播管理):
    • 当你在 IPTV 机顶盒上按下遥控器换到 CCTV-5 时,机顶盒会向路由器发送一个 IGMP 报告,说:” 我要加入 CCTV-5 这个组,请把这个台的数据推给我。”
    • 当你换台离开时,它会发 IGMP 消息说:” 我不看这个了,别发数据了。”
  • IGMP 负责告诉网络 “ 我想看哪个台 “(像遥控器信号)。
  • UDP 负责真正的 “ 把高清视频流压过来 “(像电视频道信号)。

绝大多数运营商的 IPTV 直播源,使用的核心传输协议是 UDP(通常结合 RTP 协议封装 MPEG-TS 流)。为什么是用 UDP 而不是 TCP?

  • 实时性第一:看球赛时,你希望看到的是实时的画面。如果网络稍微卡一下,UDP 的策略是 “ 丢掉那几帧画面,继续播放下一秒 “(画面可能花一下,但声音不停)。
  • 如果是 TCP:由于 TCP 必须要保证数据完整,一旦丢包,它会暂停播放,去重新请求那个丢失的包(导致画面转圈缓冲),这对直播体验是毁灭性的。

最核心的区别在于: IGMP 是负责 “ 管理 “ 的,而 TCP/UDP 是负责 “ 搬运 “ 的。

为什么需要组播转单播

组播转单播它是为了解决 “ 组播 “ 在无线 Wi-Fi 环境下传输效果差的问题,” 组播转单播 “ 的意思是: 在你的路由器上运行一个小程序(代理),它一方面假装成机顶盒去接收运营商的 IPTV 组播数据,另一方面把收到的数据 “ 重新打包 “,变成手机、电脑、iPad 容易理解且传输稳定的 HTTP 单播数据流。

因为 Wi-Fi 天生不喜欢组播:

  1. Wi-Fi 拥堵: 组播数据在 Wi-Fi 网络中通常会以 “ 最低速率 “ 发送,或者被当做广播处理,这会导致无线网络拥堵,家里其他人打游戏会卡顿(这叫 “ 组播风暴 “)。
  2. 画面花屏: 组播通常用 UDP,Wi-Fi 信号稍微波动一下,就会丢包。因为 UDP 不重传,你的电视画面就会出现马赛克或卡住。
  3. 设备限制: 很多手机、智能电视并没有内置 IGMP/组播接收功能,无法直接播放原始的 IPTV 信号。

转成单播后 (HTTP/TCP): 视频流就变得像看网页视频一样,支持 Wi-Fi 高速传输,支持重传(不花屏),支持各种设备播放。

这个过程通常由路由器内的一个软件(最有名的是 udpxy)来完成。我们可以把它看作一个 “ 翻译官 “。

组播和单播都是 UDP 流量吗

运营商发给你的 IPTV 信号(组播),确实是 UDP 流量。它是 “ 射后不理 “ 的。运营商只管往外扔数据包,不管你收没收到。这也是为什么通过 Wi-Fi 直接看组播容易花屏,因为 Wi-Fi 丢了 UDP 包没人给你补发。

转换后(单播):通常变成了 TCP。当你使用 udpxy 进行转换后,你手机收到的单播流量,通常是 TCP 流量(承载在 HTTP 协议之上)。TCP 是 “ 使命必达 “ 的。如果数据包在 Wi-Fi 传输中丢了,手机会告诉路由器:” 刚才第 5 秒的画面没收到 “,路由器会重传。这就是为什么转单播后 Wi-Fi 看电视变流畅了。此方案是将 UDP 组播 转换为了 TCP 单播。

想象运营商是在像撒传单(UDP 组播):不论有没有人接,传单一直在漫天飞。如果你伸手去接(看电视),偶尔漏接一张(丢包),这页内容你就看不到了(花屏)。

OpenWrt + udpxy(组播转单播)做了什么?

  1. 路由器雇了一个管家(udpxy)站在门口。
  2. 管家负责把漫天飞的传单一张张接住,整理好,装订成一本书(转为 TCP/HTTP)。
  3. 你需要看的时候,管家把这本书递给你(单播)。
  4. 如果你看漏了一页,你可以叫管家再给你读一遍(TCP 重传)。

5. 参考教程