IPTV 组播转单播:用 udpxy、rtp2httpd 在 Apple TV 上看
Revue 不能直接播放 rtp://、udp:// 这类组播地址。做法是:在路由器、软路由或 NAS 上运行 udpxy 或 rtp2httpd,把 IPTV 组播转成 HTTP 单播;再把 http://<转发设备 IP>:<端口>/rtp/<组播地址>:<端口> 这样的地址写入 M3U 播放列表,添加到 Revue。转换后的流是 MPEG-TS,Revue 原生解码 1080i 隔行视频以及 MP2、AC-3、E-AC-3 音频,并能逐台识别 4K HLG。
路由器端的配置教程已有不少。本文只讲必要的设置要点,重点介绍转换后 Apple TV 怎么播放、遇到问题怎么排查。
整体思路
- 把 IPTV 网络(通常是一个独立的 VLAN)接入一台常开设备,比如路由器、软路由或 NAS。
- 设备上的 udpxy 或 rtp2httpd 按需加入组播组,把收到的流转成 HTTP 发送给客户端。
- Apple TV 连接家庭局域网,通过普通的 HTTP 地址直接播放。
这样做有两个好处。一是避免组播流量进入 Wi-Fi:组播在 Wi-Fi 上以最低基础速率广播,而且丢包不重传,播放高码率频道很容易卡顿。二是家里多台设备可以共用同一个转发程序。
准备
- 一台能接入 IPTV 网络的常开设备,用来运行 udpxy 或 rtp2httpd:OpenWrt 路由器、软路由、NAS,或者能跑 Docker 的电脑都行。
- 频道的组播地址和端口。本文不提供,也不介绍获取方法。请只播放你有权观看的频道。
- 搭载 tvOS 26 或更高版本的 Apple TV,并已安装 Revue。
第一步:让组播进到转发设备
VLAN。 很多 IPTV 网络使用独立 VLAN 传输。「单线复用」指用一根网线通过 802.1Q 标签同时承载上网和 IPTV 两个 VLAN,再由路由器按标签拆开。VLAN ID 因各家网络而异,以你本地网络的实际设置为准。设置好后,转发设备上会出现一个接入 IPTV 网络的网卡接口,比如 eth0.<VLAN ID>。后续配置转发程序时会用到这个名称。
IGMP。 udpxy 和 rtp2httpd 会自动在 IPTV 网卡上加入组播组。如果转发程序直接运行在接入 IPTV 网络的那台设备上,不需要安装 igmpproxy。只有机顶盒这类需要直接接收组播的设备接在路由器下游时,才需要使用 igmpproxy 或 omcproxy。
IGMP snooping。 局域网里的交换机或网桥开启 IGMP snooping 后,组播只会发给已订阅的端口,不会灌满整个局域网和 Wi-Fi。OpenWrt 的网桥默认关闭 snooping。开启 snooping 后,如果网络中没有 IGMP 查询器,成员关系就会超时,表现为播放几分钟后断流。解决办法是开启查询器(OpenWrt 网桥中的 multicast_querier),或者让转发程序定期重新加入组播组。
防火墙。 转发设备需要在 IPTV 一侧放行 IGMP,以及目的地址在 224.0.0.0/4 的 UDP 流量。只开放转发程序本身的 TCP 端口是不够的。
第二步:运行 udpxy 或 rtp2httpd
两个程序都能把组播转成基于 HTTP 的 MPEG-TS 流,Revue 均可直接播放。
| udpxy | rtp2httpd | |
|---|---|---|
| 维护情况 | 不再增加新功能,偶有修复 | 持续维护 |
| 默认端口 | 没有默认值,必须用 -p 指定,常用 4022 |
5140 |
| 默认客户端数上限 | 3 | 5 |
| 额外功能 | 无 | FCC 快速换台、RTSP 转 HTTP、带客户端列表的状态页 |
| 安装 | OpenWrt 官方源有 udpxy 和 luci-app-udpxy |
OpenWrt 官方源没有;项目发布页提供安装包,也有官方 Docker 镜像 |
想省事、设备上已经装好,用 udpxy。需要快速换台或更多诊断信息,用 rtp2httpd。
udpxy
常用参数:
-p:监听端口,必填。-a:监听的网卡,也就是 Apple TV 访问的局域网一侧。-m:接收组播的网卡,也就是 IPTV 一侧。-c:最大客户端数,默认只有 3。家里有多台设备同时看,需要调大。-M:每隔多少秒重新加入组播组,默认关闭。遇到定时断流时可以设成 30 以上。
例如:
udpxy -p 4022 -a <局域网网卡> -m <IPTV 网卡> -c 10
在 OpenWrt 上,/etc/config/udpxy 默认是 disabled '1',需要改成 0 才会启动。配置项和参数的对应关系:bind 对应 -a,source 对应 -m,max_clients 对应 -c,mcsub_renew 对应 -M。
运行后,在浏览器打开 http://<转发设备 IP>:4022/status,能看到状态页,说明程序已正常运行。
频道地址的格式:
http://<转发设备 IP>:4022/udp/<组播地址>:<端口>
http://<转发设备 IP>:4022/rtp/<组播地址>:<端口>
/udp/ 会自动识别流是裸 TS 还是 RTP 封装;/rtp/ 直接按 RTP 封装处理。不确定时优先使用 /udp/。
rtp2httpd
常用设置:
- 监听端口默认 5140。
--upstream-interface(配置文件里是upstream-interface):IPTV 一侧的网卡。这里要填ip link里查到的实际设备名,不能填 OpenWrt 的逻辑接口名。--maxclients(配置文件里是maxclients):最大客户端数,默认 5。注意 rtp2httpd 的-m是客户端数,和 udpxy 的-m意思不同。- 配置文件里的
mcast-rejoin-interval:定期重新加入组播组,默认关闭。遇到定时断流时,官方文档建议设成 30 到 120 秒。
配置文件默认在 /etc/rtp2httpd.conf,OpenWrt 上使用 /etc/config/rtp2httpd。用 Docker 运行时,必须使用 host 网络模式。
运行后,访问 http://<转发设备 IP>:5140/status 即可查看状态页,页面会显示每个客户端的地址和实时带宽。频道地址格式:
http://<转发设备 IP>:5140/rtp/<组播地址>:<端口>
rtp2httpd 的 /rtp/ 和 /udp/ 没有区别,用哪个都行。FCC 快速换台需要你所在网络的 FCC 服务器地址,请以你本地网络的实际设置为准。
第三步:写 M3U 播放列表
把每个频道写成一条 #EXTINF 加一行 HTTP 地址:
#EXTM3U
#EXTINF:-1 tvg-id="<节目单里的频道 id>" group-title="高清",<频道名>
http://192.168.1.1:4022/udp/<组播地址>:<端口>
- 如果手里是
rtp://或udp://格式的列表,把每行改写成上面的 HTTP 形式即可。rtp2httpd 也可以在配置里通过external-m3u读取外部 M3U,并从/playlist.m3u自动输出改写好的列表。 - 把 M3U 文件存放在 Apple TV 能通过 HTTP 访问的地方,比如 NAS 或路由器上的 Web 服务。Revue 不支持从本地文件导入播放列表。
- 要显示节目单,在
tvg-id里填写 XMLTV 里对应的频道id。Revue 不会读取播放列表首行的x-tvg-url,节目单地址需要在设置里单独填写。
第四步:在 Revue 里添加并播放
- 在 Revue 里进入 设置 › M3U 播放列表(IPTV) › 添加 M3U 播放列表,填上 M3U 文件的地址并保存。详细步骤见导入 M3U 播放列表和节目单。
- 打开一个频道,按遥控器的右键。右上角的面板会显示格式,比如
1080i@25、码率9.6 Mbps、HLG 频道的HDR,以及杜比或多声道音频的格式。能看到码率数值在跳动,就说明数据正在正常传入。 - 想让电视跟随频道切换 50Hz 和 HDR,可在 tvOS 设置里打开「匹配内容」。
如果你的 IPTV 网络还提供 RTSP 单播地址,Revue 也能直接播放,不需要转发。前提是 RTSP 里封装的是 MPEG-TS,并且服务器支持 TCP 传输;不支持需要登录的 RTSP。
常见问题
| 现象 | 原因和处理 |
|---|---|
| 「无法播放」,下面是「不支持的URL」 | 播放列表里仍是 rtp:// 或 udp:// 地址。改写成转发程序的 HTTP 地址。 |
| 一直加载,放不出来 | 先在电脑上用 VLC 打开同一个 HTTP 地址测试。如果 VLC 也放不了,说明问题在转发这一侧:检查转发程序的 IPTV 网卡设置(udpxy 的 -m、rtp2httpd 的 --upstream-interface)和防火墙。状态页能打开,只说明局域网这一侧正常,不代表组播收到了。 |
| 看几分钟就断,或者隔固定时间断一次 | 打开了 IGMP snooping,但网络里没有查询器。打开查询器,或者让转发程序定期重新加入(udpxy 的 -M、rtp2httpd 的 mcast-rejoin-interval)。 |
| 卡顿、花屏 | 转发设备接 IPTV 的一侧必须用网线,组播切忌走 Wi-Fi。4K 频道码率高,Apple TV 尽量也接网线。 |
| 一台能看,再开一台就打不开 | 转发程序的客户端连接数达到上限。udpxy 默认 3 个,rtp2httpd 默认 5 个,按需调大。 |
| 有画面没声音 | Revue 支持 AAC、MP2、AC-3 和 E-AC-3。采用其他音频格式的频道会没有声音。播放中途若切换到 AirPlay 音箱,换个台或重新打开频道。 |
| 有声音没画面 | 这个频道可能是 MPEG-2 视频,Revue 不支持解码 MPEG-2 视频。 |
| 换台时黑屏 1–2 秒 | 打开「匹配内容」后,电视在切换帧率或动态范围,属于正常现象。格式相同的频道之间换台不会再次黑屏。 |
| 换台慢 | 每次换台,转发程序都要重新加入组播组,再等到下一个关键帧才能出画面。rtp2httpd 的 FCC 可以缩短这段时间,前提是网络里有 FCC 服务器,见rtp2httpd FCC 快速换台。 |
更多播放问题的排查方法,见频道黑屏、卡顿、没声音怎么办。