最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)的作為容器的話,需要注意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)文章

  • Flutter 完美的驗(yàn)證碼輸入框?qū)崿F(xiàn)

    Flutter 完美的驗(yàn)證碼輸入框?qū)崿F(xiàn)

    這篇文章主要介紹了Flutter 完美的驗(yàn)證碼輸入框?qū)崿F(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Android觸摸事件傳遞圖解

    Android觸摸事件傳遞圖解

    這篇文章主要一圖文結(jié)合的方式為大家詳細(xì)介紹了Android觸摸事件傳遞,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android studio實(shí)現(xiàn)滑動(dòng)開(kāi)關(guān)

    Android studio實(shí)現(xiàn)滑動(dòng)開(kāi)關(guān)

    這篇文章主要為大家詳細(xì)介紹了Android studio實(shí)現(xiàn)滑動(dòng)開(kāi)關(guān),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Android實(shí)現(xiàn)空心圓角矩形按鈕的實(shí)例代碼

    Android實(shí)現(xiàn)空心圓角矩形按鈕的實(shí)例代碼

    頁(yè)面上有時(shí)會(huì)用到背景為空心圓角矩形的Button,可以通過(guò)xml繪制出來(lái)。這篇文章主要介紹了Android實(shí)現(xiàn)空心圓角矩形按鈕的實(shí)例代碼,需要的朋友參考下吧
    2017-01-01
  • android開(kāi)發(fā)教程之startActivityForResult使用方法

    android開(kāi)發(fā)教程之startActivityForResult使用方法

    這篇文章主要介紹了android開(kāi)發(fā)教程之startActivityForResult使用方法,需要的朋友可以參考下
    2014-03-03
  • android讀取Assets圖片資源保存到SD卡實(shí)例

    android讀取Assets圖片資源保存到SD卡實(shí)例

    本文為大家詳細(xì)介紹下android讀取Assets圖片資源保存到SD卡的具體實(shí)現(xiàn),感興趣的各位可以參考下哈,希望對(duì)大家有所幫助
    2013-07-07
  • 動(dòng)態(tài)添加LinearLayout的高度實(shí)例

    動(dòng)態(tài)添加LinearLayout的高度實(shí)例

    下面小編就為大家?guī)?lái)一篇?jiǎng)討B(tài)添加LinearLayout的高度實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Android中實(shí)現(xiàn)ping功能的多種方法詳解

    Android中實(shí)現(xiàn)ping功能的多種方法詳解

    這篇文章主要介紹了Android中實(shí)現(xiàn)ping功能的多種方法詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Android倒計(jì)時(shí)神器(CountDownTimer)

    Android倒計(jì)時(shí)神器(CountDownTimer)

    這篇文章主要為大家詳細(xì)介紹了Android倒計(jì)時(shí)神器CountDownTimer,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • Android自定義View繪制的方法及過(guò)程(二)

    Android自定義View繪制的方法及過(guò)程(二)

    這篇文章主要解析了Android自定義View繪制的方法及過(guò)程,介紹了onSizeChanged、onDraw、onMeasure順序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評(píng)論

东兴市| 彭泽县| 泰州市| 荃湾区| 天津市| 高唐县| 赤峰市| 海丰县| 保亭| 南漳县| 高雄县| 嘉善县| 永新县| 广汉市| 宁晋县| 慈利县| 灵丘县| 浙江省| 顺平县| 博罗县| 靖西县| 富顺县| 衡阳县| 武城县| 苏尼特右旗| 宁国市| 探索| 祥云县| 安徽省| 西贡区| 澎湖县| 南阳市| 西青区| 兰考县| 安泽县| 营山县| 永宁县| 商洛市| 奉新县| 长沙市| 广灵县|