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 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条