Parsing 实现RFC5219(RTP的MPA鲁棒有效负载):如何知道他们已经读取了整个ADU?

Parsing 实现RFC5219(RTP的MPA鲁棒有效负载):如何知道他们已经读取了整个ADU?,parsing,mp3,Parsing,Mp3,我正在尝试实现 我知道,对于给定的MP3帧,您可以通过解析出“main_data_begin”反向指针并从“bit repositor”(即前几帧中的音频数据)读取来识别相应的ADU从何处开始 然而,我无法理解,对于给定的MP3帧,您如何知道ADU何时完成 例如,考虑下面的2个MP3帧: Frame1的主数据开始=0 Frame2有一个主数据开始=20 因此,ADU1的长度为 Frame1.Length - Frame1.HeaderLength - 20 bytes 但我怎么知道呢?我是

我正在尝试实现

我知道,对于给定的MP3帧,您可以通过解析出“main_data_begin”反向指针并从“bit repositor”(即前几帧中的音频数据)读取来识别相应的ADU从何处开始

然而,我无法理解,对于给定的MP3帧,您如何知道ADU何时完成

例如,考虑下面的2个MP3帧:

  • Frame1的主数据开始=0
  • Frame2有一个主数据开始=20
因此,ADU1的长度为

Frame1.Length - Frame1.HeaderLength - 20 bytes
但我怎么知道呢?我是否能够从Frame1生成ADU1,或者我必须先阅读Frame2才能确定Frame1是否完整并生成ADU1

请注意,有一个示例算法,其中包含以下伪代码:

do
{
     // read a frame
}
while (totalDataSizeBefore < newFrame.backpointer ||
       totalDataSizeAfter < newFrame.aduDataSize);
do
{
//读一帧
}
while(totalDataSizeBefore
但它并没有定义“aduDataSize”或者它是如何计算的,所以它并没有太大的帮助


我唯一的另一个线索是一个模糊的建议,我可以从侧边的信息中读到第2部分的长度,这将告诉我ADU的长度-然而,我找不到一个真正有效的源代码来解析part_2_3_长度-我只知道它是一个12/24位的结构,它会给我一个太高的值,而不是一个帧大小。

最终我们在Live555源代码(特别是MP3Internals.cpp)中找到了答案

基本上,您需要读取每个通道中每个颗粒的part_2_3_长度,然后对其进行数学计算

大致:

uint numBits = 0;
for (int channelIdx = 0; channelIdx < isMono ? 1 : 2; channelIdx ++)
{
    for (int granuleIdx = 0; granuleIdx < 2; granuleIdx ++)
    {
        numBits += SideInfoGranules[channelIdx][granuleIdx].Part_2_3_Length;
    }
}

// Now maths this number. I don't know where the magic constants 7 and 8 come from though.
var aduDataSize = (numBits + 7) / 8;
uint numBits=0;
对于(int channelIdx=0;channelIdx
部分_2_3_长度的解析有点过于复杂,此处无法解释,但在MP3Internals.cpp的
getSideInfo1
getSideInfo2
方法中有很好的解释(例如,)

(numBits+7)/8
除以8并向上取整,大概是为了计算容纳那么多位所需的八位字节数。