前言
lame是目前非常优秀的一种mp3编码引擎,在业界,转码成mp3格式的音频文件时,最常用的编码器就是lame库,它编码出来的MP3音色、空间宽广、低音清晰、细节表现良好,它独创的心理音响模型技术保证了CD音频还原的真实性,配合VBR和ABR参数,音质几乎可以媲美CD音频,但文件体积却非常小。对于一个免费引擎,lame的优势不言而喻.
所以这里,我主要学习lame的使用,因为它确实是首选.
使用
上一篇中介绍了如何在Mac上交叉编译lame,这里我们就不再做介绍了,我直接拿到之前编译出来的lame库,将lame文件夹导入到项目中,然后创建一个工具类ConvertTool,用于封装PCM转MP3格式的操作.
下面贴上主要的代码:
+ (NSString *)convertWithPCM:(NSString *)pcm sampleRate:(int)sampleRate{
NSString *mp3Path = @"/Users/shennao/Desktop/result.mp3";
int read, write = 0;
FILE *PCM, *MP3;
//打开文件
PCM = fopen([pcm cStringUsingEncoding:NSUTF8StringEncoding], "rb");
MP3 = fopen([mp3Path cStringUsingEncoding:NSUTF8StringEncoding], "wb+");
//初始化一些常量
const int PCM_SIZE = 8192;
const int MP3_SIZE = 8192;
short int pcm_buffer[PCM_SIZE * 2];
unsigned char mp3_buffer[MP3_SIZE];
//初始化lame
lame_t lame = lame_init();
lame_set_in_samplerate(lame, sampleRate);
lame_set_VBR(lame, vbr_default);
lame_init_params(lame);
//skip audio file header ,avoid hearing some noise at the beginning!!
fseek(PCM, 4 * 1024, SEEK_CUR);
do {
read = (int)fread(pcm_buffer, 2 * sizeof(short int), PCM_SIZE, PCM);
if (read == 0) {
lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
lame_mp3_tags_fid(lame, MP3);
}else {
write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
fwrite(mp3_buffer, write, 1, MP3);
}
}while (read != 0);
return mp3Path;
}
这里我把下载的lame源码文件夹下面的testcase.wav拷贝到项目中,作为源文件,然后把转化后的mp3文件导出到桌面.然后与lame源码文件下的testcase.mp3文件进行比较,发现音质非常好,以上就是对于lame库的简单使用的介绍.
注:
最后read = 0的时候,还需要把buffer中的缓存数据写入文件,
lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
lame_mp3_tags_fid(lame, MP3);
这一句代码是为MP3文件写入VBR头,比较重要,如果不写的话,可能会造成获取的音频时长不正确的情况.