使用PortAudio獲取音頻和lame庫壓縮成mp3

PortAudio

PortAudio是一個免費、跨平臺、開源的音頻I/O庫。得到的數據是PCM數據。

重要參數:

sampleFormat:精度(採樣寬度),一秒鐘內對聲音信號的採樣次數。

sampleRate:音頻採樣率 ,比如16bit,表示可以用2的16次方=65536種數據來區分一個音符。

framesPerBuffer : 回調的點數,採集到多少個點調用回調函數。

 

使用流程:

1、 初始化PA,掃描當前可用的音頻設備

2、打開流,設置音頻輸入/輸出、音道數目、音頻格式、採樣率等。

3、寫回調函數。

4、 啓動流,開始採樣,點數夠了自動回調用回調函數。

5、 回調函數返回1,或者調用相應的函數來停止流。

6、 關閉流。

7、終止PA。

                                                

lame

lame 是一個開源的MP3解碼編碼庫。

重要函數:

lame_set_in_samplerate  設置音頻採樣率 ,需要與PCM數據一致,設置採樣率後,然後編碼器會根據採樣點數來確定mp3時長。

lame_encode_buffer   編碼函數,它的參數規定了PCM數據時short型,如需要其它的採樣寬度,可以調用另外的編碼函數,比如lame_encode_buffer_long2。

lame_set_VBR   設置VBR/INFO tags mp3文件的信息,錯誤無法播放。

使用流程:

1、 使用 lame_init()初始化編碼器。編碼器的初始設置會輸出[J-Stereo, 44.1khz, 128kbps, CBR ,quality 5]規格的 MP3文件。使用一些的set/get方法調整參數,控制蔬菜MP3文件的質量和大小。

2、使用lame_init_params(),根據編碼器的現有設置初始化編碼器內部的設置。

3、使用lame_encode_buffer()將輸入的PCM數據編碼成MP3數據。(PortAudio回調的數據)

4、使用lame_encode_flush()將mp3buffer中的剩餘的MP3數據全部輸出。

5、 使用lame_mp3_tags_fid()將VBR/INFO tags封裝到一個MP3 Frame中

6、使用ame_close()釋放所有內部參數使用的空間。

 

lame_mp3_tags_fid函數崩潰的處理:

http://mp3-encoding.31853.n2.nabble.com/Re-lame-mp3-tags-fid-and-file-access-callbacks-td34000.html

- before calling lame_init_param, disable automatic ID3 tag writing: 

  lame_set_write_id3tag_automatic(gfp, 0); 

- before writing any encoded audio data into file: 

  imp3=lame_get_id3v2_tag(gfp, buffer, sizeof(buffer)); 
  fwrite(buffer, 1, imp3, outf); 
  audio_pos=ftell(outf); // store beginning of audio data 

- after encoding and flushing out all audio data: 

  imp3=lame_get_id3v1_tag(gfp, buffer, sizeof(buffer)); 
  fwrite(buffer, 1, imp3, outf); 

- now update the empty Xing/LAME tag frame in the beginning of audio stream: 

  imp3=lame_get_lametag_frame(gfp, buffer, sizeof(buffer)); 
  fseek(outf,audio_pos,SEEK_SET); // remember beginning of audio data 
  fwrite(buffer, 1, imp3, outf); 

 

代碼:

https://github.com/fengxieye/Qt-demo/tree/master/audio

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章