设为首页 加入收藏

TOP

VC下调用ACM音频编程接口压缩Wave音频(二)
2014-11-23 20:01:07 】 浏览:672
Tags:调用 ACM 音频 编程 接口 压缩 Wave
zeof(WAVEFORMATEX);
  pwf->wFormatTag = pdi->wFormatTag;
  ACMFORMATDETAILS fd;
  ……
  fd.cbStruct = sizeof(fd);
  fd.pwfx = pwf;
  fd.cbwfx = dwSize;
  fd.dwFormatTag = pdi->wFormatTag;
  mmr=acmFormatEnum(had, &fd, find_format_enum, (DWORD)(VOID*)pdi, 0); //枚举格式
  ……
  acmDriverClose(had, 0); //关闭驱动器
  ……
}

   根据指定的格式要找到其所对应的ACM驱动器号可以用枚举所有音频CODECs的ACM API函数acmDriverEnum来实现,在acmDriverEnum() 的参数中指定了在前面描述过的回调函数find_driver_enum,可以 进 一 步查询每个CODEC的信息,最终可以获取到ACM驱动器号的句柄。实现此功能的回调函数名为find_driver,本文后面将会用到。

   在把原始Wave音频数据转换到中间PCM格式数据之前,需要做些前期准备工作,填充一些相关的结构信息,具体有:WAVEFORMATEX结构描述源格式、中间PCM格式、以及最终的压缩格式等。下面先填充一个用来描述源数据格式的WAVEFORMATEX结构:

WAVEFORMATEX wfSrc;
memset(&wfSrc, 0, sizeof(wfSrc));
wfSrc.cbSize = 0;
wfSrc.wFormatTag = WAVE_FORMAT_PCM; //PCM脉冲编码调制
wfSrc.nChannels = 1; //单声道
wfSrc.nSamplesPerSec = 11025; //11.025kHz
wfSrc.wBitsPerSample = 8; //8 bit
wfSrc.nBlockAlign = wfSrc.nChannels * wfSrc.wBitsPerSample / 8;
wfSrc.nAvgBytesPerSec = wfSrc.nSamplesPerSec * wfSrc.nBlockAlign;

   然后通过前面提到的回调函数find_driver来获取由wFormatTag指定的中间数据格式所对应的驱动程序的ACM驱动器号,在此设定的是由WAVE_FORMAT_DSPGROUP_TRUESPEECH指定的有Windows 98系统自带的TrueSpeech CODEC:

WORD wFormatTag = WAVE_FORMAT_DSPGROUP_TRUESPEECH;
HACMDRIVERID hadid = find_driver(wFormatTag);

   选定了驱动程序,现在要为最终驱动程序将产生的压缩数据格式创建一个WAVEFORMATEX结构,并为驱动程序用于输入的中间PCM格式产生一个WAVEFORMATEX结构:

WAVEFORMATEX* pwfDrv = get_driver_format(had <script type="text/java script">
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
分享到: 更多
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)
您对本文章有什么意见或着疑问吗?请到 论坛讨论您的关注和建议是我们前行的参考和动力
上一篇: 使用VC++ ATL实现Office的COM插件
下一篇: 四种程序启动画面的制作方法(VC)
相关文章
<script type="text/java script">BAIDU_CLB_fillSlot("182716");
<script type="text/java script">BAIDU_CLB_fillSlot("517916");
图文推荐
<iframe src="http://www.2cto.com/uapi.php tid=12643&catid=82&title=VkPPwrX308NBQ03S9Ma1seCzzL3Tv9rRucv1V2F2ZdL0xrU=&forward=http://www.2cto.com/kf/200609/12643.html" width="100%" height="100%" id="comment_iframe" name="comment_iframe" frameborder="0" scrolling="no">
<script type="text/java script">BAIDU_CLB_fillSlot("771057");
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇我的Visual C++入门之路 下一篇如何用VC实现软件注册

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目