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