美文网首页
音频开发学习日记2~lame的使用

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

作者: CoderP1 | 来源:发表于2018-08-17 15:27 被阅读0次

    前言

    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 的最正确姿势

    相关文章

      网友评论

          本文标题:音频开发学习日记2~lame的使用

          本文链接:https://www.haomeiwen.com/subject/jgkekftx.html