libmp3lame及API介紹和使用詳解
API介紹
API地址是對libmp3lame.so的編碼部分最基礎(chǔ)接口的介紹,本庫特包含了增加id3標(biāo)簽和mp3的解碼的支持。這里并不是完整的文檔,但是你可以通過查看"include/lame.h"找到他們,并且通過查看frontend/main.c看到部分編解碼的源代碼。
- (可選) 如果你感興趣,可以獲取編碼器的版本號.
void get_lame_version(char *strbuf, size_t buflen, const char *prefix);
- 錯誤信息。
LAME
默認(rèn)情況下會使用vfprintf()
將錯誤信息給stderr,在一些有界面的應(yīng)用下,可能獲取方面會有問題,所以支持你設(shè)置自己的錯誤信息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
里,這些功能是試驗性的僅僅用來測試,可能在后續(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
會完成所有所需的緩沖
,重采樣
,過濾
操作。需要的mp3buffer_size
參數(shù)可以通過num_samples
, samplerate
和encoding rate
計算出來,這里有一個最壞情況的估算:
mp3buffer_size (in bytes) = 1.25 * num_samples + 7200
num_samples
為PCM每個channel包含的采樣數(shù)量,不是L通道和R通道中樣本數(shù)量的總和,也就是單個channel的采樣數(shù)量。
返回值為mp3buffer中包含的byte的數(shù)量,可以為0,如果是負(fù)值說明發(fā)生了錯誤。
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ū)并可能返回最后幾個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);
這將添加一個有效的mp3幀,其中包含關(guān)于比特流有些音樂播放器可能會覺得有用。用于CBR,ABR和VBR。將嘗試回到輸出流的開頭并寫入標(biāo)簽,但有可能會失敗,(比如,輸出到了其他地方),這時候就需要在上面的步驟3之前調(diào)用lame_set_bWriteVbrTag(gfp,0)
,并且調(diào)用lame_mp3_tags_fid() with fid=NULL
,如果嘗試回到開頭失敗比特流的第一個mp3幀都是0。
- 釋放內(nèi)部數(shù)據(jù)結(jié)構(gòu)體
void lame_close(lame_global_flags *);
簡單使用
其實API的介紹已經(jīng)把用法說的很清楚了,除了第一第二步,順著走下來就好了。
這里感覺沒有什么好說的,寫我在用它的時候遇到的問題吧。
編碼結(jié)束之后發(fā)現(xiàn)MP3時長變成了源音頻的4倍,使用Audacity查看如圖所示:
并且放大之后發(fā)現(xiàn)每一幀后面都是空的,只有前面的小部分是有效的。
查看之后其實最主要的就是 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ù),兩個要注意的點:
- 他需要的是
short int pcm[]
,在準(zhǔn)備數(shù)據(jù)的時候如果是用了uint8_t
或者char
之類的作為容器的話,需要注意size需要除以二,變成short int
的size. nsamples
的參數(shù)理解,是單個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)文章
android利用ContentResolver訪問者獲取手機(jī)短信信息
本篇文章主要介紹了android利用ContentResolver訪問者獲取手機(jī)短信信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02Android開發(fā)之ViewFlipper自動播放圖片功能實現(xiàn)方法示例
這篇文章主要介紹了Android開發(fā)之ViewFlipper自動播放圖片功能實現(xiàn)方法,結(jié)合實例形式分析了Android使用ViewFlipper實現(xiàn)圖片播放的相關(guān)界面布局及功能實現(xiàn)技巧,需要的朋友可以參考下2019-03-03ImageView的屬性android:scaleType的作用分析
本篇文章是對ImageView的屬性android:scaleType的作用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06詳解Android中實現(xiàn)ListView左右滑動刪除條目的方法
這篇文章主要介紹了Android中實現(xiàn)ListView左右滑動刪除條目的方法,文中分別展示了通過Scroller和NineOldAndroids來實現(xiàn)的例子,需要的朋友可以參考下2016-04-04Android實現(xiàn)QQ登錄界面遇到問題及解決方法
本文給大家介紹android仿qq登錄界面的實現(xiàn)代碼,在實現(xiàn)此功能過程中遇到各種問題,但是最終都順利解決,如果大家對android qq登錄界面實現(xiàn)方法感興趣的朋友一起學(xué)習(xí)吧2016-09-09Android中隱藏標(biāo)題欄和狀態(tài)欄的方法
Android中隱藏標(biāo)題欄和狀態(tài)欄的方法,需要的朋友可以參考一下2013-05-05Android嵌套滾動和協(xié)調(diào)滾動的多種實現(xiàn)方法
嵌套的滾動主要方式就是這些,這些簡單的效果我們用協(xié)調(diào)滾動,如?CoordinatorLayout?也能實現(xiàn)同樣的效果,這篇文章主要介紹了Android嵌套滾動和協(xié)調(diào)滾動的多種實現(xiàn)方法,需要的朋友可以參考下2022-06-06