各位大虾:如何才能生成一个正确的8000HZ,16位,单声道的WAVE文件?大大送分.

lihhll 2001-11-19 07:46:13
各位大虾:我用下面的程序想生成一个8000HZ,16位,单声道的空的WAVE文件(58个字节),为什么不成功?请指教,还有那些参数要设置.
void CPcm::Createfile()
{

PCMWAVEFORMAT pcmWaveFormat;
MMCKINFO riffCK;
MMCKINFO childCK;
UINT cSample[4];
long wFlag=MMIO_CREATE|MMIO_WRITE|MMIO_EXCLUSIVE|MMIO_ALLOCBUF;
HMMIO hmmio=mmioOpen("temp.wav",NULL,wFlag);
riffCK.fccType =mmioStringToFOURCC("WAVE",MMIO_TOUPPER);
riffCK.cksize =0;
MMRESULT C= mmioCreateChunk (hmmio,&riffCK,MMIO_CREATERIFF);

LONG lFmtSize=(LONG)sizeof(pcmWaveFormat);
childCK.ckid =mmioStringToFOURCC ("fmt ",NULL);
childCK.cksize =lFmtSize;
MMRESULT N= mmioCreateChunk (hmmio,&childCK,NULL);

pcmWaveFormat.wf.wFormatTag = 1;
pcmWaveFormat.wf.nChannels=1;
pcmWaveFormat.wf.nSamplesPerSec=8000;
pcmWaveFormat.wf.nAvgBytesPerSec=8000;
pcmWaveFormat.wf.nBlockAlign=2;
pcmWaveFormat.wBitsPerSample=16;
LONGS=mmioWrite(hmmio,(LPTSTR)&pcmWaveFormat,
(LONG)sizeof(pcmWaveFormat));
MMRESULT D= mmioAscend(hmmio,&childCK,NULL);
childCK.ckid =mmioStringToFOURCC ("fact",NULL);
childCK.cksize =4;
MMRESULT M= mmioCreateChunk (hmmio,&childCK,NULL);
LONG K= mmioWrite(hmmio,(LPTSTR)&cSample,4);
MMRESULT B= mmioAscend(hmmio,&childCK,NULL);
childCK.ckid =mmioStringToFOURCC ("data",NULL);
childCK.cksize =0;
MMRESULT L= mmioCreateChunk (hmmio,&childCK,NULL);

LONG P= mmioWrite(hmmio,NULL,0);

MMRESULT O= mmioAscend(hmmio,&childCK,0);
MMRESULT PS= mmioAscend(hmmio,&riffCK,0);
MMRESULT R= mmioFlush(hmmio,MMIO_EMPTYBUF);
mmioClose(hmmio,0);


}
用Createfile()生成的WAVE文件的格式为:
52 49 46 46 30 00 00 00 57 41 56 45 66 6D 74 20
10 00 00 00 01 00 01 00 40 1F 00 00 40 1F 00 00
02 00 10 00 66 61 63 74 04 00 00 00 CC CC CC CC
64 61 74 61 00 00 00 00

正常的8000HZ,16位 单声道 的WAVE文件的格式为:

52 49 46 46 32 00 00 00 57 41 56 45 66 6D 74 20
12 00 00 00 01 00 01 00 40 1F 00 00 80 3E 00 00
02 00 10 00 00 00 66 61 63 74 04 00 00 00 00 00
00 00 64 61 74 61 00 00 00 00

请问如何才能生成这种8000HZ,16位 单声道的空的WAVE文件



...全文
302 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinx 2001-11-20
  • 打赏
  • 举报
回复
wavecn1.3我试过了,好像有bug
cloudfog 2001-11-20
  • 打赏
  • 举报
回复
nAvgBytesPerSec
Required average data-transfer rate, in bytes per second, for the format tag. If wFormatTag is WAVE_FORMAT_PCM, nAvgBytesPerSec should be equal to the product of nSamplesPerSec and nBlockAlign. For non-PCM formats, this member must be computed according to the manufacturer's specification of the format tag.
这是platform sdk上的原文,你程序中设的不对,应该为16000
yinx 2001-11-20
  • 打赏
  • 举报
回复
8000Hz 16位 单声道,不就是pcm一次群的信号吗?不好意思原来把采样频率看错了,看成80000Hz了
yinx 2001-11-20
  • 打赏
  • 举报
回复
http://gzzj.com/sender/index.html 上有一个wavecn1.3可以转换 ,你可以向作者索要源代码,
lihhll 2001-11-20
  • 打赏
  • 举报
回复
楼上:我要做一个wave文件,把这个WAVE文件通过MODEM和电话传出去,而通过MODEM和电话线传的WAVE文件的格式为8000HZ,16位 单声道 的WAVE文件。
yinx 2001-11-19
  • 打赏
  • 举报
回复
有8000Hz的wav文件吗,要那么大的采样频率干什么?

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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