多媒体文件I/O与普通文件I/O相似,但支持多媒体“RIFF”格式,并提供了缓冲和非缓冲文件I/O。 |
所有的多媒体文件I/O函数名前缀为mmio,消息名前缀为MMIO。 |
低级波形音频函数: |
低级音频服务允许用户直接与音频设备驱动程序打交道,直接控制音频设备如波形,Midi的播放与记录,低级音频函数是一个设备无关接口。 |
低级音频函数前缀均为wave,按输入函数、输出函数区分为WaveIn××××和WaveOut××××。 |
波形音频的重放过程: |
首先,我们要调用多媒体文件I/O函数mmIO××××( ),并根据多媒体文件I/O生成在wave重放中需要的结构和数据,并将这些结构和数据用waveOut××××( )函数重放。 用户可以根据加密的需要将wave文件篡改,去掉文件头和“fmt”块,只保留数据块。 或者将其压缩,只要重放时能在内存中还原出数据文件。并记得文件音频格式和大小,就能重放音频。 |
常用mmio函数及实现过程简介: |
mmioOpen( ) 打开一个RIFF文件 |
mmioDescend ( ) 进入块 |
mmioRead( ); 该取RIFF文件 |
mmioAscend ( ); 跳出块 |
mmioClose( ); 关闭PIFF文件 |
对于块来说,进入块和跳出块是配对的。 |
读取WAV文件的读取过程: |
mmioOpen( ) 打开文件 |
↓ |
mmioDescend ("WAVE") 进入"fmt"块 |
↓ |
mmioRead( ) 读取WAVE文件格式信息 |
↓ |
mmioAscend ( ) 跳出"fmt"块 |
↓ |
mmioDescend ("data") 进入"data"块 |
↓ |
mmioRead( ) 读取WAVE数据信息 |
↓ |
mmioClose( ) 关闭文件。 |
输出WAV文件的过程: |
WaveOutOpen () 打开一个输出设备 |
↓ |
WaveOutPrepareHeader() 准备WAVE数据头。 |
↓ |
WaveOutWrite() 将数据写入设备并开始播放 |
↓ |
WaveOutReset() 停止播放并重置管理器 |
↓ |
WaveOutClose() 并闭播放设备 |
↓ |
WaveOutUnpareHeader() 清理用WaveOutPrepareHeader准备的Wave。 |
实例: |
这个实例实现的功能是首先打开背景音乐,然后每五秒钟加入一段配音。背景音乐放完后将停止播放,大家可以听一下背景+配音+配音+……+配音产生的实际效果。为了实现这个功能,我们封装了一个类。大家可以在光盘上找到这两个文件“wavemix..h”和“wavemix.cpp” . |
首先,我们看一下“wavmix.h”,这里定义了一个称为“mwave”的类, |
其中成员函数有:构造、析构函数、open(打开文件)、play(播放文件)、Add(往缓冲中加混音文件)、Stop(停止播出)、close(关闭输出设备,类重新初始化)。 |
现在我们照前面方法建一个基于对话框的程序,在“File View”中加入上述两个文件。打开“WavemixDlg.h”,在前面加上“#include "wavemix.h"”, |
在类class cWavemixDlg中加入私有数据“MWAVE mWave”,在类“cwavemixDlg”中加入成员OnlnitDialog( )和OnTime(),, |
在此函数中加入一个定时器,打开并播放背景音乐。在定时器的向应过程OnTime()中加入函数mwave.Add("2.waw".)使之每五秒钟向缓冲加入一个配音。编译并运行之。 |