欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

libmp3lame及API介紹和使用詳解

 更新時(shí)間:2023年04月27日 09:15:08   作者:Yocn  
這篇文章主要為大家介紹了libmp3lame及API介紹和使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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, samplerateencoding 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)文章

最新評(píng)論