音频文件的解码和编码接口
一、接口要求:(经过三次讨论)
解码需要提供:
1、对文件的解码初始化 void *wav_rd_init(char *filename);
2、对内存文件的解码初始化 void *wav_rdmem_init(void *pbuf,int len);
3、对音频帧的解码 int wav_rd_frame(void *void_p, short *pcmbuf);
4、对文件解码结束处理 int wav_rd_exit(void *void_p);
5、总播放时间 int wav_rd_totalms(void *void_p);
6、总帧数 int wav_rd_totalframes(void *void_p);
7、通道数 int wav_rd_channels(void *void_p);
8、采样率 int wav_rd_samplerate(void *void_p);
9、对帧的seek功能 int wav_rd_seek(void *void_p);
编码提供:(只提供8000Hz,mono的msadpcm录音)
1、对文件编码初始化 void *wav_wt_init(char *filename);
2、对音频帧的编码 int wav_wt_frame(void *void_p,short *pcmbuf,int pcmlen);
3、对文件编码的结束处理 int wav_wt_exit(void *void_p);
函数提供:
1、对频率的转换 int wav_convert(short *srcbuf,int srclen,int srcsamplerate,int srcchannels,short *dstbuf,int dstsamplerate);
对以前的播放和录音接口进行了修改。
说明:
1、本解码提供初始化和结束处理,由初始化分配数据结构,由结束处理释放数据结构。
2、以帧为单位进行读文件和解码。
3、在seek时也是以帧为单位进行前后移动的。
4、提供文件读和内存文件读两种方式。要求文件完整。
5、由应用程序提供足够保存一帧数据的pcmbuf,要求>=8192字节,以防内存出界。
6、解码后的pcm数据(16位的short型)保存在pcmbuf中,返回实际长度(单位为16位)。
7、在播放时需要对三要素:位深、通道数和采样率进行设置,这里提供通道数和采样率的api,位深固定采用16位。
8、解码提供的位深有8位和16位两种,通道数有1(mono)和2(stereo)两种,采样率可以为6000,8000,11025,16000,22050,32000,44100Hz
9、编码只提供16位、单通道、采样率为8000Hz的msadpcm录音。要求提供的数据满足要求。返回实际消耗的长度。
10、另提供一个采样率转换函数,对硬件不支持的频率进行转换。立体声的数据是交错存放的。(LLRRLLRR...)
要求srclen是16位short的长度,返回值为转换后的short数据长度。
11、本程序中涉及的样本数据长度都是以16的short为单位的。
12、 对于amr和mp3的接口采用类似的名字,只要将前三字母变为amr和mp3即可。
在linux下编译:
测试有两个编译宏定义:
WAV_DEBUG :将main、wavplay和wavrecord编译到程序代码中,以便测试。
MEM_FILE:在WAV_DEBUG有效的情况下,将文件先读到内存,对内存文件进行测试
在进行集成编解码时这部分就不会编译进去了。或把这部分删除即可。
测试编译:
播放测试:
gcc -DWAV_DEBUG -o wavplay wav.c
gcc -DWAV_DEBUG -DMEM_FILE -o wavplay wav.c
录音测试:
gcc -DWAV_DEBUG -o wavrecord wav.c
注意:执行文件的名字必须为:wavplay 和wavrecord。
集成编译时,不用加WAV_DEBUG和MEM_FILE变量。
命令行参数:
usage:./wavplay test.wav
usage: ./wavrecord tst.wav
另一测试方法:(录音已用input.dat更换)
测试时可以将音频接口/dev/dsp更换为
录音时:input.dat
放音时:out.dat (不必调用wav_rd_setparam和wav_convert进行频率转换了。)
对输出out.dat可以用音频编辑软件cool edit pro进行文件的查看。