当前位置: 技术问答>linux和unix
请问如何实现声音的录制和播放?不够了再加分
来源: 互联网 发布时间:2015-05-28
本文导语: 1、有相关文章说播放wav文件只要读取文件头再设置dsp就可以播放了,请问dsp如何设置,是什么格式的,有没相关的原代码。 2、关于声音的录制,如何从microphone取得声音,wav的文件头如何设置。我现在的程序不能录...
1、有相关文章说播放wav文件只要读取文件头再设置dsp就可以播放了,请问dsp如何设置,是什么格式的,有没相关的原代码。
2、关于声音的录制,如何从microphone取得声音,wav的文件头如何设置。我现在的程序不能录音,生成的wav格式也不正确。
各位大哥帮帮忙啊
以下是我的代码:
int i,j;
int id,fd;
char testBuf[4096]={0};
if ( ( id=open( "/dev/audio",O_RDWR ) )==-1 )
{
QMessageBox::information(this,"Sound Card Error",
"Can not find sound card.");
}
if ( ( fd=open("/mnt/test.wav",O_RDWR) )==-1 )
{
QMessageBox::information( this,"File Error",
"No such File:test.wav" );
}
i=0;
ioctl( id,SNDCTL_DSP_RESET,(char *)&i );
ioctl( id,SNDCTL_DSP_SYNC,(char *)&i );
i=1;
ioctl( id,SNDCTL_DSP_NONBLOCK,(char *)&i);
i=8000;
ioctl( id,SNDCTL_DSP_SPEED,(char *)&i);
i=1;
ioctl( id,SNDCTL_DSP_CHANNELS,(char *)&i );
i=8;
ioctl( id,SNDCTL_DSP_SETFMT,(char *)&i );
i=3;
ioctl( id,SNDCTL_DSP_SETTRIGGER,(char *)&i );
i=3;
ioctl( id,SNDCTL_DSP_SETFRAGMENT,(char *)&i );
i=1;
ioctl( id,SNDCTL_DSP_PROFILE,(char *)&i );
for (int k=0;k0)
{
write(fd,testBuf,i);
j++;
}
}
close(id);
close(fd);
2、关于声音的录制,如何从microphone取得声音,wav的文件头如何设置。我现在的程序不能录音,生成的wav格式也不正确。
各位大哥帮帮忙啊
以下是我的代码:
int i,j;
int id,fd;
char testBuf[4096]={0};
if ( ( id=open( "/dev/audio",O_RDWR ) )==-1 )
{
QMessageBox::information(this,"Sound Card Error",
"Can not find sound card.");
}
if ( ( fd=open("/mnt/test.wav",O_RDWR) )==-1 )
{
QMessageBox::information( this,"File Error",
"No such File:test.wav" );
}
i=0;
ioctl( id,SNDCTL_DSP_RESET,(char *)&i );
ioctl( id,SNDCTL_DSP_SYNC,(char *)&i );
i=1;
ioctl( id,SNDCTL_DSP_NONBLOCK,(char *)&i);
i=8000;
ioctl( id,SNDCTL_DSP_SPEED,(char *)&i);
i=1;
ioctl( id,SNDCTL_DSP_CHANNELS,(char *)&i );
i=8;
ioctl( id,SNDCTL_DSP_SETFMT,(char *)&i );
i=3;
ioctl( id,SNDCTL_DSP_SETTRIGGER,(char *)&i );
i=3;
ioctl( id,SNDCTL_DSP_SETFRAGMENT,(char *)&i );
i=1;
ioctl( id,SNDCTL_DSP_PROFILE,(char *)&i );
for (int k=0;k0)
{
write(fd,testBuf,i);
j++;
}
}
close(id);
close(fd);
|
其实录音就是从声卡读数据,播音就是向声卡写数据。如果要把声音存为特定的格式要参照相应的文件的文件头。
|
wav文件的开头是wav头,接着是PCM采样数据。
PCM是脉冲编码调制的意思。就是把模拟信号经过采样,量化和得到的数字波形表示。
http://www.linuxeden.com/edu/doctext.php?docid=2216
PCM是脉冲编码调制的意思。就是把模拟信号经过采样,量化和得到的数字波形表示。
http://www.linuxeden.com/edu/doctext.php?docid=2216