1. 什么是webM

要说webM,先说Matroska,Matroska是一个可扩展的,开源的多媒体容器(说简单点,容器的作用,就是把视频和音频封装到一个文件)。使用这种容器的常见文件,一个是MKV,一个就是webM。两者的区别,无非是支持的音视频编码不一样,但封装原理都一样。
更多的Matroska介绍,见官网:https://matroska.org/index.html

webM的音视频支持:
视频编码:支持VP8或VP9
音频编码:支持Vorbis 或 Opus

要说Matroska,那又离不开EBML了。

1.1 EBML简介

全称Extensible Binary Meta Language,是一种数据存储格式。它其实和XML的结构,非常的类似!

EBML文档仅由两个部分组成,即EBML标头EBML主体。EBML文档必须以EBML标头开始,该标头声明了整个EBML主体的重要特征。

EBML使用Elements(元素)来构成EBML文档。

EBML元素包含三个部分:元素ID,元素数据大小和元素数据

一个典型的EBML文件结构:

EBML Header (master)
  + DocType (string)
  + DocTypeVersion (unsigned integer)
EBML Body Root (master)
  + ElementA (utf-8)
  + Parent (master)
    + ElementB (integer)
  + Parent (master)
    + ElementB (integer)

元素ID,用来表示当前的元素代表什么内容。
元素数据大小,表示这块元素数据有多大。
元素数据,表示数据实体内容,数据也可以包含其他的元素。可称为子元素。

元素ID,是不是固定几个字节来表示呢?不是!
元素数据,有大有小,那要用几个字节来表示呢?不固定几个字节。

EBML定义了一种数据格式,叫做VINT(Variable Int),也就是可变长度的Int。什么意思呢?

bits, big-endian
1xxx xxxx                                                                              - value 0 to  2^7-2
01xx xxxx  xxxx xxxx                                                                   - value 0 to 2^14-2
001x xxxx  xxxx xxxx  xxxx xxxx                                                        - value 0 to 2^21-2
0001 xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                                             - value 0 to 2^28-2
0000 1xxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                                  - value 0 to 2^35-2
0000 01xx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                       - value 0 to 2^42-2
0000 001x  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx            - value 0 to 2^49-2
0000 0001  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx - value 0 to 2^56-2

就是去掉前面的001的明文Bit,后面的XXX就是要表示的元素ID或者元素大小。
明文Bit有几个,那当前的数据就有几个字节。 比如01,那总共就占用2各字节来代表数据。

1.2 Matroska文件组成

从全局看,数据组成如下:

+-------------+
| EBML Header |
+---------------------------+
| Segment     | SeekHead    |
|             |-------------|
|             | Info        |
|             |-------------|
|             | Tracks      |
|             |-------------|
|             | Chapters    |
|             |-------------|
|             | Cluster     |
|             |-------------|
|             | Cues        |
|             |-------------|
|             | Attachments |
|             |-------------|
|             | Tags        |
+---------------------------+

重点是两个子元素:Tracks和Cluster。
音视频的描述信息,存在Tracks。
帧数据,存在Cluster。

1.2.1 Cluster的组成

+--------------------------+
| Cluster | Timestamp      |
|         |----------------|
|         | SilentTracks   |
|         |----------------|
|         | Position       |
|         |----------------|
|         | PrevSize       |
|         |----------------|
|         | SimpleBlock    |
|         |----------------|
|         | BlockGroup     |
|         |----------------|
|         | EncryptedBlock |
+--------------------------+

BlockGroup是帧数据实际存储的地方,可以有很多很多BlockGroup,一个BlockGroup是一个帧数据。

2. webM文件解析工具

见我另一篇文章:https://blog.csdn.net/newchenxf/article/details/112580435

参考文献

[1] EBML官方介绍:https://github.com/ietf-wg-cellar/ebml-specification/blob/master/specification.markdown
[2] Matroska的数据结构:https://www.matroska.org/technical/diagram.html
[3] Matroska官网介绍:https://www.matroska.org/index.html
[4] https://blog.csdn.net/hongszh/article/details/8481752
[5] https://blog.csdn.net/yu_yuan_1314/article/details/9103941

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐