跳转到内容

时间处理说明

本文档详细说明 rtp2httpd 如何处理时移回看功能中的时间参数和时区转换。此机制同时适用于 RTSP 代理和 HTTP 代理。

时移回看原理

IPTV 运营商的服务器通常支持时移回看功能,允许用户观看过去时间段的直播内容。这个功能通过在 URL 中添加时间范围参数(如 playseektvdr 等)来实现。

基本工作流程

  1. 客户端请求:客户端向上游服务器请求特定时间段的视频。

    # RTSP 上游
    rtsp://iptv.example.com:554/channel1?playseek=20240101120000-20240101130000
    
    # HTTP 上游
    http://iptv.example.com/channel1?playseek=20240101120000-20240101130000
  2. 服务器响应:上游服务器根据时间参数,从录制的历史内容中返回对应时间段的视频流

  3. 时间格式要求:各地区 IPTV 运营商要求时间格式和时区可能有不同,有些期望 UTC 时区,有些期望 GMT+8 时区,有些期望 20240101120000 这样的格式,有些期望 20240101120000GMT 这样的格式。各播放器对时区和时间格式的支持也五花八门。一旦播放器格式、时区和运营商不匹配,就会造成回看失败。

rtp2httpd 的作用

rtp2httpd 作为中间代理,能够根据配置灵活转换时间格式和时区,把播放器发来的时间和运营商期望的时间进行匹配。

核心特性

  • 自动识别多种时间格式(Unix 时间戳、yyyyMMddHHmmss、ISO 8601 等)
  • 从 User-Agent 头解析客户端时区信息
  • 智能时区转换(仅对需要转换的格式)
  • 支持额外的时间偏移量(补偿时钟偏差)
  • 保持输出格式与输入格式一致

Seek 参数配置

r2h-seek-name 参数(可选)

用于指定时移参数的名称。如果不指定,rtp2httpd 会自动识别常见的参数名。

自动识别的参数名(按优先级)

  1. playseek - 最常见的时移参数
  2. tvdr - 部分 IPTV 系统使用的参数名

使用方法

  • 标准参数名:当上游服务器使用 playseektvdr 时,无需指定此参数
  • 自定义参数名:当上游服务器使用其他参数名(如 seektimeshift 等)时,需要通过 r2h-seek-name 显式指定

示例

url
# 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_seek

r2h-seek-offset 参数(可选)

当识别到时移参数时,额外增加的秒数偏移量,可以是正数或负数。

使用场景

  • 补偿时钟偏差:上游服务器与实际时间存在固定偏差时
  • 微调时移位置:需要提前或延后若干秒开始播放时
  • 测试与调试:验证不同时间点的内容

示例

url
# 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=-30

r2h-start 参数(可选,仅 RTSP)

用于指定从特定时间点开始播放 RTSP 流,实现续播功能。此参数值会作为 NPT(Normal Play Time)格式的时间点,在 RTSP PLAY 请求中通过 Range: npt=<时间点>- 头发送给 RTSP 服务器。此参数仅对 RTSP 代理有效。

示例

url
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-20240101130000

2. Unix 时间戳格式(10 位以内数字)

playseek=1704096000-1704099600

3. yyyyMMddHHmmssGMT 格式(14 位数字 + GMT 后缀)

playseek=20240101120000GMT-20240101130000GMT

4. 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 按以下步骤处理时间参数:

  1. 解析时间格式 — 识别参数值属于哪种格式:Unix 时间戳(≤10 位数字)、yyyyMMddHHmmss(14 位数字)、yyyyMMddHHmmssGMT(14 位 + GMT 后缀)、ISO 8601(包含 T 分隔符)
  2. 解析 User-Agent 时区 — 从 User-Agent 中查找 TZ/ 标记,提取 UTC 偏移量(秒)。如果没有时区信息,默认为 0(UTC)
  3. 时区转换 — Unix 时间戳和 ISO 8601 带时区的格式跳过转换;yyyyMMddHHmmss 和 ISO 8601 无时区的格式应用 User-Agent 时区转换
  4. 应用 r2h-seek-offset — 如果指定了该参数,对所有格式应用额外的秒数偏移(可正可负)
  5. 格式化输出 — 保持原始格式,保留原有时区后缀(如有)
  6. 附加到上游 URL — 将处理后的时间参数作为查询参数附加到上游请求中(RTSP 发送 DESCRIBE 请求,HTTP 转发给上游服务器)

相关文档

基于 GPL-2.0 许可证发布