5

我正在通过 libvpx 使用 VP9 对实时流进行编码,并希望将其流式传输到 HTML5 播放器。我已经阅读了Matroska 规范W3C WebM 字节流格式,并检查了一些由 libvpx 中的 vpxenc 工具生成的 WebM 文件。一切看起来都不错,但是我找不到任何关于如何将编码的视频帧打包到 W3C 规范中描述的媒体段内的严格规则或指南。

据我了解,我必须发出包含内部带有块元素的集群的媒体片段。据我了解,我可以为从编码器获得的每一帧使用一个简单的块元素,因为它有一个时间戳。但是如何组织集群呢?对我来说,使用单个简单的块条目为每个帧发出一个集群以减少缓冲和延迟是有意义的。这种方法被认为是正常的还是这样做有什么缺点,我应该缓冲一段时间,然后发出一个包含多个简单块元素的集群,覆盖缓冲的时间段?

更新

所以我实现了所描述的方法(使用单个简单的块条目发出集群)并且视频似乎滞后了很多,所以大概这不是要走的路。

4

2 回答 2

4

所以我终于设法混合了工作直播。

似乎我描述的初始方法(具有单个SimpleBlock的单个集群)实际上是这样工作的,但它有几个缺点:

  • 这有点违反官方 WebM 页面上的建议

关键帧应该放在簇的开头

  • 如果实时流使用 curl 或其他方式存储在本地文件中,它会破坏可能的搜索。据我了解,集群应该由一个完整的 GOP 组成。

我最初的假设之一是集群不能具有“未知”大小,但实际上 Chrome、VLC 和 ffplay 似乎对此感到满意,因此无需缓冲完整的 GOP 来确定大小和集群可以即时发射。

另一个重要方面是SimpleBlock元素中的时间戳是有符号的 16 位整数,因此您基本上可以将集群时间码的偏移量编码到 32767。因此,如果您使用 1 个滴答为 1 毫秒的默认时间刻度,这意味着集群不能超过 32 秒。如果 GOP 规模很大,则在决定是否发出新集群时也必须考虑此标准。

最后,是一个直播链接(“Big Buck Bunny”预告片,但采用直播格式),该链接似乎适用于所有玩家,并根据上述描述生成。

希望这些信息对任何人都有帮助。

于 2015-11-02T17:51:14.020 回答
0

我认为答案取决于您要寻找的延迟类型。您描述的方法将起作用,但会引入延迟。这通常不是直播的问题,因为直播的目标不是低延迟,而只是直接传输。(事实上​​,在某些情况下,需要延迟,即使它仍然是直播。)

如果低延迟是目标,您应该研究诸如 RTP 之类的东西。并不是说使用 webm 容器不可能,只是这不是容器的目标,所以你会发现大多数工具以不关心低延迟的方式实现 webm,因为你不会使用它为了这个目的; 你会改用RTP。

(如果相反,你所说的延迟是指它口吃,请务必提及它,因为这表明正在发生一些不同的事情。)

于 2015-09-10T17:10:29.043 回答