libmp3lame的介绍和使用

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查看如图所示:



并且放大之后发现每一帧后面都是空的,只有前面的小部分是有效的。


查看之后其实最主要的就是 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容