我使用id3taggenerator和mediafilesegmenter在HLS(HTTP Live Stream)中插入定时元数据。我已按照Jake's Blog的说明进行操作。
首先,我使用id3taggenerator:
创建id3tagid3taggenerator -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标签的通知就会记录。在播放视频大约10秒的ID3标签后,应用程序会收到通知。我还尝试了另一个id3macro文件,在视频中插入了多个定时元数据(大约0s,5s,7s),所有这些都显示出相同的近似延迟。我也将段的持续时间更改为5s,但每次都是相同的结果。
我使用的mediafilesegmenter
是Beta Version 1.1(140602)
。
其他人可以确认这个问题,或者指出我在这里做错了什么?
干杯!
答案 0 :(得分:2)
我可以使用相同版本的mediafilesegmenter确认我遇到了同样的问题:
mediafilesegmenter:Beta版本1.1(140602)
此外,我可以看到ID3的数据包在流中正确插入。例如。如果我指定10秒延迟 - 我可以看到我的ID3插入到前10秒段的末尾。
但是,它会在10秒后出现在iOS通知中。
我可以看到以下可能的原因:
mediafilesegmenter在正确的位置插入元数据包,但由于某种原因,时间戳会延迟10秒。因此,客户端(例如iOS播放器)在10秒后显示标签。 Apple工具没有很好的文档记录,因此很难验证。
也许iOS播放器会及时收到元数据(因为我知道标签包含在以前的段文件中)但是出于任何原因发出10秒延迟的通知。
我无法进一步挖掘,因为我没有任何支持插播ID3标签的Flash /桌面HLS播放器。如果我有一个,我会检查桌面播放器是否会及时显示/处理ID3。然后,这意味着问题是iOS,而不是mediafilesegmenter。
另一个有用的事情是 - 从段文件中提取带有ID3标签的MPEG-TS帧,并检查标题,寻找那里的任何奇怪的东西(例如错误的时间戳)。
更新
我做了一些研究,包括使用Apple工具创建的TS段的逆向工程,似乎:
虽然第一个问题似乎并没有影响回放(据我所知,PTS持续发生,而不是它开始的地方更重要),第二个问题肯定是一个问题,你/我们遇到问题的原因。
因此,iOS播放器会及时收到ID3帧,但由于其PTS提前10秒 - 它会在发出通知前等待10秒。据我现在所说 - 其他一些玩家只是忽略了这个ID3帧,因为它位于错误的位置。
作为一种解决方法,您可以在元文件中将所有ID3文件移动10秒,但显然,您无法在开头放置任何内容。