前阵子刷到 tmxk 的一期视频《告别 udpxy!这款 IPTV 转发神器太强了:秒换台、支持回看、还能公网共享》(2026-09-29 发布),讲的是用 rtp2httpd 替代 udpxy 做 IPTV 组播转发。我把 17 分钟的视频看了几遍,又对照 rtp2httpd 的官方文档(2026-10-16 核验)把每一步命令和参数都对了一遍,整理成这篇小白向的部署教程:从零开始,照着敲命令、照着点页面,就能把这套转发服务跑起来。
先说结论:rtp2httpd 是开源项目 https://github.com/stackia/rtp2httpd(GPL-2.0),专为中国大陆 IPTV 环境优化,定位就是 udpxy / msd_lite 的无缝替代。纯 C 编写、x86_64 二进制只有 509KB,路由器、光猫、NAS 都能跑。
一、先搞懂:为什么要换掉 udpxy?
udpxy 是老牌组播转单播工具,能用,但有三个硬伤,视频里总结得很到位,我转述一下:
- 换台慢:每次换台黑屏等 2~5 秒。原因是视频编码用帧间压缩,播放器中途加入组播流时,收到的第一个包大概率不是关键帧(IDR 帧),必须等到下一个关键帧才能解码。关键帧间隔(GOP)通常 1~5 秒,这就是黑屏等待的来源。
- 不支持 RTSP 历史回看:很多地区的 IPTV 有 RTSP 时移/回看源,udpxy 转不了。
- WiFi / 公网下容易花屏卡顿:UDP 天生怕抖动丢包,WiFi 一抖就花屏。
rtp2httpd 针对这三点分别给了方案:FCC 快速换台协议(运营商机顶盒同款,换台 < 1 秒)、RTSP→HTTP 完整协议栈(支持时移回看)、RTP 乱序恢复 + Reed-Solomon FEC 前向纠错(抗抖动丢包)。另外它完全兼容 udpxy 的 URL 格式,老播放列表基本不用改就能迁移。
二、部署前准备:先对齐这几件事
小白最容易在这里翻车,所以先把前置条件说清楚:
⚠️ 最重要的前提先说,一句话:你家必须先办了运营商的 IPTV 业务,这套东西才有意义。rtp2httpd 自己不提供任何频道,也不破解任何信号,它只是一个”翻译官”——把你家里已有的 IPTV 组播信号,翻译成手机、电视、浏览器、公网都能看的 HTTP 流。如果你家没办电信 / 联通 / 移动的 IPTV(比如只有宽带,平时靠视频 App 看电视),那就没有信号源可转,装了也看不了。这个前提不满足,后面可以直接不用往下看了。
- 一台能跑它的设备:首选 OpenWrt 软路由(视频里也是在软路由上部署的);其次是任何能跑 Docker 的设备(NAS、Linux 小主机);macOS/Linux 也行。注意:这台设备必须能访问你家的 IPTV 组播网络——通常意味着要先做「IPTV 网络融合」(让软路由通过 DHCP 从运营商拿到 IPTV 内网 IP)。如果你家是光猫拨号、IPTV 口独立,先去搜「OpenWrt IPTV 融合」把这一步搞定,这是地基。
- 你的组播源地址:形如
rtp://239.253.64.120:5140这种。各省运营商都不一样,且只在你自家 IPTV 内网里有效,网上抄别人的地址大概率用不了。获取途径:从自家光猫/机顶盒抓包,或找同地区网友整理好的列表。 - 知道三个概念就行:组播(运营商一次发送、多人同时收,省带宽但 WiFi/手机播不了)→ rtp2httpd 把它转成 HTTP 单播(手机、电视、浏览器都能播);FCC(快速换台协议,后面细讲);时移回看(看已经播过的节目,需要 RTSP 回看源)。
三、部署:OpenWrt 一键安装(推荐小白走这条)
官方提供了一键安装脚本,我核对过脚本地址和逻辑(自动识别 CPU 架构、从 GitHub Release 拉最新版、装主程序 + LuCI 界面 + 中文语言包):
第 1 步:SSH 连上软路由,跑一键脚本
# SSH 登录你的 OpenWrt(把 192.168.1.1 换成你路由器的实际 IP)
ssh root@192.168.1.1
# 跑官方一键安装/更新脚本(已装过再跑一遍就是升级,会先卸载旧版)
uclient-fetch -q -O - https://raw.githubusercontent.com/stackia/rtp2httpd/main/scripts/install-openwrt.sh | sh
脚本跑完没有报错就是装好了。如果你的软路由连不上 GitHub(raw.githubusercontent.com),可以手动去 Releases 页面下载对应架构的三个 ipk 传上去装:
# 先查自己设备的架构
cat /etc/openwrt_release | grep ARCH
# 把下好的三个包传到路由器后执行(主程序 + LuCI 界面 + 中文语言包)
opkg install rtp2httpd_*.ipk luci-app-rtp2httpd_*.ipk luci-i18n-rtp2httpd-*.ipk
第 2 步:在 LuCI 网页里做基础配置
浏览器打开路由器后台 → 左侧菜单「服务」→ 找到「rtp2httpd」,三个必填项:
- 启用:勾选。
- 端口:默认 5140,保持默认就行,后面所有地址都用它。
- 上游接口(在「网络与性能」里):选接到 IPTV 网络的那个接口,不是 LAN 也不是 WAN。选错了后面所有频道都黑屏,这是最高频的翻车点。
另外如果你手里已经有一份 M3U 播放列表,可以在「播放器与 M3U」→「外部 M3U」里填进去,后面就能直接用内置播放器看。
保存并应用后如果 LuCI 页面显示异常(排版错乱、点不动),别慌:按 Ctrl+F5 强制刷新,或清空浏览器缓存,或开无痕窗口重进。官方文档明确写了这是版本更新后的已知现象。
第 3 步:验证服务跑起来了
在浏览器里依次打开这几个地址(把 192.168.1.1 换成你路由器的 IP):
# 状态页:能看到运行状态、客户端连接、带宽统计,页面底部还能看实时日志
http://192.168.1.1:5140/status
# 直接播一个组播频道(把组播地址换成你自己的源)
http://192.168.1.1:5140/rtp/239.253.64.120:5140
# 转换后的标准 M3U 播放列表(配了外部 M3U 或 FCC 后在这里拿)
http://192.168.1.1:5140/playlist.m3u
# 内置 Web 播放器(配好 M3U 后,浏览器直接看,不用装 App)
http://192.168.1.1:5140/player
/status 能打开、能看到日志在滚动,说明服务本身是好的;单个频道黑屏,多半是组播源地址或上游接口的问题,往下看排查章节。
备选路线:Docker 一条命令跑起来
如果你的设备是 NAS 或 Linux 小主机、习惯用 Docker,官方也给了标准姿势。注意必须用 host 网络模式,否则收不到组播:
docker run -d --name rtp2httpd --restart=always \
--network=host --cap-add=NET_ADMIN \
ghcr.io/stackia/rtp2httpd:latest \
--noconfig --verbose 2 --listen 5140 --maxclients 20
参数解释一下:--network=host 让容器和宿主机共用网络栈(收组播必需);--cap-add=NET_ADMIN 允许调大 UDP 接收缓冲区(抗丢包);--listen 5140 监听端口;--maxclients 20 最多 20 个客户端。跑起来后验证地址和上面一样,只是把 192.168.1.1 换成这台设备的局域网 IP。
需要配置文件的写法(docker-compose 版)官方文档也有,这里不展开,上面这条命令对小白已经够用。
⚠️ 注意别抄错镜像名:网上有些教程写的是 stackia/rtp2httpd:latest,默认去 Docker Hub 拉,但 Docker Hub 上没有官方的这个仓库,照抄会报 pull access denied / repository does not exist。官方镜像只发布在 GitHub 容器仓库,镜像名必须是 ghcr.io/stackia/rtp2httpd:latest,前面的 ghcr.io/ 不能漏。另外换行只是排版,\ 续行和写成一行执行起来完全一样,不用纠结。
四、核心卖点一:FCC 秒换台(毫秒级)
原理一句话
前面说过,换台慢是因为要等关键帧。FCC 服务器缓存了每个频道最近的关键帧:你一切台,rtp2httpd 先向 FCC 服务器要单播流(第一帧就是能直接解码的 IDR 帧,立刻出画面),同时加入组播组,等单播和组播数据对齐后无缝切回组播、断开单播。整个过程播放器无感知。
第 1 步:找到你地区的 FCC 服务器
这是最难的一步,因为 FCC 地址各地不同:
- 先去官方文档里的「各地 FCC 地址汇总」碰碰运气,看有没有你所在的省/运营商。
- 没有的话,从自家 IPTV 机顶盒抓包:用 Wireshark 抓机顶盒流量,搜
ChannelFCCIP(FCC 服务器 IP)和ChannelFCCPort(端口)两个字段;或者装官方提供的 Wireshark FCC 协议插件,直接过滤fcc抓换台时的数据包,对端 IP:端口就是。
第 2 步:在 URL 里带上 FCC 参数
# 默认电信/中兴/烽火 FCC 协议(大多数情况用这个就行)
http://192.168.1.1:5140/rtp/239.253.64.120:5140?fcc=10.255.14.152:15970
# 华为 IPTV 平台可指定华为协议(端口通常是 8027)
http://192.168.1.1:5140/rtp/239.253.64.120:5140?fcc=10.255.14.152:8027&fcc-type=huawei
如果你用 M3U 播放列表(推荐),在源地址上直接加参数,rtp2httpd 会自动识别转换:
rtp://239.253.64.120:5140/?fcc=10.255.14.152:15970
一个完整的 M3U 片段长这样,填进「外部 M3U」或保存成文件都行:
#EXTM3U
#EXTINF:-1,CCTV-1
http://192.168.1.1:5140/rtp/239.253.64.120:5140?fcc=10.255.14.152:15970
#EXTINF:-1,CCTV-2
http://192.168.1.1:5140/rtp/239.253.64.121:5140?fcc=10.255.14.152:15970
第 3 步:验证 FCC 真的生效了
- 换台体感:FCC 生效时换台延迟 < 1 秒;没生效是 2~5 秒。但注意:播放器本身也得是针对 IPTV 优化过的,比如 mytv-android、TiviMate、Cloud Stream,或 rtp2httpd 自带的 Web 播放器。用 PotPlayer 这类通用播放器,起播慢是播放器自己的锅,FCC 效果看不出来。
- 看日志:SSH 上跑
logread -e rtp2httpd(或看/status页面底部),出现FCC: Unicast stream started successfully就是成了;出现FCC: Server response timeout (80 ms), falling back to multicast说明 FCC 地址无效或网络不通,回退到纯组播了。
跑在 NAT 后面的特别注意
如果 rtp2httpd 装在 NAS、二级路由这种 NAT 后面的设备上(不是直接拿到 IPTV 内网 IP 的那台):华为 FCC 协议原生支持 NAT 穿透,不用额外配置;电信协议则需要手动指定一个监听端口段,并在上级路由把这个端口段转发过来:
# 命令行参数写法
rtp2httpd --fcc-listen-port-range 40000-40100
# 配置文件写法([global] 段)
fcc-listen-port-range = 40000-40100
然后在上级路由器上把 40000~40100 的 UDP/TCP 端口转发到跑 rtp2httpd 的设备。能选的话优先用华为 FCC(8027 端口),省掉这一步。
五、核心卖点二:RTSP 时移回看
如果你所在地区的 IPTV 提供 RTSP 时移源,rtp2httpd 能把 RTSP 转成 HTTP,并在 M3U 里自动处理 catchup-source 时移回看地址。配置好 M3U 后,打开内置播放器(http://路由器IP:5140/player),有 EPG 节目单的频道可以直接点过去的节目回看。这是 udpxy 时代做不到的事,也是视频标题里「支持回看」的来源。
注意两点:一是回看必须有 RTSP 回看源,纯组播 RTP 源变不出回看;二是浏览器受解码能力限制,个别频道在 Web 播放器里可能黑屏或无声,换电视/手机 App 播一般就正常了。
六、电视 / 手机端接入:把播放列表填进去就行
服务端跑通后,播放端非常简单:把 http://路由器IP:5140/playlist.m3u 填进你习惯的 IPTV 播放器。视频里演示用的是 mytv-android,TiviMate、Cloud Stream 也都可以。局域网内直接填内网地址就能看。
七、核心卖点三:公网共享(出门也能看)
rtp2httpd 转出来的本来就是标准 HTTP 单播流,所以「公网看」的本质就是:让外网能访问到你这台设备的 5140 端口。做法和其它自建服务一样:路由器上做端口映射 + DDNS 域名,或用内网穿透。但安全必须先做,否则一定被薅:
公网上有大量自动化扫描器,专门探测开放的 udpxy / msd_lite 这类无认证转发服务,发现就持续盗用你的上行带宽。rtp2httpd 默认兼容 udpxy URL 格式,裸奔暴露等于主动送人头。官方文档给的安全基线(写进配置文件 [global] 段):
[global]
# 绑定的域名(反代场景下用)
hostname = iptv.example.com
# 访问令牌:自己生成一串随机字符,例如 openssl rand -hex 16 的输出
# 之后所有 URL 都要带上 ?r2h-token=你的令牌 才能访问
r2h-token = 换成你自己生成的随机字符串
# 把默认的状态页和播放器路径改掉,别让扫描器一眼认出来
status-page-path = /my-status-page
player-page-path = /my-player
有条件的话,前面再架一层 nginx / Caddy 反向代理做转发,并打开 rtp2httpd 的 xff = yes 让它能拿到客户端真实 IP。nginx 参考配置(官方文档原样):
server {
listen 80;
server_name iptv.example.com;
location / {
proxy_pass http://127.0.0.1:5140;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
# 流媒体必须关掉代理缓冲
proxy_buffering off;
}
}
还要面对一个现实问题:上行带宽。一条 1080p 的 IPTV 流码率通常 6~10 Mbps,4K 可达 30~40 Mbps。家庭宽带上行标称 30~50Mbps,实际能跑满的不多,跨运营商(比如移动宽带上传给电信用户看)还可能被限到几 Mbps。所以公网分享前先算一笔账:上行 ÷ 单流码率 = 你能同时带几个人。带宽不够时的症状很典型:日志里刷缓冲池扩容、/status 页出现「慢客户端」标记、观看端频繁花屏卡顿——这时候不是软件问题,是管子太细。
八、常见问题排查(对照着查)
| 症状 | 先查什么 |
|---|---|
| 所有频道黑屏 / 连不上 | ① 上游接口选错了没(必须选 IPTV 口);② 软路由到底拿没拿到 IPTV 内网 IP(DHCP/融合那步);③ 组播源地址本身在你这网里通不通 |
| WiFi 下花屏、卡顿 | UDP 怕抖动是天性:先确认 rtp2httpd 的乱序恢复/FEC 在工作;换 5GHz 或有线对比;公网看还花屏就查上行带宽(见第七节) |
| FCC 配了但换台还是慢 | ① 看日志有没有 Server response timeout(地址无效/接口不对就回退组播了);② 换个 IPTV 优化的播放器再试(PotPlayer 不行);③ NAT 后面跑电信 FCC 记得做端口段转发 |
| 升级后 LuCI 页面错乱 | Ctrl+F5 强制刷新,或清浏览器缓存,或无痕模式重进(官方已知现象) |
| 想看日志 | 三处:/status 页面底部、OpenWrt 后台「状态→系统日志」、SSH 跑 logread -e rtp2httpd |
九、总结
整套链路捋一遍:软路由做好 IPTV 融合 → 一键装 rtp2httpd → LuCI 里启用、选对上游接口 → /status 验证 → 配 M3U + FCC 参数 → 播放器填 /playlist.m3u →(可选)做安全加固后公网分享。udpxy 能干的它都能干,还多了秒换台、RTSP 回看、Web 管理和内置播放器,URL 还兼容,迁移成本几乎为零。
最后划两条线:一是组播源和 FCC 地址都跟地区/运营商强绑定,这篇文章给的是方法和格式,现成的地址得你自己从自家网络里找;二是公网分享务必先做鉴权再映射端口,裸奔的转发服务在公网上活不过几天。视频原片在 tmxk 频道(2026-09-29 期),想看演示效果的可以去搜标题《告别 udpxy!这款 IPTV 转发神器太强了》。
内容来源与核验说明:本文整理自 tmxk 上述视频的内容框架,全部命令、参数、URL 格式均对照 rtp2httpd 官方 GitHub 仓库与文档站(rtp2httpd.com)于 2026-10-16 逐条核验。结论分级:✅ 已确认——项目身份与核心功能(FCC/RTSP 回看/udpxy 兼容/Web 管理)、OpenWrt 一键脚本、Docker host 网络要求、FCC URL 参数格式、公网安全基线配置;⚠️ 需读者自行验证——组播源地址、FCC 服务器地址的有效性(因地区而异)、IPTV 融合步骤(各家光猫/软路由不同);❓ 未验证——视频中演示的具体换台耗时数字(官方文档只给”<1 秒 vs 2~5 秒”的量级对比)。文中为预留的实拍配图位置,部署实测时补拍并做红框标注后替换。