Master_Big 2016-03-07 14:04 采纳率: 33.3%
浏览 1702

自己用c写的录音代码播放没声音,可以保证播放部分没有问题,等大神

#include
#include
#include
#include
#include

typedef struct WAV
{
char riff[4];
long len;
char type[4];
char fmt[4];
char tmp[4];
short pcm;
short channel;
long sample;
long rate;
short framesize;
short bit;
char data[4];
long dblen;
}wav_t;

int main(int argc,char** argv)
{
printf("--size=%d\n",sizeof(wav_t));
int wavfd=open(argv[1],O_CREAT|O_WRONLY);
if(wavfd==-1)
{
printf("wavfd err=%s\n",strerror(errno));
return -1;

}

int speed=44100;
int channel=2;
int bit=16;
struct WAV head={"RIFF",44,"WAVE","fmt ","",0x10,channel,speed,channel*speed*bit/8,channel*bit/8,bit,"data",0};
// printf("channel=%d,speed=%d,bit=%d\n",head.channel,head.sample,head.bit);
write(wavfd,&head,sizeof(head));
close(wavfd);
wavfd=open(argv[1],O_CREAT|O_WRONLY);
int fd=open("/dev/dsp",O_RDONLY);
if(fd==-1)
{
printf("fd err=%s\n",strerror(errno));
return -1;

}
ioctl(fd,SNDCTL_DSP_CHANNELS,&channel);
ioctl(fd,SNDCTL_DSP_SPEED,&speed);
ioctl(fd,SNDCTL_DSP_SETFMT,&bit);
char buf[4096];
int len=0,t=0;
while(1)
{
int size=read(fd,buf,4096);
write(wavfd,buf,size);
len+=size;
t=len/(channel*speed*bit/8);
if(t>=5)break;
}
int all=len+44;
lseek(wavfd,0x04,0);
write(wavfd,&all,4);
lseek(wavfd,0x28,0);
write(wavfd,&len,4);
close(wavfd);
close(fd);
}

  • 写回答

2条回答

  • devmiao 2016-03-07 15:11
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?