导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

怎样把我的录音程序的录音数据保存为WAV格式文件

liuyan4794 2004-04-07 10:55:12
怎样把我的录音程序的录音数据保存为WAV格式文件,录音数据在一缓冲区内
...全文
179 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowWind 2004-08-30
mark
回复
liuyan4794 2004-04-10
太谢谢大家了,我能给问题加分吗
我觉得大家对我这么好,20分似乎不够
回复
tangshiping 2004-04-09
楼主安在?
回复
captainwh 2004-04-08
好好看看msdn中Multimedia File I/O的部分, 保存wav文件也就是RIFF文件的操作问题。
或者直接自己写文件也可以, 我写了一个保存pcm数据的类:
头文件:PcmWriter.h

#include <mmsystem.h>

class CPCMWriter
{
public:
CPCMWriter();
virtual ~CPCMWriter();
int Init(CHAR *szFileName, WAVEFORMATEX *pfx);
void Cleanup();
int UpdateAudio(char *pBuf, int nSize);

protected:
BOOL m_fInited;
FILE *m_fp;
DWORD m_dwTotalSize;
DWORD m_dwAudioSize;
};

实现文件: PCMWriter.cpp

CPCMWriter::CPCMWriter()
: m_fInited(FALSE), m_fp(NULL)
{
m_dwTotalSize = m_dwAudioSize = 0;
}

CPCMWriter::~CPCMWriter()
{
if (m_fInited)
Cleanup();
}

int CPCMWriter::Init(CHAR *szFileName, WAVEFORMATEX *pfx)
{
if (m_fInited)
return -1;

m_fp = fopen(szFileName, "wb");
if (m_fp == NULL)
return -1;

m_dwTotalSize = 44;
m_dwAudioSize = 0;

// write wave file header
fwrite("RIFF", 1, sizeof(DWORD), m_fp); DWORD dwSize = 44;
fwrite(&dwSize, 1, sizeof(DWORD), m_fp);
fwrite("WAVE", 1, sizeof(DWORD), m_fp); fwrite("fmt ", 1, sizeof(DWORD), m_fp);
dwSize = sizeof(PCMWAVEFORMAT);
fwrite(&dwSize, 1, sizeof(DWORD), m_fp);
fwrite(pfx, 1, dwSize, m_fp);
fwrite("data", 1, sizeof(DWORD), m_fp);
dwSize = 0;
fwrite(&dwSize, 1, sizeof(DWORD), m_fp);

return 0;
}

void CPCMWriter::Cleanup()
{
if (m_fInited)
{
fseek(m_fp, 4, SEEK_SET);
fwrite(&m_dwTotalSize, 1, sizeof(DWORD), m_fp);
fseek(m_fp, 40, SEEK_SET);
fwrite(&m_dwAudioSize, 1, sizeof(DWORD), m_fp);

fclose(m_fp);
m_fp = NULL;
}
}

int CPCMWriter::UpdateAudio(char *pBuf, int nSize)
{
_ASSERT(pBuf);

if (nSize == 0)
return -1;

if (m_fp == NULL)
return -1;

fwrite(pBuf, 1, nSize, m_fp);
m_dwTotalSize += nSize;
m_dwAudioSize += nSize;
return 0;
}

记得给分哦
回复
liuyan4794 2004-04-08
大家帮帮我啊
回复
tangshiping 2004-04-08
要是想看wav的标准头, to : toreed@163.com
我有,前段时间做了和你现在一样的工作,所以收集的比较齐,呵呵
回复
tangshiping 2004-04-08
#define BUFFERWIDTH 100000
CFile filenew;//要转换的目标wav文件
filenew.Open(m_desFileName ,CFile::typeBinary|CFile::modeWrite|CFile::modeCreate);//二进制读写方式打开
//加头chunk
char head1[]={0X52,0X49,0X46,0X46};//riff
//.............r....i....f....f
int binsize;//二进制数据文件大小
int chunksize;//头的大小
binsize=..........//后边你的缓冲区中的数据部分的大小
chunksize = binsize + 50;//如果用第一个标准wav头(head2[])的话把50换成36
//char head2[]={0X57,0X41,0X56,0X45,0X66,0X6D,0X74,0X20,0X10,0X00,0X00,0X00,0X01,0X00,0X01,0X00,0X40,0X1F,0X00,0X00,0X40,0X1F,0X00,0X00,0X01,0X00,0X08,0X00,0X64,0X61,0X74,0X61};
//标准wav头chunk,下面的那个不是标准的,不过有时候录音采用那个头,那个如果音质不好的话就注释掉下面用这个头好了

char head2[]={0X57,0X41,0X56,0X45,0X66,0X6D,0X74,0X20,0X12,0X00,0X00,0X00,0X06,0X00,0X01,0X00,0X40,0X1F,0X00,0X00,0X40,0X1F,0X00,0X00,0X01,0X00,0X08,0X00,0x00,0x00,0x66,0x61,0x63,0x74,0x04,0x00,0x00,0x00,0x46,0xE7,0x01,0x00,0X64,0X61,0X74,0X61};//头chunk,jmc2248a
filenew.Write(head1, sizeof(head1));
filenew.Write(reinterpret_cast<char *>(&chunksize),4 );
filenew.Write(head2, sizeof(head2));
filenew.Write(reinterpret_cast<char *>(&binsize),4 );
//加数据

char buf[BUFFERWIDTH];
DWORD dw = 0;
do{
........//自己读缓冲区吧
filenew.Write(buf, dw);
}while(dw==BUFFERWIDTH);
fileold.Close();
filenew.Close();
MessageBox("转换成功!!!");
回复
taianmonkey 2004-04-08
http://www.vckbase.com/document/viewdoc.asp?id=1037
回复
tangshiping 2004-04-08
我能帮你把wav的头写进新文件,余下的自己能搞定吧?呵呵
回复
yoyohon 2004-04-08
一般简单的操作采用mm(Multi Media)的操作就可以了,MSDN中可以查到相关的资料

如果需要高级一些的操作也可以使用DirectSound来进行,也在MSDN中有例程。

回复
liuyan4794 2004-04-07
怎么看不见我提的问题?
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……