媒体文件分段器在 HLS 流中插入定时元数据 ID3 标记,但在错误的时间点



我正在使用id3taggenerator和mediafilesegmenter在HLS(HTTP Live Stream)中插入定时元数据。我遵循了杰克博客中的说明。

首先,我使用 id3taggenerator 创建 id3tag:

id3taggenerator -o text.id3 -t "video" 

然后将标记添加到id3macro文件中:

0 id3 /path/to/file/text.id3

并分割视频并使用媒体文件分段器插入id3标签:

mediafilesegmenter -M /path/to/id3macro -I -B "my_video" video.mp4

但是,时标元数据插入到错误的时间点。它不是显示在视频的开头(时间点 0),而是以 10 秒的延迟添加(给予或采取 0.05 秒,有时更多,有时更少)。

我编写了一个简单的iOS播放器应用程序,每当视频中收到id3标签的通知时,该应用程序都会记录。在播放ID3标签的视频约10秒后,该应用程序会收到通知。我还尝试使用另一个 id3macro 文件,在视频中插入多个定时元数据(大约 0 秒、5 秒、7 秒),所有元数据都以相同的近似延迟显示。我也随着分段的持续时间更改为 5s,但每次的结果都是一样的。

我正在使用mediafilesegmenterBeta Version 1.1(140602) .

其他人可以确认这个问题,或者指出我在这里做错了什么吗?

干杯!

我可以确认我遇到了同样的问题,使用相同的媒体文件分段器:

媒体文件分段器:测试版 1.1(140602)

此外,我可以看到带有 ID3 的数据包在流中的正确时刻插入。例如。如果我指定 10 秒延迟 – 我可以看到我的 ID3 插入了前 10 秒段的末尾。

但是,它会在 10 秒后出现在 iOS 通知中。

我可以看到以下可能的原因:

  • 媒体文件分段程序将元数据数据包插入正确的位置,但由于某种原因,时间戳延迟了 10 秒。因此,客户端(例如 iOS 播放器)会在 10 秒后显示标记。苹果工具没有很好的文档记录,所以很难验证。

  • 也许 iOS 播放器会及时收到元数据(因为我知道标签包含在以前的段文件中),但无论出于何种原因,都会发出延迟 10 秒的通知。

我无法进一步挖掘,因为我没有任何支持流内 ID3 标签的 Flash/桌面 HLS 播放器。如果我有一个,我会检查桌面播放器是否会及时显示/处理 ID3,没有延迟。然后,这意味着问题出在iOS上,而不是mediafilesegmenter。

另一个有用的事情是 – 从段文件中提取带有 ID3 标签的 MPEG-TS 帧,并检查标题,查找那里的任何奇怪东西(例如错误的时间戳)。

更新:

我做了更多的研究,包括对使用 Apple 工具创建的 TS 段进行逆向工程,看起来:

  • 媒体文件分段器从 10 秒开始启动 PTS(演示时间戳),而 ffmpeg 从 0 开始。
  • mediafilesegmenter在TS文件中的正确位置添加ID3帧,但PTS错误,比元文件中指定的时间早10秒。

虽然第一个问题似乎不会影响播放(据我所知,PTS 持续进行更重要,而不是从哪里开始),但第二个问题绝对是一个问题,也是您/我们遇到问题的原因。

因此,iOS 播放器及时收到 ID3 帧,但由于其 PTS 领先 10 秒 – 它会在发出通知之前等待 10 秒。据我现在可以说 - 其他一些玩家只是忽略了这个ID3帧,因为它在错误的位置。

作为一种解决方法,您可以在元文件中将所有 ID3 文件移动 10 秒,但显然,您将无法在开始时放置任何内容。

最新更新