1、C+高级编程,多媒体编程,第3章 多媒体编程,本章重点:多媒体的基本理论;Windows媒体控制接口(MCI);VC+开发环境中的多媒体程序的编制。主要内容:1 多媒体概述2 VC+中声音的处理3 VC+中图像的处理4 VC+中的视频处理,3.1 多媒体概述,媒体与多媒体视觉类媒体听觉类媒体W32的多媒体服务在VC+中开发多媒体应用时应注意的问题,媒体与多媒体,媒体:即承载信息的载体,包括感觉、表示、显示、存储、传输媒体。与多媒体最为密切相关的是表示媒体,如数值、文本、声音、图形、图像等。多媒体则是以上多种媒体的综合,多媒体程序的编制则是在应用程序中整合多媒体技术。,3.1.1 视觉媒体,通过
2、视觉传递信息的媒体,都属于此类。位图图像:依赖于设备的位图(DDB)不依赖于设备的位图(DIB):以文件(*.bmp)的形式长久保存矢量图形:用一组指令的形式描述图形特征,存储量很少。动态图像若干连续的静态图像在时间轴上不断变化的结果动态影像视频:单帧图像是真实图像二维或三维动画:是变化的图形。符号,3.1.2 听觉媒体,通过声音形式以听觉传递信息的媒体均属此类。波形声音(WAV文件)在其中,任何声音均可按采样量化并恰当恢复,它包含了所有声音形式语音不仅是一种波形,还具有内在的语言特性,可由特殊的方法进行一次抽象,是一种特殊的媒体。音乐(MIDI文件)它是符号化的声音,以乐谱作为符号,它是一种
3、十分规范的形式。,3.1.3 Win32的多媒体服务,控制媒体服务的媒体控制接口(MCI)与MCI设备驱动程序进行通信的,可扩展的基于字符串和基于消息的接口为播放和记录波形音频、播放乐器数字接口文件(MIDI)以及在播放CD所提供的MCI设备驱动程序支持多媒体相关服务的低级应用程序编程接口对用波形和MIDI音频设备播放和记录音频的低级支持对精确定时器服务的低级支持,VC+开发多媒体时应注意,注意:1 在Windows.H之前包含MMSYSTEM.H2 在Project Settings/Link/Object/library modules栏中加入WINMM.LIB库或在程序中加入:#incl
4、ude #pragma comment(lib,”winmm.lib”)WINMM库提供了MCI服务和低级多媒体函数。MCI驱动程序,提供了媒体设备的高级控制。,3.2 VC+声音的处理,计算机中的声音:音频;MP3文件;波形音频文件;MIDI文件1 波形声音的特点1)采样频率越高声音越接近原始声音;2)采样位数越大,波形的动态范围也越大,声音的精确度越高;3)单声道:一个波形;立体声双声道:两个波形;4)通常要进行压缩2 波形音频文件的播放利用高级音频函数播放利用MCI播放,1 利用音频的高级函数播放,适于小于100KB的WAVE文件的播放播放少数系统定义的声音(如报警声):MessageB
5、eep(报警号)播放数字音频(*.wav)或音频资源:PlaySound(文件名/资源名,NULL/实例句柄,播放标志组合)只能播放数字音频:sndPlaySound(文件名,播放标志组合)例:P60,2 利用MCI播放声音,利用MCI函数向媒体设备发送各种控制命令,能够播放wav文件、MIDI序列、AVI文件等。命令字符串:mciSendString(),如:MciError=mciSendString(“open tada.wav type waveaudio”,buf,strlen(buf),NULL)命令消息:mciSendCommand(),如:打开:mciSendCommand(N
6、ULL,MCI_OPEN,消息标志,消息参数);关闭:mciSendCommand(设备号,MCI_CLOSE,NULL,NULL);播放:mciSendCommand(设备号,MCI_PLAY,MCI_FROM,消息参数);停止:mciSendCommand(设备号,MCI_STOP,NULL,NULL);例:P65,3.3 VC+中的图像处理,动画是一幅接一幅显示图画的过程,是若干连续的静态图像在时间轴上不断变化的结果。VC+中实现动画的一个特别重要的消息是WM_TIMER。用SetTimer()设定的时间间隔作为消息来源,通过将代码加载在OnTimer()中实现动画效果。KillTimer()用来停止记时器。VC+中,可以使用BitBlt()来完成图像处理,反复显示、反复擦除。例:P74,3.4 VC+中视频处理,MFC的CAimateCtrl类封装了动画控件。但只能处理简单的AVI,也不处理音频。其主要成员函数有:创建:Create(dwStyle,Rect,pParentWnd,nID)打开:Open(lpFileName/nID)播放:Play(nFrom,nTo,nRepeat)定位:Seek(nTo)停止:Stop()关闭:Close()例:P78,