高分相增:知道wave文件格式的请进来!

jlfuhappy 2003-05-30 08:52:59
我在做WAVE的压缩文件的时候,不知道对录取下来的数据如何保存,对WAVE的压缩格式不清楚,谁知道的很清楚!?能否告之小弟一声。
   我有如下疑惑:能否用WAVEFORMATEX格式来保存WAVE压缩格式的文件么!??  还是应该直接使用压缩的格式,比如使用MPEG Layer3就使用压缩格式WAVE_FORMAT_MPEGLAYER3 ?????????? 但是我用两个都不行哦!!
   望那位高手不吝赐教!!!!(如果有耐心看我的源代码并解决问题,本人将另外有高分相赐!
...全文
87 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
captainwh 2003-06-10
  • 打赏
  • 举报
回复
保存wav数据:
HMMIO m_hmmio; //文件句柄
MMCKINFO riffInfo, fmtInfo, dataInfo; //riff块
WAVEFORMATEX *pwavfmt; //wav format信息
char *pBuf; //pcm数据缓冲区

//打开文件
m_hmmio = mmioOpen(szFileName, NULL, MMIO_ALLOCBUF | MMIO_CREATE | MMIO_WRITE);
if (NULL == m_hmmio)
return -1;

//创建riff块
riffInfo.ckid = mmioFOURCC('R', 'I', 'F', 'F');
riffInfo.fccType = mmioFOURCC('W', 'A', 'V', 'E');
riffInfo.cksize = 0;
if (mmioCreateChunk(m_hmmio, &riffInfo, MMIO_CREATERIFF) != 0)
{
Close();
return -1;
}

//创建fmt块
fmtInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
fmtInfo.cksize = sizeof(PCMWAVEFORMAT);
if (mmioCreateChunk(m_hmmio, &fmtInfo, 0) != 0)
{
Close();
return -1;
}

//写入WAVEFORMAT信息
if (mmioWrite(m_hmmio, (const char*)pwavfmt, sizeof(PCMWAVEFORMAT)) != sizeof(PCMWAVEFORMAT))
{
Close();
return -1;
}


//退出fmt块,返回riff块
mmioAscend(m_hmmio, &fmtInfo, 0);

//创建data块
dataInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
dataInfo.cksize = 0;
if (mmioCreateChunk(m_hmmio, &dataInfo, 0) != 0)
{
Close();
return -1;
}

//写入数据
mmioWrite(m_hmmio, pBuf, size);

//更新数据大小
mmioAscend(m_hmmio, &dataInfo, 0);
mmioAscend(m_hmmio, &riffInfo, 0);

//关闭文件
mmioClose(m_hmmio, 0);
zjc2001 2003-05-31
  • 打赏
  • 举报
回复
关于wave格式的说明,msdn中介绍得很清楚。用声卡录制的数据是PCM编码,可将PCM转换成ADPCM,文件大小可缩小一半,声音还不失真。
tserpent 2003-05-30
  • 打赏
  • 举报
回复
wave 格式:
if(!(hmmio = mmioOpen(szFileName, NULL, MMIO_READ | MMIO_ALLOCBUF)))
{
return -1;
}

MMIOINFO mmInfoStart;
mmioGetInfo(hmmio, &mmInfoStart, 0);
LONG fileStartPosition = (LONG)mmInfoStart.pchNext;
// Locate a "RIFF" chunk with a "WAVE" form type to make
// sure the file is a waveform-audio file.
mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, MMIO_FINDRIFF))
{
return -1;
}
// Find the "FMT" chunk (form type "FMT"); it must be
// a subchunk of the "RIFF" chunk.
mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK))
{
return -1;
}
// Get the size of the "FMT" chunk. Allocate
// and lock memory for it.
dwFmtSize = mmckinfoSubchunk.cksize;
pFormat = (WAVEFORMATEX *) new char[dwFmtSize];
// Read the "FMT" chunk.
if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize) != dwFmtSize)
{
return -1;
}
// Ascend out of the "FMT" subchunk.
mmioAscend(hmmio, &mmckinfoSubchunk, 0);
// Find the data subchunk. The current file position should be at
// the beginning of the data chunk; however, you should not make
// this assumption. Use mmioDescend to locate the data chunk.
mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent, MMIO_FINDCHUNK))
{
return -1;
}
// Get the size of the data subchunk.
dwDataSize = mmckinfoSubchunk.cksize;
if (dwDataSize == 0L)
{
return -1;
}
MMIOINFO mmInfo;
mmioGetInfo(hmmio, &mmInfo, 0);
dataStartPosition = (LONG)mmInfo.pchNext - fileStartPosition;

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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