Wav文件直接反映了一个声音在每个时刻的大小值,比如说以下一段波形:
我们按每人0.1秒取一点,得到的wav文件数值就是0,1,1,-1,0,1。因此,假如我们能把许多Wav文件的数据直接相加,你听到的就是所有的声音,这就是混音器的原理。
下面我们分析一下Wav文件结构:
我们可以打开一个Wav文件直接看其二进制码:
C:\user\wave\22.wav
00000000 5249 4646 9CB6 1E00 5741 5645 666D 7420
00000010 1000 0000 0100 0200 2256 0000 44AC 0000
00000020 0200 0800 6461 7461 78B6 1E00 7F7F 7F7F  
00000030.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F  
00000040.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
00000050.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F  
00000060.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F  
00000070.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F  
00000080.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
00000090.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F  
000000A0.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
大家可以看到wav文件存储格式如下:
 
"RIFF"  
×××× 文件大小  
"WAVE"  
"fmt"  
×××× PCMWAWFORMAT——数据结构大小  
××××  
…… 数据结构“PCMWAVEFORMAT”
××××  
data  
×××× 数据大小  
∶ 数据  
 
首 先是字符串“RIFF”,表示此文件遵循一种标准格式名为“资源互换文件格式”(Resource Intercharge Format)。后面紧跟四个字节指明文件大小。其次是字符串“WAVE”和“fmt”,后面紧跟一个名为“PCMWAVEFORMAT”的结构,最后是 字符串“data”,紧跟数据大小及所有数据。PIFF文件为一种树状结构,基本构成单位是“块”,图5.2中是wav文件中“块”关系图。


图 5.2
如图所示,wav文件结构为两层,由父块“RIFF”和两个子块“fmt”、“data”组成。“fmt”块包含wav文件格式信息,“data”块包含数据信息。  


2003-7-22 15:29:00   
 2003-7-23 15:52:38    WAV 文件编辑(截取,合并,插入)的实现原理

确切地说 WAV 文件的编辑其实就是拼合文件,并重新生成文件头.
仅此而已.  

 
 2003-7-25 18:15:00    稍候::说一下WAVEOUT 等 API.

稍候::说一下WAVEOUT 等 API.

 
 2003-11-12 9:58:58    多媒体处理的API

多媒体处理的API

waveInAddBuffer向声音输入设备发送缓冲区
waveInClose关闭声音输入设备
waveInGetDevCaps获取声音输入设备性能
waveInGetErrorText获取声音出错的信息文本
waveInGetID获取声音输入设备ID
waveInGetNumDevs返回声音输入设备数量
waveInGetPosition获取声音设备输入位置
waveInMessage向声音输入设备发送信息
waveInOpen打开声音输入设备
waveInPrepareHeader预备声音输入缓冲区
waveInReset停止声音输入设备工作
waveInStart停止声音输入设备工作
waveInStop停止声音输入
waveInUnprepareHeader清除预备的声音文件头
waveOutBreakLoop中断声音输出循环
waveOutClose关闭声音输出设备
waveOutGetDevCaps获取声音输出设备性能
waveOutGetErrorText获取声音出错文本
waveOutGetID获取声音输出设备ID
waveOutGetNumDevs获取声音输出设备数量
waveOutGetPitch获取声音输出的强度
waveOutGetPlaybackRate获取声音回放率
waveOutGetPosition获取声音回放位置
waveOutGetVolume获取声音音量
waveOutMessage向声音输出设备发送消息
waveOutOpen打开声音输出设备
waveOutPause暂停声音回放
waveOutPrepareHeader预备声音回放数据块
waveOutReset停止声音回放
waveOutRestart重开始声音回放
waveOutSetPitch设置波形输出强度
waveOutSetPlaybackRate设置回放率
waveOutSetVolume设置输出音量
waveOutUnprepareHeader清除预备声音数据块
waveOutWrite写入声音输出设备

 
 2003-11-24 10:06:16    1媒体控制接口 1媒体控制接口

MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、 视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它 是远远不够的。好比Visual C++虽然看上去无所不能,却需要程序员自己开发多媒体引擎一样。对于MCI指令集,我们将只作简单介绍,重点放在后面的波形文件混音器上。

MCI的控制方式:

一般说来,程序员使用两个函数就可以与MCI打交道了:

MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg,
DWORD dwFlags, DWORD dwParam );

命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。

MCIERROR mciSendString(LPCTSTR lpszCommand,LPTSTR lpszReturnStr
ing, UINT cchReturn, HANDLE hwndCallback);

命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。

 

对 于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅 后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套 书。

对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。

举例:

mciSendCommand(DeviceID,MCI_CLOSE,NULL,NULL);//关闭一个MCI设备;

mciSendString("open aaa.avi",0,0,0); //打开文件"aaa.avi";

MCI的设备类型:

MCI的设备类型有:

设备描述 描述字符串 说明
 
MCI_ALL_DEVICE_ID   所有设备
 
MCI_DEVTYPE_ANIMATION Animation 动画设备
 
MCI_DEVTYPE_CD_AUDIO Cdaudio CD音频
 
MCI_DEVTYPE_DAT Dat 数字音频
 
MCI_DEVTYPE_DIGITAL_VIDEO Digitalvideo 数字视频
 
MCI_DEVTYPE_OTHER Other 未定义设备
 
MCI_DEVTYPE_OVERLAY Overlay 重叠视频
 
MCI_DEVTYPE_SCANNER Scanner 扫描仪
 
MCI_DEVTYPE_SEQUENCER Sequencer MIDI 序列器
 
MCI_DEVTYPE_VCR Vcr  合式录像机
 
MCI_DEVTYPE_VIDEODIS Videodisc 激光视盘
 
MCI_DEVTYPE_WAVEFORM_AUDIO waveaudio Wave 音频
 
对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:

[mci]

cdaudio=mcicda.drv
sequencer=mciseq.drv
waveaudio=mciwave.drv
avivideo=mciavi.drv
videodisc=mcipionr.drv
vcr=mcivisca.drv
ActiveMovie=mciqtz.drv
QTWVideo=mciqtw.drv
MPEGVideo=C:\PROGRA~1\XING\XINGMP~1\xmdrv95.dll
其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。

在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。

举个例子来说,打开一个多媒体文件有以下三种方式:
[1]:自动识别:打开一个"WAV"文件
MCI_OPEN_PARMS mciOpen;
mciOpen.lpstrDeviceType=0;
mciOpen.lpstrElementName="aaa.wav";
mciSendCommand(NULL,MCI_OPEN, MCI_OPEN_ELEMENT,
(DWORD)&mciOpen);

[2]:指定设备描述:打开CD播放器
MCI_OPEN_PARMS mciOpen;
mciOpen.lpstrDeviceType=(LPSTR)MCI_DEVTYPE_CD_AUDIO ;
mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID,
(DWORD)&mciOpen);

[3]:指定描述字符串: 打开一个AVI文件
MCI_OPEN_PARMS mciOpen;
mciOpen.lpstrDeviceType="avivideo";
mciOpen.lpstrElementName="aaa.avi";
mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
(DWORD)&mciOpen);


注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。

 

MCI指令

MCI使用如下指令:

MCI_BREAK
 设置中断键,缺省是”CTRL+BREAK"
 
MCI_CAPTURE
 抓取当前帧并存入指定文件,仅用于数字视频
 
MCI_CLOSE
 关闭设备
 
MCI_CONFIGURE
 弹出配置对话框,仅用于数字视频
 
MCI_COPY
 拷贝数据至剪贴板
 
MCI_CUE
 延时播放或录音
 
MCI_CUT
 删除数据
 
MCI_DELETE
 删除数据
 
MCI_ESCAPE
 仅用于激光视频
 
MCI_FREEZE
 将显示定格
 
MCI_GETDEVCAPS
 获取设备信息
 
MCI_INDEX
 当前屏幕显示与否,仅用于VCR设备
 
MCI_INFO
 获取字符串信息
 
MCI_LIST
 获取输入设备数量,支持数字视频和VCR设备
 
MCI_LOAD
 装入一个文件
 
MCI_MARK
 取消或做一个记号,与MCI_SEEK配套
 
MCI_MARK
 取消或做一个记号,与MCI_SEEK配套
 
MCI_MONITOR
 为数字视频指定报告设备
 
MCI_OPEN
 打开设备
 
MCI_PASTE
 粘帖数据
 
MCI_PAUSE
 暂停当前动作
 
MCI_PLAY
 播放
 
MCI_PUT
 设置源、目的和边框矩形
 
MCI_QUALITY
 定义设备缺省质量
 
MCI_RECORD
 开始录制
 
MCI_RESERVE
 分配硬盘空间
 
MCI_RESTORE
 拷贝一个bmp文件至帧缓冲
 
MCI_RESUME
 使一个暂停设备重新启动
 
MCI_SAVE
 保存数据
 
MCI_SEEK
 更改媒体位置
 
MCI_SET
 设置设备信息
 
MCI_SETAUDIO
 设置音量
 
MCI_SETTIMECODE
 启用或取消VCR设备的时间码
 
MCI_SETTUNER
 设置VCR设备频道
 
MCI_SETVIDEO
 设置video参数
 
MCI_SIGNAL
 在工作区上设置指定空间
 
MCI_STATUS
 获取设备信息
 
MCI_STEP
 使播放设备跳帧
 
MCI_STOP
 停止播放
 
MCI_SYSINFO
 返回MCI设备信息
 
MCI_UNDO
 取消操作
 
MCI_UNFREEZE
 使使用MCI_UNFREEZE的视频缓冲区恢复运动
 
MCI_UPDATE
 更新显示区域
 
MCI_WHERE
 获取设备裁减矩形
 
MCI_WINDOW
 指定图形设备窗口和窗口特性


其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等
posted on 2011-03-19 17:44  kangwang1988  阅读(3900)  评论(0编辑  收藏  举报