mp3 lsf扩展


今天在处理一个mp3的文件播放问题的时候,用ffmpeg把mp3的采样率重采样为16000,发现frame samples变成了576,看了下平时没有注意这个细节,一直都是习惯了1152个采样率的MP3,原来576属于MP3的LSF扩展。

LSF(low sample frequency) extension


MP3 LSF是一种特殊的MP3编码方式,它使用更低的采样率来压缩音频数据,从而减小文件大小。通常,MP3 LSF的采样率为8 kHz或16 kHz,而标准MP3的采样率为44.1 kHz或48 kHz。这种编码方式主要用于低码率的音频传输,例如电话会议、语音邮件等。

MP3的低采样频率(LSF)扩展是一种用于压缩低比特率音频的技术。它可以在16 kHz以下的采样频率下工作,而标准的MP3只能在32 kHz以上工作。LSF扩展可以提高音质和压缩效率,适用于语音和低保真音乐。

MP3 (LSF) extension的标准是指MPEG-2音频标准(ISO/IEC 13818-3)中引入的一种扩展,它可以支持低于32 kHz的采样率,比如16 kHz和22.05 kHz。这种扩展是在MPEG-1 Layer III(也就是MP3)的基础上进行的修改,它并没有改变MP3编码过程中其他参数和算法,只是改变了采样率和相应的滤波器系数。

LSF的帧大小是576个采样


MP3的粒度大小是由采样率决定的。采样率越高,粒度越小,反之亦然。不同层次(Layer)的MP3有不同的粒度大小。Layer I和Layer II的粒度大小是固定的,每个粒度包含384个采样点。Layer III的粒度大小是可变的,每个粒度可以包含576或1152个采样点。

LSF extension并没有改变MP3编码过程中其他参数和算法,只是改变了采样率和相应的滤波器系数。但是,这种改变也会影响到粒度大小。因为LSF extension使用了低于32 kHz的采样率,所以它只能使用576个采样点作为一个粒度,而不能使用1152个采样点。

下面是计算处理MPEG音频帧大小的部分代码:

// Samples per frame - use [version][layer]
const uint16_t mpeg_frame_samples[4][4] = {
//    Rsvd     3     2     1  < Layer  v Version
    {    0,  576, 1152,  384 }, //       2.5
    {    0,    0,    0,    0 }, //       Reserved
    {    0,  576, 1152,  384 }, //       2
    {    0, 1152, 1152,  384 }  //       1
};

ffmpeg中mpeg audio部分对framesize的计算:

    switch(s->layer) {
    case 1:
        s->avctx->frame_size = 384;
        nb_frames = mp_decode_layer1(s);
        break;
    case 2:
        s->avctx->frame_size = 1152;
        nb_frames = mp_decode_layer2(s);
        break;
    case 3:
        s->avctx->frame_size = s->lsf ? 576 : 1152;
    default:
        nb_frames = mp_decode_layer3(s);
        // ...
    }
        

你可能感兴趣的:(ffmpeg)