EBML格式

EBML的全称为Extensible Binary Meta Language,一种更加灵活的音视频框架,扩展性能更为强大,支持更多格式音视频扩展。EBML能够确保视频、音频容器格式支持将来新出现的压缩格式。这种架构允许增加对容器格式的新特性,同时不破坏原有软件和文件的向后兼容性。支持动态音频编码(VBR)、动态帧率视频编码(VFR)。此格式已经应用于多媒体容器格式MATROSKA(MKV)。

EBML使用不定长整数,这种方式相对于固定长度的32位/64位字长的整数值更节约空间,放置的位置也不受字节对齐约束。这种长度编码方式来自于UTF-8编码格式。

1、可变长无符号整数值(vint)

一个整数的长度可以通过下面的方式获得:

length = 1 + number_of_leading_zero_bits

所有的整数都使用大印第安序来存储。number_of_leading_zero_bits的值可以大于7,这种情况下第一个字节就是0x00,但是这种情况仅仅在整数的长度超过56个bit时才需要。

一个简单的例子:0X3A41FE

第一个字节0X3A的二进制码是0011 1010,包含两个前缀0比特,因此长度是三个字节。0011 1010中的第一个1仅仅是为了标识前缀0的结束,将该bit位去掉后0X3A41FE就转化为0X1A41FE,这个数值就是所需要的那三个字节。

当然,0X1A41FE也可以写成0X101A41FE或者0X08001A41FE,对于0X101A41FE,第一个字节0X10的二进制码是0001 0000,因此长度是四个字节;对于0X08001A41FE,第一个字节0X08的二进制码是0000 1000,因此长度是五个字节。不过在实际的编码过程中不会这样用,浪费空间。

2、可变长有符号整数值(svint)

对于有符号整数的处理过程是这样的,首先将该有符号整数看作无符号整数,然后减去vsint_subtr[length-1]。

vsint_subtr[length-1]的定义如下所示:

__int64 vsint_subtr [] = { 0x3F, 0x1FFF, 0x0FFFFF, 0x07FFFFFF,
                                            0x03FFFFFFFF, 0x01FFFFFFFFFF,
                                            0x00FFFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF };

一个简单的例子:0x5ED3

首先将它看作无符号整数处理,分析得length为2,将前缀去掉,0x5ED3------>0x1ED3;

然后,0x1ED3 - vsint_subtr[length -1] = 0x1ED3 - 0x1FFF = -0x12C(-300)。

3、EBML元素

EBML是类似于XML那样的层次化结构,每一个元素都有它的ID(就是元素名)和值。另外由于是二进制存储,还含有一个长度值来记录它的值的长度,每个元素的排列是ID,长度,值。每个EBML元素可以用下列方式来存储:

typedef struct {
    vint ID                // EBML-ID
    vint size             // size of element
    char[size] data // data
} EBML_ELEMENT;

包含其它元素的元素被称EBML Master Elements。子元素的排列顺序是任意的,当然在某些情况下推荐使用特定的顺序。

以MKV文件的一段码流为例,如下:

42 82 88 6D 61 74 72 6F 73 6B 61

首先分析ID,第一个字节为0X42,对应的二进制码为0100 0010。由于是01开头所以知道ID的长度是2个字节,于是0X4282就是它的ID。

然后分析长度和值,0X88对应的二进制码为1000 1000,以1开头,于是长度只有1字节,去掉前缀1后值为0001000,也就是8,即是说后8个字节都是它的值。查表可知ID 42 82也就是DocType,它的值是字符串,于是把后面8字节6D 61 74 72 6F 73 6B 61按UTF-8解码可得"matroska"。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要将EBML格式转换为FASTA格式,您可以按照以下步骤进行操作: 1. 首先,了解EBML和FASTA格式的差异。EBML是一种二进制格式,常用于存储多媒体文件的元数据信息。而FASTA是一种文本格式,常用于存储生物序列信息,如DNA、RNA和蛋白质序列。 2. 使用适当的编程语言(如Python)读取EBML文件。您可以使用EBML库或模块来解析EBML文件并提取所需的数据。 3. 将提取的数据转换为FASTA格式。根据您的具体需求,将EBML中的元数据信息转换为FASTA格式的序列标识符和序列数据。您可以根据FASTA格式规范创建一个新的文本文件,并将转换后的数据写入该文件。 以下是一个使用Python示例代码的简单步骤: ```python import ebml from Bio import SeqIO def convert_ebml_to_fasta(ebml_file, fasta_file): # 读取EBML文件 ebml_data = ebml.load(ebml_file) # 提取所需数据(示例中假设EBML中包含DNA序列) sequence_data = ebml_data['sequence'] # 创建FASTA文件并写入转换后的数据 with open(fasta_file, 'w') as f: f.write('>Sequence\n') f.write(sequence_data) # 调用函数并指定输入输出文件路径 convert_ebml_to_fasta('input.ebml', 'output.fasta') ``` 请注意,示例代码仅用于演示目的。实际应用中,您可能需要根据您的EBML文件结构和FASTA格式的要求进行适当的调整。 希望以上信息能对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值