如何在实时WebM流中打包框架?

时间:2015-09-03 17:48:47

标签: webm live-video vp9

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

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

更新

所以我实现了所描述的方法(用单个简单的块条目发射集群),视频似乎滞后很多,所以可能这不是可行的方法。

1 个答案:

答案 0 :(得分:4)

所以我终于成功地在现场直播。

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

  

关键帧应该放在群集的开头

  • 如果实时流存储在具有curl或其他方式的本地文件中,它可能会分解。根据我的理解,群集应该包含完整的GOP。

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

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

最后,here是一个直播链接(“Big Buck Bunny”预告片,但是采用实时格式),似乎适用于所有玩家,并按照上述说明生成。

希望这些信息可以帮助任何人。