API介绍

API地址是对libmp3lame.so的编码部分最基础接口的介绍,本库特包含了增加id3标签和mp3的解码的支撑。这儿并不是完整的文档,可是你能够经过检查”include/lame.h”找到他们,并且经过检查frontend/main.c看到部分编解码的源代码。

  1. (可选) 假如你感兴趣,能够获取编码器的版别号.
   void get_lame_version(char *strbuf, size_t buflen, const char *prefix);
  1. 过错信息。

LAME默许状况下会运用vfprintf()将过错信息给stderr,在一些有界面的应用下,或许获取方面会有问题,所以支撑你设置自己的过错信息Handlers:

   lame_set_errorf(gfp,error_handler_function);
   lame_set_debugf(gfp,error_handler_function);
   lame_set_msgf(gfp,error_handler_function);

能够经过检查lame.h找到更多的细节。

  1. 初始化编码器。

为一切的编码参数设置默许值。

   #include "lame.h"
   lame_global_flags *gfp;
   gfp = lame_init();

默许状况(假如什么都没设置),输出格局为J-Stereo, 44.1khz 128kbps CBR quality=5,的mp3,假如需求能够调用代码重写下面的设置:

   lame_set_num_channels(gfp,2);
   lame_set_in_samplerate(gfp,44100);
   lame_set_brate(gfp,128);
   lame_set_mode(gfp,1);
   lame_set_quality(gfp,2);   /* 2=high  5 = medium  7=low */ 

能够检查lame.h获取一切的能够调用的API列表。需求留意的是有很多lame_set_*()并没有在lame.h里,这些功能是试验性的仅仅用来测验,或许在后续的版别中移除。

  1. 设置编码参数

调用下面的代码来设置上面设置的不同的设置,回来ret_code >= 0标明设置成功。

   ret_code = lame_init_params(gfp);
  1. 编码逻辑

输入pcm数据,输出MP3帧,lame_encode_buffer会完结一切所需的缓冲,重采样,过滤操作。需求的mp3buffer_size参数能够经过num_samples, samplerateencoding rate计算出来,这儿有一个最坏状况的预算

mp3buffer_size (in bytes) = 1.25 * num_samples + 7200

num_samples为PCM每个channel包含的采样数量,不是L通道和R通道中样本数量的总和,也便是单个channel的采样数量。
回来值为mp3buffer中包含的byte的数量,能够为0,假如是负值阐明发生了过错。

   int lame_encode_buffer(lame_global_flags *gfp,
         short int leftpcm[], short int rightpcm[],
         int num_samples,char *mp3buffer,int  mp3buffer_size);

还有用于各种类型输入的例子(float, long, interleaved等等),详细能够检查lame.h.

  1. flush清空缓存

lame_encode_flush将刷新缓冲区并或许回来最后几个mp3帧,mp3buffer应该至少有7200 bytes,回来值同样是输出到mp3buffer的数量,能够为0.

int lame_encode_flush(lame_global_flags *,char *mp3buffer, int mp3buffer_size);
  1. 向mp3文件中写入Xing VBR/INFO标签
void lame_mp3_tags_fid(lame_global_flags *,FILE* fid);

这将增加一个有用的mp3帧,其中包含关于比特流有些音乐播放器或许会觉得有用。用于CBR,ABR和VBR。将测验回到输出流的最初并写入标签,但有或许会失败,(比方,输出到了其他地方),这时分就需求在上面的步骤3之前调用lame_set_bWriteVbrTag(gfp,0),并且调用lame_mp3_tags_fid() with fid=NULL,假如测验回到最初失败比特流的榜首个mp3帧都是0。

  1. 开释内部数据结构
void lame_close(lame_global_flags *);

简略运用

其实API的介绍已经把用法说的很清楚了,除了榜首第二步,顺着走下来就好了。
这儿感觉没有什么好说的,写我在用它的时分遇到的问题吧。

编码结束之后发现MP3时长变成了源音频的4倍,运用Audacity检查如图所示:

libmp3lame的介绍和使用
并且扩大之后发现每一帧后边都是空的,只有前面的小部分是有用的。
libmp3lame的介绍和使用

检查之后其实最主要的便是 lame_encode_buffer_interleaved的调用:

int lame_encode_buffer_interleaved(lame_global_flags * gfp,
                               short int pcm[], int nsamples,
                               unsigned char *mp3buf, int mp3buf_size)

看他的参数,两个要留意的点:

  1. 他需求的是short int pcm[],在准备数据的时分假如是用了uint8_t或者char之类的作为容器的话,需求留意size需求除以二,变成short int的size.
  2. nsamples的参数了解,是单个channel含有的short int类型数据的size。假如输入源是双声道的uint8_t数组,那就需求除以四。

代码检查Mp3Lame.cpp