音频开发学习日记2~lame的使用

2018-08-17  本文已影响0人  CoderP1

前言

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头,比较重要,如果不写的话,可能会造成获取的音频时长不正确的情况.

参考: iOS 使用 Lame 转码 MP3 的最正确姿势

上一篇下一篇

猜你喜欢

热点阅读