webM文件解析--基于Matroska和EBML
1. 什么是webM要说webM,先说Matroska,Matroska是一个可扩展的,开源的多媒体容器(说简单点,容器的作用,就是把视频和音频封装到一个文件)。使用这种容器的常见文件,一个是MKV,一个就是webM。两者的区别,无非是支持的音视频编码不一样,但封装原理都一样。更多的Matroska介绍,见官网:https://matroska.org/index.htmlwebM的音视频支持:视
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
更多推荐
所有评论(0)