这两天把以前的一个程序从Oss接口改为Alsa接口,按照Alsa的例子将声音输出部分修改后,播放时发出的声音断断续续,并且有很大的杂音。开始以为是Format没有设对,将所有的Format设了一遍仍然不行。将声音转成PCM数据用aplay来播放就没问题,看了aplay的代码发现自己调用snd_pcm_writei有错。原来Oss接口时直接使用write(设备句柄,buffer,data_size),现在改成snd_pcm_writei时没有修改,snd_pcm_writei要求的参数是(设备句柄,buffer,frame_size),最后一个frame_size也就是buffer中的数据有多少个frame,这个可以用公式:(buffer_size*8)/(采样位数*声道),buffer_size*8是bit数,采样位数一般是16,声道就是1或者2,这样典型的mp3数据比如16bit,立体声,那么frame_size = buffer_size * 8 / (16*2),修改之后,播放正常了。
PS:
frame_size其实就是这些数据是多少个sample