Mediafilesegmenter 在 HLS 流中插入定时元数据 ID3 标签,但时间点错误

Posted

技术标签:

【中文标题】Mediafilesegmenter 在 HLS 流中插入定时元数据 ID3 标签,但时间点错误【英文标题】:Mediafilesegmenter inserts timed metadata ID3 tags in HLS stream but at the wrong point in time 【发布时间】:2015-03-12 08:53:49 【问题描述】:

我正在使用 id3taggenerator 和 mediafilesegmenter 在 HLS(HTTP Live Stream)中插入定时元数据。我已按照Jake's Blog 的说明进行操作。

首先,我使用 id3taggenerator 创建 id3tag:

id3taggenerator -o text.id3 -t "video" 

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

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

并使用 mediafilesegmenter 对视频进行分段并插入 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】:

我可以确认我遇到了同样的问题,使用相同版本的 mediafilesegmenter:

mediafilesegmenter:测试版 1.1(140602)

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

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

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

mediafilesegmenter 在正确的位置插入元数据包,但由于某种原因时间戳延迟了 10 秒。因此,客户端(例如 iOS 播放器)会在 10 秒后显示标签。 Apple 工具没有很好的文档记录,因此很难验证。

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

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

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

更新:

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

mediafilesegmenter 从 10 秒开始 PTS(演示时间戳),而例如 ffmpeg 从 0 开始。 mediafilesegmenter 在 TS 文件中的正确位置添加 ID3 帧,但 PTS 错误,比元文件中指定的位置提前 10 秒。

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

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

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

【讨论】:

因为 Apple 工具中的 bug,而且这些工具只能在 OS X 下运行,所以我不得不编写自己的元数据注入器:github.com/dusterio/hlsinjector 随意使用它:) 我在生产中对其进行了测试环境已经

以上是关于Mediafilesegmenter 在 HLS 流中插入定时元数据 ID3 标签,但时间点错误的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 hls.js 跳转到 hls 流中的具体 UTC 时间戳

ffmpeg-hls实现分析

FPGA HLS 的机理

在 android 上的 hls 流上选择质量视频

iOS 离线 HLS 文件大小

Android VideoView 直播电视流 (HLS)