编码的MKV文件群集大小

MKV file cluster size which is encoded?

本文关键字:群集 文件 MKV 编码      更新时间:2023-10-16

元素ID(也称为EBML ID(,以ID本身开头,然后是数据大小。

数据大小(以八位字节(为OCTER,也用UTF-8(例如系统(编码。

如何解码十进制中的数据大小

您可以在以下简单的示例代码中找到https://github.com/wangf1978/dumpts/blob/master/matroska.h

static uint64_t UnpackUnsignedIntVal(CBitstream&bs, uint8_t max_octs = 8, bool unPackVal=true, uint8_t* pcbValLen=nullptr)
{
    uint8_t nLeadingZeros = 0;
    uint64_t u64Val = bs.GetByte();
    for (uint8_t i = 0; i < max_octs; i++)
        if ((u64Val&(1ULL << (7 - i))) == 0)
            nLeadingZeros++;
        else
            break;
    if (nLeadingZeros >= max_octs)  // Unexpected
        return UINT64_MAX;
    if (unPackVal)
        u64Val &= ~(1 << (7 - nLeadingZeros));
    for (uint8_t i = 0; i<nLeadingZeros; i++)
        u64Val = (((uint64_t)u64Val) << 8) | (uint8_t)bs.GetBits(8);
    if (pcbValLen != nullptr)
        *pcbValLen = nLeadingZeros + 1;
    return u64Val;
}
virtual int Unpack(CBitstream& bs)
{
    // Read the element ID
    uint64_t u64Val = UnpackUnsignedIntVal(bs, 4, false);
    if (u64Val == UINT64_MAX)
        return -1;
    ID = (uint32_t)u64Val;
    if ((u64Val = UnpackUnsignedIntVal(bs)) == UINT64_MAX)
        return -1;
    Size = u64Val;
    //printf("ID: 0X%X, Size: %lld(0X%llX)n", ID, Size, Size);
    return 0;
}