【问题标题】:MPEG 2 and 2.5 - problems calculating frame sizes in bytesMPEG 2 和 2.5 - 以字节为单位计算帧大小的问题
【发布时间】:2020-06-23 13:50:34
【问题描述】:

我有一个使用多年的控制台程序,用于(除其他外)显示有关某些音频文件格式的信息,包括 mp3。我使用来自 mpeghdr 站点的数据来计算帧大小,以便进一步计算曲目的播放时间。我从 mpeghdr 得到的方程式是:

// Read the BitRate, SampleRate and Padding of the frame header. 
// For Layer I files use this formula: 
// 
//     FrameLengthInBytes = (12 * BitRate / SampleRate + Padding) * 4 
// 
// For Layer II & III files use this formula: 
// 
//     FrameLengthInBytes = 144 * BitRate / SampleRate + Padding 

这适用于大多数 mp3 文件,但总会有一小部分人不适合这个等式。最近,我一直在查看一组非常小的 mp3 文件,并发现对于这些文件,此公式失败的频率很多,所以我试图最终确定发生了什么.所有这些 mp3 文件都是使用 Lame V3.100 在 Windows 7 64 位上使用默认设置生成的。

在所有情况下,我都能成功找到第一个帧头,但是当我使用上面的公式计算到下一个帧头的偏移量时,有时会不正确。

例如,我有一个文件 'wolf howl.mp3'; MPEGAudioInfo 等分析文件将帧大小显示为 288 字节。但是,当我运行我的程序时,它显示第一帧的长度为 576 字节(2 * 288)。当我在十六进制编辑器中查看 mp3 文件时,第一帧在 0x154,我可以看到下一帧在 0x154 + 208 字节,但这个计算确实实际上导致了 576 字节。 ..

File info:
mpegV2.5, layer III

frame: bitrate=32, sample_rate=8000, pad=0, bytes=576
mtemp->frame_length_in_bytes =
   (144 * (mtemp->bitrate * 1000) / mtemp->sample_rate) + mtemp->padding_bit;
which equals 576

我查看了许多其他参考资料,它们都显示了这个等式...... 起初我认为这是非官方标准 MPEG 2.5 的问题,但我也看到了 MPEG2 文件的问题。不过,只发生在小文件上。

有人对我在这里遗漏的内容有任何见解吗?

//********************************************

后记:

我认为音频格式可能与此问题有关,因此我为每个测试文件转储了 channel_mode 和 mode_extension(3 个正确计算,2 个不正确)。可悲的是,它们都是 cmode=3, mode_ext=0 (即,标头的最后一个字节是 0xC4)...所以这无济于事...

【问题讨论】:

    标签: mp3 frame mpeg


    【解决方案1】:

    好的,我找到了这个问题的答案......它在 CodeProject 网站上的 MPEGAudioInfo 程序中。这是关键:

    //*************************************************************************************
    //  This reference data is from MPEGAudioInfo app
    // Samples per Frame / 8
    static const u32 m_dwCoefficients[2][3] =
    {
       {  // MPEG 1
          12,   // Layer1   (must be multiplied with 4, because of slot size)
          144,  // Layer2
          144   // Layer3
       },
       {  // MPEG 2, 2.5
          12,   // Layer1   (must be multiplied with 4, because of slot size)
          144,  // Layer2
          72    // Layer3
       }  
    };
    

    很遗憾,没有一个参考页面提到这个细节! 我的程序现在成功地计算了我的 所有 mp3 文件的帧大小,包括小文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 2017-09-14
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多