使用时间码将媒体工作流与直播内容同步

本页介绍了如何使用时间戳在 Live Stream API 中将媒体工作流与直播内容同步。借助时间码功能,您可以将作为带内数据提供的时间码输入传递到播放清单。然后,您可以将内部媒体工作流与直播内容同步。例如,您可以将独立生成的元数据注释与直播内容进行匹配,或将内部直播内容与 Live Stream API 输出保持一致。

时间码数据需要符合 SMPTE 12M 规范(请参阅 ST 12-2:2008)。对于 H264,时间码数据在画面同步补充增强信息 (SEI) 消息中传输。对于 H265,时间码数据在时间码 SEI 消息中传输。

使用嵌入式时间码

如需使用嵌入在输入流中的时间码,请将以下 timecodeConfig 添加到 Channel 资源:

"timecodeConfig": {
  "source": "EMBEDDED_TIMECODE"
}

source 字段的默认值为 MEDIA_TIMESTAMP

默认情况下,系统会使用世界协调时间 (UTC) 时区来解读时间码。如需使用其他时区,请设置 timeZoneutcOffset 字段:

"timecodeConfig": {
  "source": "EMBEDDED_TIMECODE",

  "timeZone": {"id": "America/Los_Angeles"}
  // or
  "utcOffset": "-28800s" // -8 hours from UTC
}

设置 timeZone 字段时会考虑夏令时。 如需了解详情,请参阅如何解读输入时间码

在输出清单中添加时间码

您可以将 useTimecodeAsTimeline 字段设置为 true,以包含每个输出清单的时间戳:

"manifests": [
  {
    "key": "manifest_hls",
    "file_name": "manifest.m3u8",
    "type": "HLS",
    "muxStreams": ["mux_720p", "mux_540p"],
    "useTimecodeAsTimeline": true
  },
  {
    "key": "manifest_dash",
    "file_name": "manifest.mpd",
    "type": "DASH",
    "muxStreams": ["mux_720p", "mux_540p"],
    "useTimecodeAsTimeline": true
  }
]

HLS 清单文件

对于 HLS 直播,系统会将时间戳作为媒体 M3U8 清单文件中每个片段的 #EXT-X-PROGRAM-DATE-TIME 标记发出,其格式类似于以下示例:

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:25.529Z
#EXTINF:1.265922
720p60_h264_ts-0000000000.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:26.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000001.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:28.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000002.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:30.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000003.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:32.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000004.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:34.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000005.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:36.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000006.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:38.795Z

#EXT-X-PROGRAM-DATE-TIME 包含按照 ISO8601 格式 YYYY-MM-DDThh:mm:ss[.mmm]TZD 生成的时间码数据,其中:

  • YYYY 是四位数年份
  • MM 是两位数月份(例如,03 表示 3 月)
  • DD 是月份中的两位数日期(01 到 31)
  • T 是一个集合字符,表示时间元素的开始
  • hh 是小时的两位数(00 到 23,不包括上午/下午)
  • mm 是分钟的两位数(00 到 59)
  • ss 是秒数的两位数(00 到 59)
  • mmm 是毫秒数的三位数(000 到 999)
  • TZD 是时区标识符 (Z, ±hh:mm)。Z 表示世界协调时间 (UTC),而 + 或 - 值表示相对于世界协调时间 (UTC) 的时间差。

DASH 清单文件

对于 DASH 直播,MPD 清单文件中的 availabilityStartTime 属性会设置为初始时间码,并且类似于以下内容:

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-live:2011"
 type="dynamic" minBufferTime="PT4S" mediaPresentationDuration="PT0H0M473.262S"
 availabilityStartTime="2023-05-19T17:44:16.881Z">

availabilityStartTime 包含按照 ISO8601 格式 YYYY-MM-DDThh:mm:ss[.mmm]TZD 生成的时间码数据,其中:

  • YYYY 是四位数年份
  • MM 是两位数月份(例如,03 表示 3 月)
  • DD 是月份中的两位数日期(01 到 31)
  • T 是一个集合字符,表示时间元素的开始
  • hh 是小时的两位数(00 到 23,不包括上午/下午)
  • mm 是分钟的两位数(00 到 59)
  • ss 是秒数的两位数(00 到 59)
  • mmm 是毫秒数的三位数(000 到 999)
  • TZD 是时区标识符 (Z, ±hh:mm)。Z 表示世界协调时间 (UTC),而 + 或 - 值表示相对于世界协调时间 (UTC) 的时间差。

如何解析时间码数据

系统会从第一帧视频中解析嵌入的时间码。之后,输出媒体时间戳会逐帧推进。在输入流断开连接并重新连接之前,输入和输出时间之间不会重新同步。

由于视频的时间戳会被根据时间码生成的时间戳替换,因此频道事件必须遵循时间码时钟,才能在指定时间正确执行。

如果制作流水线中的时间码生成器相同,或者在主贡献编码器和备用贡献编码器上都处于锁定状态,则可以对冗余流进行时间同步(请参阅视频什么是输出锁定?)。

如何解读输入时间码

画面时间 SEI 消息中的时间码仅包含时间 (16:30:00;10)。如需在输出清单中添加时间码,则必须同时提供日期和时间,例如完整日期时间 (2021-12-06T16:30:00.333Z) 或公元纪年时间 (1638837000333)。

将 SEI 时间码解读为日期时间格式时,Live Stream API 始终假定传入的输入串流是直播或接近直播。Live Stream API 使用频道的 timecodeConfig 中指定的时区来解读 SEI 时间码,使其尽可能接近当前时间(但不晚于当前时间)。

例如,假设 Live Stream API 在 UTC 时间 2021-12-06T21:00:00Z 收到输入串流。下表显示了如何将 SEI 时间码转换为日期时间格式:

时区 ID SEI 时间码 以当地时间解读 以世界协调时间 (UTC) 解读
UTC 16:30:00;10 2021-12-06T16:30:00.333+00:00 2021-12-06T16:30:00.333Z
America/Los_Angeles 16:30:00;10 2021-12-05T16:30:00.333-08:00 2021-12-06T00:30:00.333Z
America/New_York 16:30:00;10 2021-12-05T16:30:00.333-05:00 2021-12-05T21:30:00.333Z
Asia/Bangkok 16:30:00;10 2021-12-06T16:30:00.333+07:00 2021-12-06T09:30:00.333Z
America/Los_Angeles 03:30:00;10 2021-12-06T03:30:00.333-08:00 2021-12-06T11:30:00.333Z
Asia/Bangkok 03:30:00;10 2021-12-07T03:30:00.333+07:00 2021-12-06T20:30:00.333Z

请注意,解读的时间绝不会晚于 2021-12-06T21:00:00Z 的当前世界协调时间 (UTC)。