libmp3lame及API介紹和使用詳解
API介紹
API地址是對(duì)libmp3lame.so的編碼部分最基礎(chǔ)接口的介紹,本庫(kù)特包含了增加id3標(biāo)簽和mp3的解碼的支持。這里并不是完整的文檔,但是你可以通過(guò)查看"include/lame.h"找到他們,并且通過(guò)查看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ì)有問(wèn)題,所以支持你設(shè)置自己的錯(cuò)誤信息Handlers:
lame_set_errorf(gfp,error_handler_function); lame_set_debugf(gfp,error_handler_function); lame_set_msgf(gfp,error_handler_function);
可以通過(guò)查看lame.h
找到更多的細(xì)節(jié)。
- 初始化編碼器。
為所有的編碼參數(shù)設(shè)置默認(rèn)值。
#include "lame.h" lame_global_flags *gfp; gfp = lame_init();
默認(rèn)情況(如果什么都沒(méi)設(shè)置),輸出格式為J-Stereo, 44.1khz 128kbps CBR quality=5
,的mp3,如果需要可以調(diào)用代碼重寫(xiě)下面的設(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_*()
并沒(méi)有在lame.h
里,這些功能是試驗(yàn)性的僅僅用來(lái)測(cè)試,可能在后續(xù)的版本中移除。
- 設(shè)置編碼參數(shù)
調(diào)用下面的代碼來(lái)設(shè)置上面設(shè)置的不同的設(shè)置,返回ret_code >= 0
表明設(shè)置成功。
ret_code = lame_init_params(gfp);
- 編碼邏輯
輸入pcm數(shù)據(jù),輸出MP3幀,lame_encode_buffer
會(huì)完成所有所需的緩沖
,重采樣
,過(guò)濾
操作。需要的mp3buffer_size
參數(shù)可以通過(guò)num_samples
, samplerate
和encoding rate
計(jì)算出來(lái),這里有一個(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ù)值說(shuō)明發(fā)生了錯(cuò)誤。
int lame_encode_buffer(lame_global_flags *gfp, short int leftpcm[], short int rightpcm[], int num_samples,char *mp3buffer,int mp3buffer_size);
還有用于各種類(lèi)型輸入的例子(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文件中寫(xiě)入Xing VBR/INFO標(biāo)簽
void lame_mp3_tags_fid(lame_global_flags *,FILE* fid);
這將添加一個(gè)有效的mp3幀,其中包含關(guān)于比特流有些音樂(lè)播放器可能會(huì)覺(jué)得有用。用于CBR,ABR和VBR。將嘗試回到輸出流的開(kāi)頭并寫(xiě)入標(biāo)簽,但有可能會(huì)失敗,(比如,輸出到了其他地方),這時(shí)候就需要在上面的步驟3之前調(diào)用lame_set_bWriteVbrTag(gfp,0)
,并且調(diào)用lame_mp3_tags_fid() with fid=NULL
,如果嘗試回到開(kāi)頭失敗比特流的第一個(gè)mp3幀都是0。
- 釋放內(nèi)部數(shù)據(jù)結(jié)構(gòu)體
void lame_close(lame_global_flags *);
簡(jiǎn)單使用
其實(shí)API的介紹已經(jīng)把用法說(shuō)的很清楚了,除了第一第二步,順著走下來(lái)就好了。
這里感覺(jué)沒(méi)有什么好說(shuō)的,寫(xiě)我在用它的時(shí)候遇到的問(wèn)題吧。
編碼結(jié)束之后發(fā)現(xiàn)MP3時(shí)長(zhǎng)變成了源音頻的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
之類(lèi)的作為容器的話(huà),需要注意size需要除以二,變成short int
的size. nsamples
的參數(shù)理解,是單個(gè)channel含有的short int類(lèi)型數(shù)據(jù)的size。如果輸入源是雙聲道的uint8_t數(shù)組,那就需要除以四。
代碼查看 Mp3Lame.cpp
以上就是libmp3lame及API介紹和使用詳解的詳細(xì)內(nèi)容,更多關(guān)于libmp3lame API介紹使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
android利用ContentResolver訪(fǎng)問(wèn)者獲取手機(jī)短信信息
本篇文章主要介紹了android利用ContentResolver訪(fǎng)問(wèn)者獲取手機(jī)短信信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02Android開(kāi)發(fā)之ViewFlipper自動(dòng)播放圖片功能實(shí)現(xiàn)方法示例
這篇文章主要介紹了Android開(kāi)發(fā)之ViewFlipper自動(dòng)播放圖片功能實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android使用ViewFlipper實(shí)現(xiàn)圖片播放的相關(guān)界面布局及功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03ImageView的屬性android:scaleType的作用分析
本篇文章是對(duì)ImageView的屬性android:scaleType的作用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Android編程實(shí)現(xiàn)自定義控件的方法示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)自定義控件的方法,結(jié)合實(shí)例形式分析了Android自定義控件的布局、功能實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2017-06-06詳解Android中實(shí)現(xiàn)ListView左右滑動(dòng)刪除條目的方法
這篇文章主要介紹了Android中實(shí)現(xiàn)ListView左右滑動(dòng)刪除條目的方法,文中分別展示了通過(guò)Scroller和NineOldAndroids來(lái)實(shí)現(xiàn)的例子,需要的朋友可以參考下2016-04-04Android實(shí)現(xiàn)QQ登錄界面遇到問(wèn)題及解決方法
本文給大家介紹android仿qq登錄界面的實(shí)現(xiàn)代碼,在實(shí)現(xiàn)此功能過(guò)程中遇到各種問(wèn)題,但是最終都順利解決,如果大家對(duì)android qq登錄界面實(shí)現(xiàn)方法感興趣的朋友一起學(xué)習(xí)吧2016-09-09Android中隱藏標(biāo)題欄和狀態(tài)欄的方法
Android中隱藏標(biāo)題欄和狀態(tài)欄的方法,需要的朋友可以參考一下2013-05-05Android嵌套滾動(dòng)和協(xié)調(diào)滾動(dòng)的多種實(shí)現(xiàn)方法
嵌套的滾動(dòng)主要方式就是這些,這些簡(jiǎn)單的效果我們用協(xié)調(diào)滾動(dòng),如?CoordinatorLayout?也能實(shí)現(xiàn)同樣的效果,這篇文章主要介紹了Android嵌套滾動(dòng)和協(xié)調(diào)滾動(dòng)的多種實(shí)現(xiàn)方法,需要的朋友可以參考下2022-06-06