rtp2httpd FCC 快速换台:Apple TV 上换台更快
用 rtp2httpd 转发 IPTV 组播时,可以打开 FCC(Fast Channel Change,快速换台)。做法是在 M3U 里的频道地址后面加上 ?fcc=<FCC 服务器 IP>:<端口>。Revue 这边不需要任何设置。在我们的测试里,显示模式相同的频道之间换台,新台画面开始动的时间从约 2.3 秒缩短到约 1.7 秒。代价是直播画面比不开时晚 1–2 秒。
本文假设你已经按IPTV 组播转单播:用 udpxy、rtp2httpd 在 Apple TV 上看一文,用 rtp2httpd 在 Revue 里看上了频道。
FCC 是什么
普通组播换台慢,慢在等关键帧。视频里只有关键帧带完整画面,后面的帧都要靠它才能解出来。转发程序加入新频道的组播后,收到的第一段数据通常不是关键帧,播放器只能等下一个。关键帧之间一般隔 1 秒到几秒。
FCC 的做法是:换台时,rtp2httpd 先向 IPTV 网络里的 FCC 服务器要这个频道的数据。FCC 服务器从它缓存的关键帧开始,用单播发过来,速度比正常播放稍快(我们测到约 1.2 倍,持续约 10 秒)。单播追上组播后,rtp2httpd 切回组播,断开单播。播放器收到的始终是同一条连续的流,察觉不到切换。
准备
- rtp2httpd。udpxy 没有 FCC 功能。
- 你所在 IPTV 网络的 FCC 服务器地址和端口。它和组播地址一样,由你本地的 IPTV 网络决定,本文不提供。rtp2httpd 的文档《FCC 快速换台配置》介绍了查找方法。
- rtp2httpd 要能连到 FCC 服务器。按 rtp2httpd 文档,一般要求转发设备在 IPTV 网络上拿到了地址(通过 DHCP、IPoE 或 PPPoE),并用
upstream-interface指定 IPTV 一侧的网卡。 - rtp2httpd 跑在 NAS、二级路由这类 NAT 设备后面时,默认的 FCC 类型还需要设置
fcc-listen-port-range,并在上级路由器上做端口转发。详见同一篇 rtp2httpd 文档。转发设备直接接入 IPTV 网络时不需要。
第一步:在 M3U 里加上 FCC 参数
在 rtp2httpd 频道地址的末尾加上 ?fcc=<FCC 服务器 IP>:<端口>:
#EXTM3U
#EXTINF:-1 tvg-id="<节目单里的频道 id>" group-title="高清",<频道名>
http://<转发设备 IP>:5140/rtp/<组播地址>:<端口>?fcc=<FCC 服务器 IP>:<端口>
fcc-type用来选择 FCC 协议,可以不写。不写时等于telecom。按 rtp2httpd 文档,多数情况用它就能工作;少数网络需要在地址后再加&fcc-type=huawei。- 一个地址只能有一个
?。地址里已经有别的参数时,用&连接。 - 如果你用 rtp2httpd 的
external-m3u自动改写播放列表,可以直接在源列表的地址后面加参数:rtp://<组播地址>:<端口>/?fcc=<FCC 服务器 IP>:<端口>。 - 只想给部分频道打开 FCC,就只改这些频道的地址。
改完后,在 Revue 的频道列表页按遥控器的播放/暂停键,重新加载播放列表。
第二步:确认 FCC 生效
只凭感觉判断不可靠。下面两种方法任选一种。
看响应头(需要 rtp2httpd 3.16.0 或更新版本)。 在电脑的终端里运行:
curl -s -o /dev/null -D - --max-time 3 "http://<转发设备 IP>:5140/rtp/<组播地址>:<端口>?fcc=<FCC 服务器 IP>:<端口>"
这条命令只打印响应头,3 秒后自动退出。找到 R2H-FCC-Status 这一行:
active:这次是从 FCC 单播起播的,FCC 已生效。fallback:FCC 服务器没有回应,rtp2httpd 改走了普通组播。按文末的常见问题排查。- 没有这一行:地址里没带
fcc=,或者 rtp2httpd 的版本低于 3.16.0。
不要用 curl -I。对 HEAD 请求,rtp2httpd 不会去连 FCC 服务器,响应里也没有这一行。
看状态页。 在浏览器打开 http://<转发设备 IP>:5140/status。在 Apple TV 上换一个台,然后马上看这台 Apple TV 那一行(按「客户端」列里 Apple TV 的 IP 找):
- 「服务」列的地址末尾带着
?fcc=…,说明 Revue 用的是改好的地址。 - 换台后约 10 秒内,「状态」列显示「FCC 单播活跃」,说明 FCC 在工作。之后变成「组播活跃」,这是切回组播后的正常状态。
如果换台后一直只看到「组播活跃」,用上面的 curl 命令再确认一次。
能快多少
我们用一台 Apple TV 和 rtp2httpd 3.17.2 测了 6 个频道,其中有 4K HDR 频道。只在显示模式相同的频道之间换台,普通组播和 FCC 各换 24 次。下表是中位数,从按下换台算起:
| 普通组播 | 打开 FCC | |
|---|---|---|
| 声音出来 | 约 0.6 秒 | 约 0.4 秒 |
| 新台画面开始动 | 约 2.3 秒 | 约 1.7 秒 |
按频道看,打开 FCC 后画面早动 0.4–0.9 秒。不同网络、不同频道的关键帧间隔不一样,你的结果会有出入。
为什么有的播放器开了 FCC 也不觉得快
FCC 发来的第一段数据就从关键帧开始。但说明这路流里有哪些音视频的信息(PAT/PMT)常常晚零点几秒才到。有些播放器会丢掉这段信息到达之前收到的数据,开头那个关键帧也跟着丢了,只能再等下一个。这样开不开 FCC,差别不大。
Revue 会先把这段数据存起来,等这段信息到了再接着用,所以能用上 FCC 发来的第一个关键帧。普通组播起播时,这段信息到达之前收到的关键帧,Revue 也一样会用上。
什么时候帮不上
- tvOS 里打开了「匹配内容」,又在 SDR 频道和 4K HDR 频道之间换台,或者在帧率不同的频道之间换台时,电视要先切换显示模式。这一步要好几秒,时长取决于电视,FCC 缩短不了。显示模式相同的频道之间换台,才能明显感到 FCC 的效果。
- FCC 服务器没有回应时,rtp2httpd 只等 80 毫秒,就改走普通组播。频道照常能看,只是没有加速。
代价:直播画面会晚 1–2 秒
打开 FCC 后,Revue 播放的画面比不开时晚 1–2 秒。原因是 FCC 发来的数据从一个稍早的关键帧开始,Revue 从这一帧起按正常速度播放,所以一直落后这么多。这段延迟会保持到下次换台。Revue 不会为了追上实时画面而加速播放。
如果你很在意实时性,比如一边看比赛一边看手机上的比分,可以只给常换的频道打开 FCC,或者不打开。
常见问题
| 现象 | 原因和处理 |
|---|---|
| 打开了 FCC,换台还是一样慢 | 先按第二步确认 FCC 已生效。已生效还觉得慢,看看是不是在 SDR 和 4K HDR 频道之间换台:这时等待时间主要花在电视切换显示模式上。 |
R2H-FCC-Status 是 fallback |
FCC 服务器没有回应。依次检查:FCC 地址和端口是否正确;转发设备是否在 IPTV 网络上拿到了地址,upstream-interface 是否指向 IPTV 网卡;rtp2httpd 在 NAT 后面时,是否做了端口转发。也可以试试加上 &fcc-type=huawei。rtp2httpd 日志里的 FCC: Server response timeout 说的是同一件事。 |
| FCC 地址写错了,频道还能看吗 | 能。rtp2httpd 等不到回应就改走普通组播,只是没有加速。 |
| udpxy 能用 FCC 吗 | 不能。FCC 是 rtp2httpd 的功能,udpxy 没有。 |
| 改了频道地址,收藏会丢吗 | 一般不会。地址变了,Revue 会按 tvg-id 或频道名把收藏对应到新地址。前提是 tvg-id 或频道名在这个播放列表里没有重复。 |
其他播放问题的排查方法,见频道黑屏、卡顿、没声音怎么办。