MP3,即MPEG Layer III。MPEG有几个版本的协议,不同版本的协议能够支持的参数能力是不同的。编码库的使用者必须清楚不同版本的区别才能正确的设置参数。
有以下3个版本的协议,MPEG1、MPEG2、MPEG2.5。其中MPEG2.5是非官方的标准,但是流传广泛,所以基本也都支持。他们的区别主要集中在支持的比特率和采样率不同。
但是mp3有很多参数,这里列举几个mp3编码的必要参数。
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():根据上面设置好的参数建立编码器
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文件。
lame_close()销毁编码器,释放资源。