使用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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值