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