MP3标准

        MP3,即MPEG Layer III。MPEG有几个版本的协议,不同版本的协议能够支持的参数能力是不同的。编码库的使用者必须清楚不同版本的区别才能正确的设置参数。

        有以下3个版本的协议,MPEG1、MPEG2、MPEG2.5。其中MPEG2.5是非官方的标准,但是流传广泛,所以基本也都支持。他们的区别主要集中在支持的比特率和采样率不同。

MP3参数

        但是mp3有很多参数,这里列举几个mp3编码的必要参数。

  • 采样率(sampleRate):采样率越高声音的还原度越好。
  • 比特率(bitrate):每秒钟的数据量,越高音质越好。
  • 声道数(channels):声道的数量,通常只有单声道和双声道,双声道即所谓的立体声。
  • 比特率控制模式:ABR、VBR、CBR

LAME介绍

        lame是一个有名的开源mp3编码库。具体可参考:https://lame.sourceforge.io/

编码流程

        使用lame库只需要包含lame.h头文件,编码mp3基本上遵循以下的流程。

  • 初始化编码参数

lame_init:初始化一个编码参数的数据结构,给使用者用来设置参数。

  • 设置编码参数

lame_set_in_samplerate():设置被输入编码器的原始数据的采样率。
lame_set_out_samplerate():设置最终mp3编码输出的声音的采样率,如果不设置则和输入采样率一样。
lame_set_num_channels() :设置被输入编码器的原始数据的声道数。
lame_set_mode() :设置最终mp3编码输出的声道模式,如果不设置则和输入声道数一样。参数是枚举,STEREO代表双声道,MONO代表单声道。
lame_set_VBR():设置比特率控制模式,默认是CBR,但是通常我们都会设置VBR。参数是枚举,vbr_off代表CBR,vbr_abr代表ABR(因为ABR不常见,所以本文不对ABR做讲解)vbr_mtrh代表VBR。
lame_set_brate():设置CBR的比特率,只有在CBR模式下才生效。
lame_set_VBR_mean_bitrate_kbps():设置VBR的比特率,只有在VBR模式下才生效。
其中每个参数都有默认的配置,如非必要可以不设置。

  • 初始化编码器

lame_init_params():根据上面设置好的参数建立编码器

  • 编码PCM数据

lame_encode_buffer()或lame_encode_buffer_interleaved():将PCM数据送入编码器,获取编码出的mp3数据。这些数据写入文件就是mp3文件。
        其中lame_encode_buffer输入的参数中是双声道的数据分别输入的,lame_encode_buffer_interleaved输入的参数中双声道数据是交错在一起输入的。具体使用哪个需要看采集到的数据是哪种格式的,不过现在的设备采集到的数据大部分都是双声道数据是交错在一起。单声道输入只能使用lame_encode_buffer,把单声道数据当成左声道数据传入,右声道传NULL即可。调用这两个函数时需要传入一块内存来获取编码器出的数据,这块内存的大小lame给出了一种建议的计算方式:采样率/20+7200。

  • 结束编码

lame_encode_flush:结束编码,获取编码出的结束数据。这部分数据也需要写入mp3文件。

  • 5.6 销毁编码器

lame_close()销毁编码器,释放资源。