linux下音频采集与播放问题

kugaking86 2015-07-03 02:02:19
大家好,
本人在开发板上做了一个实时音频监听程序,主要流程如下:
1、打开dev\dsp设备,并设置参数
2、进入while(1)不断进行 采集read()和 播放 write()
目前情况:在采样率为8k的时候,声音听起来很流畅,但把采样率提到16k时,就会出现吱吱的杂音。因为采集与播放都用到了同一个设备,所以两者不能并行处理,只能串行,这样就肯定会有声音丢失,但是,个人认为丢失不多的话影响不大,采样率为8k的时候,播放没有问题就可以证明这一点,但现在的问题是为什么16k不行呢?

附上简单源码:
int i=1,rp=1;
int fd;
int bits, chns;
int status;
rate = atoi(argv[1]);
if(rate != 16000 && rate != 8000) rate = 8000;
printf("run rate: %d\n",rate);
fd = open("/dev/dsp", O_RDWR);
if (fd < 0) {
printf("open of /dev/dsp failed\n");
return -1;
}
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &rate);
if (status == -1)
printf("SOUND_PCM_WRITE_WRITE ioctl failed\n");
bits = SIZE; /* sample size */
status = ioctl(fd, SNDCTL_DSP_SETFMT, &bits); //for 6446
if (status == -1)
printf("SOUND_PCM_WRITE_BITS ioctl failed\n");
if (bits != SIZE)
printf("unable to set sample size\n");
chns = CHANNELS; /* mono or stereo */
status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &chns);
if (status == -1)
printf("SOUND_PCM_WRITE_CHANNELS ioctl failed\n");
if (chns != CHANNELS)
printf("unable to set number of channels\n");

set_input_select(0);//选择mic输入

frag_size = atoi(argv[2]);
//frag_size = 320;
if(frag_size <= 0 || frag_size > 1000) frag_size = DEF_FRAGSIZE;;
ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &frag_size);
printf("run frag_size: %d\n",frag_size);
//int frag_num = DEF_FRAGNUM;
int frag_num = atoi(argv[3]);
if(frag_num <= 0 || frag_num > 1000) frag_num = DEF_FRAGNUM;;
ioctl(fd, 5001, &frag_num);
printf("run frag_num: %d\n",frag_num);

signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
signal(SIGABRT, signal_handler);


int size, avail;
ioctl(fd, 5002, NULL);

int read_size = atoi(argv[2])/40;
rp = 0;
while (1) {

if(rp)
{
//printf("start record! rb:%d\n",rb);

size = read(fd, &buf[read_start], read_size);
//write(r_fd, &buf[read_start], read_size);
read_start += read_size;
read_start %= BUF_LENGTH;

rp=0;
}
else
{

size = write(fd, &buf[write_start], read_size);
//write(r_fd, rebuf1, read_size);
write_start += read_size;
write_start %= BUF_LENGTH;
rp=1;
}


}
system("date");
close(fd);
return 0;
...全文
450 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_26738239 2015-07-28
  • 打赏
  • 举报
回复
我最近也在做这一块,在录音时可以实时听到声音,但是保存下来成为WAV格式后,拿出来听又会出问题,完全是一些噪音,请问大家这是怎么回事呢?
kugaking86 2015-07-22
  • 打赏
  • 举报
回复
引用 4 楼 falloutmx 的回复:
语速快说明你的AD采样率没变,一直是8K,只是你编码或者读取pcm原始数据的时候多读了一倍
知道原因了,是因为声道数的问题,我的平台声道数是默认为2且不能修改,我之前以为可以修改的,而且一直是按照单声道来处理,结果就出现现在的问题了。 谢谢你的回复啊
kugaking86 2015-07-07
  • 打赏
  • 举报
回复
引用 2 楼 falloutmx 的回复:
存成文件再听不就知道是不是性能问题了?你设置8K/16K是针对AD设的吗?
存成文件听的话也是有杂音,而且语速比实时监听的要快很多
kugaking86 2015-07-07
  • 打赏
  • 举报
回复
引用 4 楼 falloutmx 的回复:
语速快说明你的AD采样率没变,一直是8K,只是你编码或者读取pcm原始数据的时候多读了一倍
谢谢你的回复,我再确认一下
精分患者 2015-07-07
  • 打赏
  • 举报
回复
试试ffmpeg,别自己写了。。。。
falloutmx 2015-07-07
  • 打赏
  • 举报
回复
语速快说明你的AD采样率没变,一直是8K,只是你编码或者读取pcm原始数据的时候多读了一倍
kugaking86 2015-07-06
  • 打赏
  • 举报
回复
怎么没有人来看看呢
falloutmx 2015-07-06
  • 打赏
  • 举报
回复
存成文件再听不就知道是不是性能问题了?你设置8K/16K是针对AD设的吗?

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧