使用waveOut接口在Windows中播放声音

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

                                                                                                                      Windows waveOut教程
本教程将帮助您了解如何使用Windows waveOut接口播放数字音频。根据经验,这些接口函数掌握起来有些困难。在本教程中,我们将会建立一个Windows命令行程序来原始数字音频。注意:本教程假设您熟悉C程序及Windows API的使用。理解数字音频的相关知识也是有益的,但不是必须的。

教程内容:

·                             获取文档

·                             什么是数字音频

·                             打开声音设备

·                             播放声音

·                             播放流式音频到设备

·                             缓存机制

·                             运行程序

·                             接下来该做什么?

获取文档
首先,您需要有关waveOut接口的相关文档。如果您有Microsoft Platform SDK或者VisualC++,那么它们已经提供了相关的信息。如果您还没有这些,您可以通过MSDN在线查看。(http://msdn.microsoft.com)

什么是数字音频
这一部分是为那些对数字音频如何存储完全没有概念的人准备的。如果您理解有关数字音频的信息,同时了解“样本(sample)”、“采样频率(samplerate)”、“样本大小(samplesize)”及“声道(channels)”的概念,您可以跳过此节。
只要把字节码发送到声卡就可以播放声音了,但是这些字节都是什么意思呢?音频只是简单的一系列运动的压力波。在现实世界中,它们是一些相似的波形,但是在数字世界中,我们必须从这波形中采集一系列的样本并存储起来。“样本”是表现某一时间点上波形振幅的一个值——它仅仅是一个数字。
“采样频率”表明我们采集波形样本的频率。它的计量单位是赫兹(Hz)或每秒样本数。显然,采样频率越高,采样的波形就越接近真实的波形,所以声音的音质也就越好。
另外一个有助于改善音质的参数是每个样本的大小。当然,样本越大音质也就越好。样本大小用字节位数(bits)来计量。为何样本越大音质越好?假设一个8bits的样本,它有256(2的八次方)个可能的值,这意味着您不能精确地再现波形的振幅。而如果是一个16bits的样本,它的可能值有65536(2的16次方)个,这样它就拥有256倍于8bits的样本的更精确表现波形的能力。
最后是关于声道。在多数机器上有两个喇叭(左、右),那是两个声道。您需要同时把样本数据存入左声道和右声道。
幸运的是,操作两个声道是很容易的(您将在本教程中看到)。样本总是交错存储的,它们将按左、右、左、右……的顺序存储。
CD品质的音频采样频率是44100Hz,样本大小是16bits,意味着1M的音频数据只能持续约6秒的时间。

打开声音设备
打开声音设备需要使用waveOutOpen函数(可以在您的文档中查到)。象其它许多Windows对象一样,您可以简单地使用一个句柄(Handle)调用该设备。如存储Windows窗口句柄使用HWND类似,我们可以用HWAVEOUT句柄来调用声音设备。
下面的代码段说明了如何打开一个CD标准音质的波形设备,然后关闭它。

#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
int main(int argc, char* argv[])
{

HWAVEOUT hWaveOut; /* device handle */
WAVEFORMATEX wfx; /* look this up in your documentation */
MMRESULT result;/* for waveOut return values */
/*
* first we need to set up the WAVEFORMATEX structure.
* the structure describes the format of the audio.
*/
wfx.nSamplesPerSec = 44100; /* sample rate */
wfx.wBitsPerSample = 16; /* sample size */
wfx.nChannels = 2; /* channels*/
/*
* WAVEFORMATEX also has other fields which need filling.
* as long as the three fields above are filled this should
* work for any PCM (pulse code modulation) format.
*/
wfx.cbSize = 0; /* size of _extra_ info */
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nBlockAlign = (wfx.wBitsPerSample >> 3) * wfx.nChannels;
wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;
/*
* try to open the default wave device. WAVE_MAPPER is
* a constant defined in mmsystem.h, it always points to the
* default wave device on the system (some people have 2 or
* more sound cards).
*/
if(waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL) !=MMSYSERR_NOERROR) {

fprintf(stderr, "unable to openWAVE_MAPPER device\n");
ExitProcess(1);

}
/*
* device is now open so print the success message
* and then close the device again.
*/
printf("The Wave Mapper device was opened successfully!\n");
waveOutClose(hWaveOut);
return 0;

}

注意:要编译本程序,您需要添加winmm.lib到您的工程,否则将会链接失败。
好了,我们已经做好了第一步,现在声音设备已经准备好,我们可以写音频数据进去了。

播放声音
打开和关闭声音设备挺有意思的,但是上面的代码并没有真的做什么事情。我们想要的是能从设备听到声音。在这之前,我们有两件事要做。

·                             获得一个正确格式的原始音频

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值