ACM音频压缩中如何读取wav文件中的数据到缓冲中

zxyin1 2003-08-30 10:25:18
ACM音频压缩中如何读取wav文件中的数据到缓冲中,又如何将转换后的数据从目标缓冲中写入一个新建的wav文件中呢?
...全文
149 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxyin1 2003-08-31
  • 打赏
  • 举报
回复
hoho,好像也是,钻牛角尖了:)
akiko 2003-08-31
  • 打赏
  • 举报
回复
howtotell(天行健,君子以自强不息。)说得是啊.
howtotell 2003-08-31
  • 打赏
  • 举报
回复
没有这么麻烦吧。我直接就用CFile把数据读入缓冲区,照样可以压缩。
akiko 2003-08-31
  • 打赏
  • 举报
回复
删掉Debug,Rebuild All试试
zxyin1 2003-08-31
  • 打赏
  • 举报
回复
可能我含入的实现文件的后缀为.c,有什么办法兼容吗?
zxyin1 2003-08-31
  • 打赏
  • 举报
回复
提示:f:\wave.c(19): fatal error C1853: “Debug/test4.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
caomuyong1 2003-08-31
  • 打赏
  • 举报
回复
acm的api函数定义在头文件msacm.h中,除此之外,对acm编程还必须包含头文件mmsystem.h,mmreg.h,这两个头文件定义了多媒体编程中最基本的常量和数据结构。为了避免有些高版本acm才提供的函数和功能在较低版本的acm中上不可用,程序中应调用acmgetversion函数查询用户机器中acm的版本信息。

----前面提到,在控制面板中可以查看系统中codecs的信息,而在应用程序中也常常需要知道某种音频codecs是否存在,并获取其编解码参数等信息,这一点可以通过调用下面两个函数来实现。

----mmresultmmr=acmmetrics(null,acm_metric_count_codecs,&dwcodecs);

----mmr=acmdriverenum(codecsenumproc,0,0);

----acmmetrics()函数可以获取许多acm对象的有用信息,例如向其中传递acm_metric_count_codecs可以查询系统中安装的音频codecs总数。函数acmdriverenum()的功能是枚举所有的音频codecs,在acmdriverenum()的参数中指定回调函数codecsenumproc()可以进一步查询每个codec的信息。
zxyin1 2003-08-31
  • 打赏
  • 举报
回复
通过
akiko 2003-08-31
  • 打赏
  • 举报
回复
wave.c顶部加上#include "stdafx.h"试试
akiko 2003-08-31
  • 打赏
  • 举报
回复
第一个错误,加强制类型转换
if ((*ppwfxInfo = (WAVEFORMATEX*)GlobalAlloc(GMEM_FIXED, sizeof(WAVEFORMATEX)+cbExtraAlloc)) == NULL)
剩下两个分成2步,第一步赋值,第二步自己++
zxyin1 2003-08-31
  • 打赏
  • 举报
回复
在WaveReadFile中出错的一句:
*((BYTE*)pbDest+cT) = *((BYTE*)mmioinfoIn.pchNext)++;
zxyin1 2003-08-31
  • 打赏
  • 举报
回复
int WaveOpenFile(
char *pszFileName, // (IN)
HMMIO *phmmioIn, // (OUT)
WAVEFORMATEX **ppwfxInfo, // (OUT)
MMCKINFO *pckInRIFF // (OUT)
)
{
HMMIO hmmioIn;
MMCKINFO ckIn; // chunk info. for general use.
PCMWAVEFORMAT pcmWaveFormat; // Temp PCM structure to load in.
WORD cbExtraAlloc; // Extra bytes for waveformatex
int nError; // Return value.


// Initialization...
*ppwfxInfo = NULL;
nError = 0;
hmmioIn = NULL;

if ((hmmioIn = mmioOpen(pszFileName, NULL, MMIO_ALLOCBUF | MMIO_READ)) == NULL)
{
nError = ER_CANNOTOPEN;
goto ERROR_READING_WAVE;
}

if ((nError = (int)mmioDescend(hmmioIn, pckInRIFF, NULL, 0)) != 0)
{
goto ERROR_READING_WAVE;
}


if ((pckInRIFF->ckid != FOURCC_RIFF) || (pckInRIFF->fccType != mmioFOURCC('W', 'A', 'V', 'E')))
{
nError = ER_NOTWAVEFILE;
goto ERROR_READING_WAVE;
}

/* Search the input file for for the 'fmt ' chunk. */
ckIn.ckid = mmioFOURCC('f', 'm', 't', ' ');
if ((nError = (int)mmioDescend(hmmioIn, &ckIn, pckInRIFF, MMIO_FINDCHUNK)) != 0)
{
goto ERROR_READING_WAVE;
}

/* Expect the 'fmt' chunk to be at least as large as <PCMWAVEFORMAT>;
* if there are extra parameters at the end, we'll ignore them */

if (ckIn.cksize < (long) sizeof(PCMWAVEFORMAT))
{
nError = ER_NOTWAVEFILE;
goto ERROR_READING_WAVE;
}

/* Read the 'fmt ' chunk into <pcmWaveFormat>.*/
if (mmioRead(hmmioIn, (HPSTR) &pcmWaveFormat, (long) sizeof(pcmWaveFormat)) != (long) sizeof(pcmWaveFormat))
{
nError = ER_CANNOTREAD;
goto ERROR_READING_WAVE;
}


// Ok, allocate the waveformatex, but if its not pcm
// format, read the next word, and thats how many extra
// bytes to allocate.
if (pcmWaveFormat.wf.wFormatTag == WAVE_FORMAT_PCM)
cbExtraAlloc = 0;

else
{
// Read in length of extra bytes.
if (mmioRead(hmmioIn, (LPSTR) &cbExtraAlloc,
(long) sizeof(cbExtraAlloc)) != (long) sizeof(cbExtraAlloc))
{
nError = ER_CANNOTREAD;
goto ERROR_READING_WAVE;
}

}

// Ok, now allocate that waveformatex structure.
/* ************************************************************** */
/* 下面一句出了第一个问题 */
if ((*ppwfxInfo = GlobalAlloc(GMEM_FIXED, sizeof(WAVEFORMATEX)+cbExtraAlloc)) == NULL)
{
nError = ER_MEM;
goto ERROR_READING_WAVE;
}

// Copy the bytes from the pcm structure to the waveformatex structure
memcpy(*ppwfxInfo, &pcmWaveFormat, sizeof(pcmWaveFormat));
(*ppwfxInfo)->cbSize = cbExtraAlloc;

// Now, read those extra bytes into the structure, if cbExtraAlloc != 0.
if (cbExtraAlloc != 0)
{
if (mmioRead(hmmioIn, (LPSTR) (((BYTE*)&((*ppwfxInfo)->cbSize))+sizeof(cbExtraAlloc)),
(long) (cbExtraAlloc)) != (long) (cbExtraAlloc))
{
nError = ER_NOTWAVEFILE;
goto ERROR_READING_WAVE;
}
}

/* Ascend the input file out of the 'fmt ' chunk. */
if ((nError = mmioAscend(hmmioIn, &ckIn, 0)) != 0)
{
goto ERROR_READING_WAVE;

}


goto TEMPCLEANUP;

ERROR_READING_WAVE:
if (*ppwfxInfo != NULL)
{
GlobalFree(*ppwfxInfo);
*ppwfxInfo = NULL;
}

if (hmmioIn != NULL)
{
mmioClose(hmmioIn, 0);
hmmioIn = NULL;
}

TEMPCLEANUP:
*phmmioIn = hmmioIn;

return(nError);

}
zxyin1 2003-08-31
  • 打赏
  • 举报
回复
原来是头文件包含的次序问题,我调整后:
#include "stdafx.h"
#include "windows.h"
#include "mmsystem.h"

//#include "debug.h"
#include "windowsx.h"
#include "wave.h"

就剩下3个了:
f:\test4\wave.cpp(122): error C2440: “=” : 无法从“HGLOBAL”转换为“WAVEFORMATEX *”
f:\test4\wave.cpp(267): error C2105: “++”需要 l 值
f:\test4\wave.cpp(511): error C2105: “++”需要 l 值



zxyin1 2003-08-31
  • 打赏
  • 举报
回复
我把这两个文件加进去后,编译不出错,运行时出现错误:

f:\应聘小项目\wave.c(946): fatal error C1010: 查找预编译头指令时遇到意外的文件结束

还需要include其他头文件吗?
akiko 2003-08-30
  • 打赏
  • 举报
回复
MSDN上搜索WaveOpenFile,你就可以看到一组现成的函数了
akiko 2003-08-30
  • 打赏
  • 举报
回复
看上去就是这2个.要不给个email,我给你发过去
zxyin1 2003-08-30
  • 打赏
  • 举报
回复
不过在网上我搜到2个文件:wave.c,wave.h,可能就是这2个文件里的函数吧

http://sw.adhoc.ch/DRIVERS/directx/sdk/samples/dsshow3d/
zxyin1 2003-08-30
  • 打赏
  • 举报
回复
奇怪,我的MDSN中找不到这些函数,MSDN是2002Jan版的

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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