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

libmp3lame及API介紹和使用詳解

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

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里,這些功能是試驗(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會完成所有所需的緩沖,重采樣,過濾操作。需要的mp3buffer_size參數(shù)可以通過num_samples, samplerateencoding 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ā)生了錯誤。

   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)于比特流有些音樂播放器可能會覺得有用。用于CBR,ABR和VBR。將嘗試回到輸出流的開頭并寫入標(biāo)簽,但有可能會失敗,(比如,輸出到了其他地方),這時(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)

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

    Android觸摸事件傳遞圖解

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

    Android studio實(shí)現(xiàn)滑動開關(guān)

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

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

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

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

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

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

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

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

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

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

    這篇文章主要介紹了Android中實(shí)現(xiàn)ping功能的多種方法詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(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繪制的方法及過程(二)

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

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

最新評論

策勒县| 库车县| 枣庄市| 惠东县| 班戈县| 隆德县| 寻甸| 科技| 吴江市| 清远市| 江西省| 星子县| 安溪县| 民勤县| 商南县| 枣庄市| 兴隆县| 钟山县| 苏州市| 天津市| 桂平市| 信阳市| 余干县| 江城| 新津县| 邻水| 西乌珠穆沁旗| 疏附县| 巨野县| 泗洪县| 邓州市| 锡林郭勒盟| 治多县| 锡林郭勒盟| 基隆市| 额尔古纳市| 凭祥市| 宜章县| 紫云| 兴安盟| 锡林浩特市|