Lame To MP3

Lame framework

邏輯過程

1、聲明Lame全局變量
2、初始化Lame并設(shè)置各種轉(zhuǎn)碼參數(shù)
3、開始轉(zhuǎn)碼

// 初始化
lame_t lame = lame_init();
//設(shè)置wav的采樣率
 lame_set_in_samplerate(lame, 44100.0);
//聲道,不設(shè)置默認(rèn)為雙聲道
lame_set_num_channels(lame, 2);
// 設(shè)置比特率, 默認(rèn)是(vbr_off)CBR,vbr_default  = vbr_mtrh 是VBR
lame_set_VBR(lame, vbr_default);
// 設(shè)置好的參數(shù)建立編碼器
lame_init_params(lame);

// pcm文件還沒讀取完成,將PCM數(shù)據(jù)送入編碼器,獲取編碼出的mp3數(shù)據(jù)。這些數(shù)據(jù)寫入文件就是mp3文件。
// lame_encode_buffer 單聲道,16位
// lame_encode_buffer_interleaved 雙聲道,16位
// lame_encode_buffer_float 單聲道,32位
write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
// pcm文件已經(jīng)全部讀取完畢。
write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
// 寫入文件
fwrite(mp3_buffer, write, 1, mp3);
// 編碼完成之后,寫入Mp3 VBR Tag,如果不寫入的話,可能會(huì)導(dǎo)致某些播放器播放時(shí)獲取時(shí)長出現(xiàn)問題,所以建議寫入。
lame_mp3_tags_fid(lame, mp3);
//銷毀編碼器,釋放資源。
lame_close(lame);

fopen

頭文件:#include<stdio.h>
定義函數(shù):FILE * fopen(const char * path,const char * mode);
mode:

  • r打開只讀文件,該文件必須存在。
  • r+打開可讀寫的文件,該文件必須存在。
  • w打開只寫文件,若文件存在則文件長度清為0,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件。
  • w+打開可讀寫文件,若文件存在則文件長度清為零,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件。
  • a以附加的方式打開只寫文件。若文件不存在,則會(huì)建立該文件,如果文件存在,寫入的數(shù)據(jù)會(huì)被加到文件尾,即文件原先的內(nèi)容會(huì)被保留。
  • a+ 以附加方式打開可讀寫的文件。若文件不存在,則會(huì)建立該文件,如果文件存在,寫入的數(shù)據(jù)會(huì)被加到文件尾后,即文件原先的內(nèi)容會(huì)被保留。
    上述的形態(tài)字符串都可以再加一個(gè)b字符,如rb、w+bab+等組合,加入b字符用來告訴函數(shù)庫打開的文件為二進(jìn)制文件,而非純文字文件。
    返回值:
    文件順利打開后,指向該流的文件指針就會(huì)被返回,如果文件打開失敗則返回NULL
#include <stdio.h>
main() 
{
  File *fp = fopen()先寫一個(gè)文件
  FILE *fp; /*定義一個(gè)文件指針*/ 
  int i; 
  fp=fopen("wenjian", "rb"); /*打開當(dāng)前目錄名為wenjian的文件只讀*/ 
  if(fp==NULL) /*判斷文件是否打開成功*/ 
  puts("File open error");/*提示打開不成功*/ 
  i=fclose(fp); /*關(guān)閉打開的文件*/ 
  if(i==0) /*判斷文件是否關(guān)閉成功*/ 
  printf("O,K"); /*提示關(guān)閉成功*/ 
  else 
  puts("File close error");/*提示關(guān)閉不成功*/ 
} 

VBR編碼

Variable Bit Rate(可改變之比特率)

提供內(nèi)容供用戶下載、 將內(nèi)容在本地播放或者在讀取速度有限的設(shè)備 如CD或 DVD播放機(jī) 上播放時(shí),請使用VBR編碼。當(dāng) 編碼內(nèi)容中混有簡單數(shù)據(jù)和復(fù)雜數(shù)據(jù)(例如,在快動(dòng)作和慢動(dòng)作間切換的視頻)時(shí),VBR 編碼是很有優(yōu)勢的。使用VBR編碼時(shí),系統(tǒng)將自動(dòng)為內(nèi)容的簡單部分分配較少的比特,從而留出足量的比特用于生成高質(zhì)量的復(fù)雜部分。這意味著復(fù)雜性恒定的內(nèi)容(例如新聞播音)不會(huì)受益于VBR編碼。
使用時(shí),你可以選擇從最差音質(zhì)/最大壓縮比到最好音質(zhì)/最低壓縮比之間的種種過渡級數(shù),在MP3文件編碼之時(shí),程序會(huì)嘗試保持所選定的整個(gè)文件的品質(zhì),將選擇適合音樂文件的不同部分的比特率來編碼。主要優(yōu)點(diǎn)是可以讓整首歌都能大致達(dá)到我們的品質(zhì)要求,缺點(diǎn)是編碼時(shí)無法估計(jì)壓縮出來的文件大小。
VBR 適合的應(yīng)用場景是媒體存儲,而不是網(wǎng)絡(luò)傳輸

MP3幀頭格式

能盡快和精確地計(jì)算一個(gè)MPEG文件的播放時(shí)長,最常見的是MPEG-1 Layer III (既MP3),它應(yīng)用了比較成熟的壓縮技術(shù)。
一個(gè)MPEG音頻文件是由很多幀數(shù)據(jù)組成。Layer II,II,III的音頻幀頭都是相同的,不同之處體現(xiàn)在音頻數(shù)據(jù)的編碼方式。幀本身是由slot組成的。Layer I的slot大小是4字節(jié),其余情況是1字節(jié)。

參考
MP3文件格式解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容