目标:让局域网里任意设备(电脑、手机、电视)直接看 IPTV 直播,不用机顶盒
效果:一次部署,全家所有设备都能看;换台速度、并发路数自己可控
难度:中等 —— 需要先完成光猫改桥接,再在 NAS 上跑一个 Docker 容器
耗时:约 30 分钟
一、为什么需要「组播转单播」
组播是什么
运营商的 IPTV 用的是组播(Multicast):一份数据流,从源头发一次,
网络里所有「订阅了」这个频道的设备同时收到。
好处是省带宽 —— 100 个人看同一个频道,运营商只发一份数据。
问题:普通设备播不了组播
组播依赖 IGMP 协议,而这套协议只在局域网内部有效。
问题在于:
- 手机、平板、智能电视大多不支持 IGMP
- 就算支持,也不支持运营商那套带 VLAN 的组播
- 跨网段(比如 WiFi 设备)就更播不了
结果就是:你的机顶盒能看,但你的手机、电脑、Apple TV 都看不了。
组播转单播解决什么
在局域网里跑一个转发服务,它:
- 用 IGMP 订阅组播流
- 把组播流转成普通的 HTTP 单播流
- 任何设备只要能用播放器打开一个 HTTP 地址,就能看
运营商组播流 -> [NAS 上的转发服务] -> HTTP 单播 -> 任意设备
rtp://239.x.x.x:4120 http://NAS_IP:5893/rtp/239.x.x.x:4120
前置的光猫改桥接步骤,参考 光猫改桥接教程。
二、前置条件(必须先做完这两步)
1. 光猫改桥接
这一步是必须的。 如果光猫还在路由模式,IPTV 的 VLAN 数据到不了你的 NAS。
完整步骤见 光猫改桥接教程,这里只说要点:
- 拿到光猫超级密码
- 备份原配置
- 把上网的 VLAN 改成桥接,由自己的路由器拨号
- 关键:IPTV 的 VLAN 保持不动,不要一起改桥接
2. 路由器 / 软路由开启 IGMP 代理
在路由器的 IPTV 设置里,打开 IGMP Proxy(或者叫 IGMP Snooping / 组播代理)。
不同系统的位置:
3. 拿到运营商的组播地址
组播地址因地区和运营商而异,没有通用值。 获取方式:
- 抓包:在机顶盒正常播放时,用路由器抓包,找 IGMP Join 报文
- 网上搜:搜「[你的城市] [运营商] iptv 组播地址」
- 问装维师傅:有时能直接问到
你需要两个东西:
- VLAN ID(比如 85、3961,各运营商不同)
- 组播 IP 和端口(比如
239.125.2.66:4120)
顺手检测一下当前的网络环境:NAT 类型检测工具
三、三个方案怎么选(核心)
先说结论:这三个工具做的是同一件事,差别在维护状态和性能。
方案一:udpxy —— 最老牌,资料最多
这是中文 IPTV 圈用了十几年的方案。
ifmm/udpxy 有 19,691 次拉取)、教程最多、踩坑资料全必须知道的事实:udpxy 官方 README 自己写着:
udpxy has not been extended or supported for 4+ years,
having been replaced by Gigapxy - a superior enterprise-oriented product.
这不代表它不能用 —— 它稳定跑了十几年,只是不再更新了。
但如果你追求更好的性能或新特性,看下面两个。
方案二:msd_lite —— udpxy 的现代替代
名字来自 Multi Stream daemon,是社区里公认的 udpxy 替代品。
如果你在恩山之类的论坛搜「udpxy 替代」,第一个被推荐的就是它。
方案三:rtp2httpd —— 功能最全
这个项目的定位就是「udpxy 的现代化版本」,作者在 V2EX 上发布过。
对比总结
我的建议:
- 第一次玩:用 udpxy,资料多,出问题好搜
- 跑稳定了想优化:换 msd_lite
- 多设备 + 在意换台速度:上 rtp2httpd
下面用 udpxy 演示,因为它最容易上手,且迁移到另外两个时思路完全一样。
四、实战:在 NAS 上用 Docker 部署 udpxy
为什么用 NAS 而不是路由器
路由器也能跑,但 NAS 有几个优势:
- CPU 通常更强,多路并发更稳
- 24 小时开机,不用管路由器负载
- Docker 管理方便,升级/回滚容易
- 顺便还能跑其他的(比如媒体库)
docker-compose.yml
在 NAS 的 Docker 目录下新建一个 udpxy 文件夹,放这个文件:
version: "2"
services:
udpxy:
image: ifmm/udpxy
container_name: udpxy
network_mode: host
restart: always
然后启动:
docker-compose up -d
需要生成更复杂的 compose 配置?用 docker-compose 生成器。
三个必须注意的点
1. network_mode: host 是必须的
这是最容易踩的坑。 udpxy 需要直接监听组播流量,
如果用了 Docker 的默认桥接网络,它根本收不到组播包。
所以 network_mode: host 不能省。
2. 端口 5893
udpxy 固定用 5893 端口,同时提供两个功能:
http://NAS_IP:5893/status/http://NAS_IP:5893/restart/http://NAS_IP:5893/rtp/组播IP:端口3. NAS 的网络配置
需要保证 NAS 和 IPTV 的 VLAN 在同一个二层网络里。
两种常见做法:
- NAS 双网口:一个口接普通网络,一个口接 IPTV VLAN
- 交换机 Trunk:在交换机上把 IPTV VLAN 透传给 NAS
如果你用旁路由方案,参考 OpenWrt 旁路由部署教程。
验证是否成功
第一步:浏览器打开状态页
http://NAS_IP:5893/status/
能看到统计信息就说明服务跑起来了。
第二步:测试一个频道
# 假设组播地址是 239.125.2.66:4120
curl -I 'http://NAS_IP:5893/rtp/239.125.2.66:4120'
返回 HTTP/1.0 200 OK 就说明转发正常。
五、在播放器里使用
地址格式
记住这个转换规则就够了:
rtp://239.125.2.66:4120http://NAS_IP:5893/rtp/239.125.2.66:4120电脑端
mpv http://NAS_IP:5893/rtp/...电视 / 盒子
- Kodi:安装 PVR IPTV Simple Client 插件,导入 m3u 播放列表
- 智能电视:用电视自带播放器或装 VLC for Android TV
- Apple TV:用 VLC 或 Infuse
建议做法:把所有频道的地址整理成一个 .m3u 文件,
播放器导入一次就能看全部频道,不用每次输地址。
#EXTM3U
#EXTINF:-1, CCTV-1 综合
http://NAS_IP:5893/rtp/239.125.2.66:4120
#EXTINF:-1, CCTV-2 财经
http://NAS_IP:5893/rtp/239.125.2.67:4120
六、哪些 NAS 跑得动
好消息:组播转单播是 IO 密集型任务,对 CPU 要求不高。
坏消息:多路 4K 并发时,CPU 和网络都有要求。
大致参考(非实测,请按自己情况验证)
几个容易被忽略的点:
- 网口比 CPU 更重要 —— 千兆网口跑 3 路 4K 就吃紧了
- NAS 上的其他服务会抢资源 —— 如果同时跑 Plex 转码,要留余量
- ARM NAS 也能跑 ——
ifmm/udpxy镜像支持 arm64 和 armv7
想查具体型号的跑分?看 NAS CPU 性能天梯图 的 CoreMark 实测数据。
七、常见问题解答
Q1:播不出来,一直转圈?
按这个顺序排查:
- 先测状态页(
/status/)能否打开 —— 打不开说明容器没跑起来 - 确认
network_mode: host—— 这是最常见的原因 - 确认组播地址正确 —— 抓包核对,不要靠记忆
- 确认路由器开了 IGMP 代理
- 确认 NAS 在 IPTV 的 VLAN 里
Q2:能看但很卡,怎么排查?
先分清是「源卡」还是「网络卡」:
- 换一个频道试试 —— 如果只有某个频道卡,是源的问题
- 用有线连接试 —— 如果 WiFi 卡、有线不卡,是无线带宽问题
- 看状态页的流量统计 —— 确认转发本身没丢包
Q3:换台要等 3-5 秒,正常吗?
正常。 组播转单播的换台延迟主要来自:
- 播放器重新发起 HTTP 请求
- 服务重新 IGMP Join
- 等待关键帧(I 帧)
想更快:用支持 FCC 快速换台协议的 rtp2httpd。
Q4:为什么只有部分频道能看?
常见原因:
- 频道列表不全 —— 你抓到的组播地址只是当时机顶盒订阅的
- 部分频道是加密的 —— 需要机顶盒授权,转发不了
- VLAN 不对 —— 有些运营商的直播和回看点播在不同 VLAN
Q5:手机连 WiFi 能看吗?
能,只要手机和 NAS 在同一个局域网。
但如果 NAS 在 IPTV VLAN 而手机在普通网络,需要路由器做跨 VLAN 路由。
Q6:会占用很多带宽吗?
关键概念:组播在局域网内只占一份带宽,不管多少人看。
但转成单播后,每路观看各占一份。
千兆局域网完全够用,但如果是 WiFi 需要注意信号质量。
Q7:运营商会发现我在内网转发吗?
技术上:转发发生在你的局域网内部,运营商侧看到的是和你机顶盒一样的 IGMP 订阅。
实际上:有些运营商会限制同时订阅数(比如只允许 2 路),超了会拒绝。
建议:不要过度并发,这既影响体验也可能触发限制。
Q8 补充:多拨会影响 IPTV 吗?
会。 如果你同时用了单线多拨,多拨产生的多线路出口可能干扰 IPTV 的 VLAN,
导致机顶盒无法通过 IGMP 组播。
建议:把 IPTV 接口排除在 mwan3 负载均衡之外,具体做法参考
OpenWrt单线多拨教程:mwan3实现网速叠加。
Q8:群晖 / 威联通 / 极空间都能跑吗?
都能,只要能跑 Docker。
唯一的差异是网络配置方式 —— 单网口和双网口的设置不同。
八、总结
三个方案一句话版
最容易踩的三个坑
- 忘了
network_mode: host—— 收不到组播,表现为「一直转圈」 - 光猫还在路由模式 —— VLAN 到不了 NAS,先做桥接
- 没开路由器 IGMP 代理 —— 组播包进不了你的局域网
核心价值
这套方案的本质是把运营商的 IPTV 从「一台机顶盒」解放出来,
变成「局域网里的一个 HTTP 流」——从此任何设备都能看,
而且可以自由选择播放器、自由组织频道列表。
部署成本几乎为零(NAS 本来就在跑),换来的体验提升很明显。