时间处理说明
本文档详细说明 rtp2httpd 如何处理时移回看功能中的时间参数和时区转换。此机制同时适用于 RTSP 代理和 HTTP 代理。
时移回看原理
IPTV 运营商的服务器通常支持时移回看功能,允许用户观看过去时间段的直播内容。这个功能通过在 URL 中添加时间范围参数(如 playseek、tvdr 等)来实现。
基本工作流程:
客户端请求:客户端向上游服务器请求特定时间段的视频。
# RTSP 上游 rtsp://iptv.example.com:554/channel1?playseek=20240101120000-20240101130000 # HTTP 上游 http://iptv.example.com/channel1?playseek=20240101120000-20240101130000服务器响应:上游服务器根据时间参数,从录制的历史内容中返回对应时间段的视频流
时间格式要求:各地区 IPTV 运营商要求时间格式和时区可能有不同,有些期望 UTC 时区,有些期望 GMT+8 时区,有些期望
20240101120000这样的格式,有些期望20240101120000GMT这样的格式。各播放器对时区和时间格式的支持也五花八门。一旦播放器格式、时区和运营商不匹配,就会造成回看失败。
rtp2httpd 的作用
rtp2httpd 作为中间代理,能够根据配置灵活转换时间格式和时区,把播放器发来的时间和运营商期望的时间进行匹配。
核心特性:
- 自动识别多种时间格式(Unix 时间戳、yyyyMMddHHmmss、ISO 8601 等)
- 从 User-Agent 头解析客户端时区信息
- 智能时区转换(仅对需要转换的格式)
- 支持额外的时间偏移量(补偿时钟偏差)
- 保持输出格式与输入格式一致
Seek 参数配置
r2h-seek-name 参数(可选)
用于指定时移参数的名称。如果不指定,rtp2httpd 会自动识别常见的参数名。
自动识别的参数名(按优先级)
playseek- 最常见的时移参数tvdr- 部分 IPTV 系统使用的参数名
使用方法
- 标准参数名:当上游服务器使用
playseek或tvdr时,无需指定此参数 - 自定义参数名:当上游服务器使用其他参数名(如
seek、timeshift等)时,需要通过r2h-seek-name显式指定
示例
# RTSP 代理:自动识别 playseek 参数
http://192.168.1.1:5140/rtsp/iptv.example.com:554/channel1?playseek=20240101120000-20240101130000
# RTSP 代理:自动识别 tvdr 参数
http://192.168.1.1:5140/rtsp/iptv.example.com:554/channel1?tvdr=20240101120000-20240101130000
# RTSP 代理:使用自定义参数名
http://192.168.1.1:5140/rtsp/iptv.example.com:554/channel1?custom_seek=20240101120000&r2h-seek-name=custom_seek
# HTTP 代理:自动识别 playseek 参数
http://192.168.1.1:5140/http/iptv.example.com/channel1?playseek=20240101120000-20240101130000
# HTTP 代理:使用自定义参数名
http://192.168.1.1:5140/http/iptv.example.com/channel1?custom_seek=20240101120000&r2h-seek-name=custom_seekr2h-seek-offset 参数(可选)
当识别到时移参数时,额外增加的秒数偏移量,可以是正数或负数。
使用场景
- 补偿时钟偏差:上游服务器与实际时间存在固定偏差时
- 微调时移位置:需要提前或延后若干秒开始播放时
- 测试与调试:验证不同时间点的内容
示例
# RTSP 代理:在 playseek 指定的范围上增加 1 小时(3600 秒)
http://192.168.1.1:5140/rtsp/iptv.example.com:554/channel1?playseek=20240101120000-20240101130000&r2h-seek-offset=3600
# HTTP 代理:在 playseek 指定的范围上增加 1 小时(3600 秒)
http://192.168.1.1:5140/http/iptv.example.com/channel1?playseek=20240101120000-20240101130000&r2h-seek-offset=3600
# 在 playseek 指定的范围上减少 30 秒
http://192.168.1.1:5140/rtsp/iptv.example.com:554/channel1?playseek=20240101120000-20240101130000&r2h-seek-offset=-30r2h-start 参数(可选,仅 RTSP)
用于指定从特定时间点开始播放 RTSP 流,实现续播功能。此参数值会作为 NPT(Normal Play Time)格式的时间点,在 RTSP PLAY 请求中通过 Range: npt=<时间点>- 头发送给 RTSP 服务器。此参数仅对 RTSP 代理有效。
示例
http://192.168.1.1:5140/rtsp/iptv.example.com:554/channel1?r2h-start=123.45支持的时间格式
rtp2httpd 支持解析以下时间格式。只有当时间能够被成功解析时,才可以进行时区转换或应用 r2h-seek-offset 秒数偏移。
1. yyyyMMddHHmmss 格式(14 位数字)
playseek=20240101120000-202401011300002. Unix 时间戳格式(10 位以内数字)
playseek=1704096000-17040996003. yyyyMMddHHmmssGMT 格式(14 位数字 + GMT 后缀)
playseek=20240101120000GMT-20240101130000GMT4. ISO 8601 格式(包含 T 分隔符)
支持多种 ISO 8601 变体:
# 不带时区(使用 User-Agent 时区)
playseek=2024-01-01T12:00:00-2024-01-01T13:00:00
# 带 Z 后缀(UTC 时区,不做时区转换)
playseek=2024-01-01T12:00:00Z-2024-01-01T13:00:00Z
# 带时区偏移(保留原时区,不做时区转换)
playseek=2024-01-01T12:00:00+08:00-2024-01-01T13:00:00+08:00
# 带毫秒
playseek=2024-01-01T12:00:00.123-2024-01-01T13:00:00.456特点:
- 如果包含时区信息(Z 或 ±HH:MM),使用该时区,忽略 User-Agent 时区
- 如果不包含时区信息,使用 User-Agent 中的时区进行转换
- 输出格式保持原有的时区后缀(Z、±HH:MM 或无后缀)
- 支持毫秒精度(.sss)
时区处理机制
时区识别
服务器会解析 User-Agent 中的 TZ/ 标记来获取客户端时区信息:
支持的时区格式
TZ/UTC+8- UTC 偏移格式(东八区)TZ/UTC-5- UTC 偏移格式(西五区)TZ/UTC- 标准 UTC 时区
默认行为
如果 User-Agent 中没有时区信息,则不进行任何时区转换,只应用 r2h-seek-offset 指定的秒数偏移。
NOTE
rtp2httpd 按以下步骤处理时间参数:
- 解析时间格式 — 识别参数值属于哪种格式:Unix 时间戳(≤10 位数字)、
yyyyMMddHHmmss(14 位数字)、yyyyMMddHHmmssGMT(14 位 + GMT 后缀)、ISO 8601(包含T分隔符) - 解析 User-Agent 时区 — 从 User-Agent 中查找
TZ/标记,提取 UTC 偏移量(秒)。如果没有时区信息,默认为 0(UTC) - 时区转换 — Unix 时间戳和 ISO 8601 带时区的格式跳过转换;
yyyyMMddHHmmss和 ISO 8601 无时区的格式应用 User-Agent 时区转换 - 应用
r2h-seek-offset— 如果指定了该参数,对所有格式应用额外的秒数偏移(可正可负) - 格式化输出 — 保持原始格式,保留原有时区后缀(如有)
- 附加到上游 URL — 将处理后的时间参数作为查询参数附加到上游请求中(RTSP 发送 DESCRIBE 请求,HTTP 转发给上游服务器)