libmp3lame及API介紹和使用詳解
API介紹
API地址是對(duì)libmp3lame.so的編碼部分最基礎(chǔ)接口的介紹,本庫特包含了增加id3標(biāo)簽和mp3的解碼的支持。這里并不是完整的文檔,但是你可以通過查看"include/lame.h"找到他們,并且通過查看frontend/main.c看到部分編解碼的源代碼。
- (可選) 如果你感興趣,可以獲取編碼器的版本號(hào).
void get_lame_version(char *strbuf, size_t buflen, const char *prefix);
- 錯(cuò)誤信息。
LAME默認(rèn)情況下會(huì)使用vfprintf()將錯(cuò)誤信息給stderr,在一些有界面的應(yīng)用下,可能獲取方面會(huì)有問題,所以支持你設(shè)置自己的錯(cuò)誤信息Handlers:
lame_set_errorf(gfp,error_handler_function); lame_set_debugf(gfp,error_handler_function); lame_set_msgf(gfp,error_handler_function);
可以通過查看lame.h找到更多的細(xì)節(jié)。
- 初始化編碼器。
為所有的編碼參數(shù)設(shè)置默認(rèn)值。
#include "lame.h" lame_global_flags *gfp; gfp = lame_init();
默認(rèn)情況(如果什么都沒設(shè)置),輸出格式為J-Stereo, 44.1khz 128kbps CBR quality=5,的mp3,如果需要可以調(diào)用代碼重寫下面的設(shè)置:
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獲取所有的可以調(diào)用的API列表。需要注意的是有很多lame_set_*()并沒有在lame.h里,這些功能是試驗(yàn)性的僅僅用來測試,可能在后續(xù)的版本中移除。
- 設(shè)置編碼參數(shù)
調(diào)用下面的代碼來設(shè)置上面設(shè)置的不同的設(shè)置,返回ret_code >= 0表明設(shè)置成功。
ret_code = lame_init_params(gfp);
- 編碼邏輯
輸入pcm數(shù)據(jù),輸出MP3幀,lame_encode_buffer會(huì)完成所有所需的緩沖,重采樣,過濾操作。需要的mp3buffer_size參數(shù)可以通過num_samples, samplerate和encoding rate計(jì)算出來,這里有一個(gè)最壞情況的估算:
mp3buffer_size (in bytes) = 1.25 * num_samples + 7200
num_samples為PCM每個(gè)channel包含的采樣數(shù)量,不是L通道和R通道中樣本數(shù)量的總和,也就是單個(gè)channel的采樣數(shù)量。
返回值為mp3buffer中包含的byte的數(shù)量,可以為0,如果是負(fù)值說明發(fā)生了錯(cuò)誤。
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.
- flush清空緩存
lame_encode_flush將刷新緩沖區(qū)并可能返回最后幾個(gè)mp3幀,mp3buffer應(yīng)該至少有7200 bytes,返回值同樣是輸出到mp3buffer的數(shù)量,可以為0.
int lame_encode_flush(lame_global_flags *,char *mp3buffer, int mp3buffer_size);
- 向mp3文件中寫入Xing VBR/INFO標(biāo)簽
void lame_mp3_tags_fid(lame_global_flags *,FILE* fid);
這將添加一個(gè)有效的mp3幀,其中包含關(guān)于比特流有些音樂播放器可能會(huì)覺得有用。用于CBR,ABR和VBR。將嘗試回到輸出流的開頭并寫入標(biāo)簽,但有可能會(huì)失敗,(比如,輸出到了其他地方),這時(shí)候就需要在上面的步驟3之前調(diào)用lame_set_bWriteVbrTag(gfp,0),并且調(diào)用lame_mp3_tags_fid() with fid=NULL,如果嘗試回到開頭失敗比特流的第一個(gè)mp3幀都是0。
- 釋放內(nèi)部數(shù)據(jù)結(jié)構(gòu)體
void lame_close(lame_global_flags *);
簡單使用
其實(shí)API的介紹已經(jīng)把用法說的很清楚了,除了第一第二步,順著走下來就好了。
這里感覺沒有什么好說的,寫我在用它的時(shí)候遇到的問題吧。
編碼結(jié)束之后發(fā)現(xiàn)MP3時(shí)長變成了源音頻的4倍,使用Audacity查看如圖所示:

并且放大之后發(fā)現(xiàn)每一幀后面都是空的,只有前面的小部分是有效的。

查看之后其實(shí)最主要的就是 lame_encode_buffer_interleaved的調(diào)用:
int lame_encode_buffer_interleaved(lame_global_flags * gfp,
short int pcm[], int nsamples,
unsigned char *mp3buf, int mp3buf_size)看他的參數(shù),兩個(gè)要注意的點(diǎn):
- 他需要的是
short int pcm[],在準(zhǔn)備數(shù)據(jù)的時(shí)候如果是用了uint8_t或者char之類的作為容器的話,需要注意size需要除以二,變成short int的size. nsamples的參數(shù)理解,是單個(gè)channel含有的short int類型數(shù)據(jù)的size。如果輸入源是雙聲道的uint8_t數(shù)組,那就需要除以四。
代碼查看 Mp3Lame.cpp
以上就是libmp3lame及API介紹和使用詳解的詳細(xì)內(nèi)容,更多關(guān)于libmp3lame API介紹使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Flutter 完美的驗(yàn)證碼輸入框?qū)崿F(xiàn)
這篇文章主要介紹了Flutter 完美的驗(yàn)證碼輸入框?qū)崿F(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Android studio實(shí)現(xiàn)滑動(dòng)開關(guān)
這篇文章主要為大家詳細(xì)介紹了Android studio實(shí)現(xiàn)滑動(dòng)開關(guān),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
Android實(shí)現(xiàn)空心圓角矩形按鈕的實(shí)例代碼
頁面上有時(shí)會(huì)用到背景為空心圓角矩形的Button,可以通過xml繪制出來。這篇文章主要介紹了Android實(shí)現(xiàn)空心圓角矩形按鈕的實(shí)例代碼,需要的朋友參考下吧2017-01-01
android開發(fā)教程之startActivityForResult使用方法
這篇文章主要介紹了android開發(fā)教程之startActivityForResult使用方法,需要的朋友可以參考下2014-03-03
android讀取Assets圖片資源保存到SD卡實(shí)例
本文為大家詳細(xì)介紹下android讀取Assets圖片資源保存到SD卡的具體實(shí)現(xiàn),感興趣的各位可以參考下哈,希望對(duì)大家有所幫助2013-07-07
動(dòng)態(tài)添加LinearLayout的高度實(shí)例
下面小編就為大家?guī)硪黄獎(jiǎng)討B(tài)添加LinearLayout的高度實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
Android中實(shí)現(xiàn)ping功能的多種方法詳解
這篇文章主要介紹了Android中實(shí)現(xiàn)ping功能的多種方法詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android倒計(jì)時(shí)神器(CountDownTimer)
這篇文章主要為大家詳細(xì)介紹了Android倒計(jì)時(shí)神器CountDownTimer,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01

