mkv中cluster位置的计算

本文详细介绍了在处理MKV文件时遇到tracknumber不正确的问题,并提供了一种解决方案,即丢弃错误的cluster并直接获取下一个新的cluster。通过解析clusterid、Timecodeid以及cluster大小,我们能够准确地定位到下一个有效的cluster起始位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来自项目中解决mkv中某个block中的track number不正确的问题:将此错误的cluster丢弃,直接获取下一个新的cluster


1.matroska中Cluster id 为 [1F][43][B6][75], cluster的Timecode id [E7].

介于cluster id 和 Timecode id之间的时这个cluster的大小。

所以下个cluster 的起始位置 = 当前cluster的起始位置 + sizeof(cluster id) + sizeof(描述cluster大小的数据) + cluster大小。

当前cluster的起始位置 + sizeof(cluster id) + sizeof(描述cluster大小的数据) = cluster的Timecode 的起始位置。

所以下个cluster 的起始位置 = cluster的Timecode 的起始位置 + cluster大小

比如:cluster 的起始位置 = 450414
      sizeof(cluster id) = sizeof ([1F][43][B6][75]) = 4
      sizeof(描述cluster大小的数据) = sizeof (28 36 2E) = 3
      cluster的Timecode 的起始位置 = 450421
      cluster大小 = 0x8362E

      下个cluster的位置 = 450421 + 0x8362E = 988579

2.cluster大小在文件中的内容:0x28362E
cluster大小 = 0x8362E

转换规则:
Data size, in octets, is also coded with an UTF-8 like system :
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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值