今天在处理一个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);// ...}