270 likes | 475 Views
第三讲 多媒体编程技术. 3.1 多媒体概述 3.1.1 视觉类媒体 3.1.2 听觉类媒体 3.1.3 WIN 32 的多媒体 3.2 VC++ 开发工具中声音的处理 3.2.1 波形声音的特点 3.2.2 波形音频文件的播放 3.3 VC++ 开发工具中图像的处理 3.4 VC++ 开发工具中视频的处理. 3.1 多媒体概述 MCI :媒体控制接口。 媒体:承载信息的接口,包括感觉、表示、显示、存储、传输媒体。其中最重要的是多媒体表示,有数值、文本、声音、图形、图像等,即多种媒体的综合。 3.1.1 视觉类媒体 1 、位图图像
E N D
第三讲 多媒体编程技术 3.1 多媒体概述 3.1.1 视觉类媒体 3.1.2 听觉类媒体 3.1.3 WIN 32的多媒体 3.2 VC++开发工具中声音的处理 3.2.1 波形声音的特点 3.2.2 波形音频文件的播放 3.3 VC++开发工具中图像的处理 3.4 VC++开发工具中视频的处理
3.1 多媒体概述 MCI:媒体控制接口。 媒体:承载信息的接口,包括感觉、表示、显示、存储、传输媒体。其中最重要的是多媒体表示,有数值、文本、声音、图形、图像等,即多种媒体的综合。 3.1.1 视觉类媒体 1、位图图像 位图:是一种对视觉信号进行了直接量化的媒体形式,反映了信号的原始形式。WINDOWS用Bitmap来显示和保存图像,从单色到24位真彩色图象都可以存储到位图中。
位图是一个像素值阵列,像素阵列存储在字节数组中,每个像素的位数可以是1、4、8、24。位图是一个像素值阵列,像素阵列存储在字节数组中,每个像素的位数可以是1、4、8、24。 单色位图:每个字节存储八个像素,(每个像素用0或1表示); 16色位图:每个字节存储二个像素; 256色位图:每个字节存储一个像素; 24位真彩:三个字节存储一个像素。 256色以下位图中存储的:像素值是调色板中值的索引。 真彩色位图中存储的:像素的RGB值。 256是怎么来的?什么是RGB?
位图包括:DDB位图和DIB位图。 1)DDB依赖设备位图(Device-dependent bitmap): 依赖于输出设备,进行动态转换,只能在显卡 或系统内存中。 问:若显示器为16色,一个像素占用内存几位? 2)DIB设备无关位图(Device-independent bitmap): DIB的颜色模式与设备无关. 256及以下色拥有自 己的颜色表,独立于系统调色板.以 *.bmp 或 *.dib 文件存储
2. 矢量图形 这是对图形进行抽象的结果,反映了图像中实体最 重要的特征.矢量图形用一组指令的形式描述图形 特征,其需要的存储量很少,但显示时要经过计算才 能显示出原图. 3. 动态图像 这是若干连续的静态图像在时间轴上不断变化的 结果.如果单帧图像是真实图像则为动态影视频; 如果是普通图形则在连续过程中显示二维或三维 动画. 4. 符号 符号是一种对信息抽象的结果,文本就是一种符号 流.
3.1.2 听觉类媒体 (1)波形声音: 运用采样量化技术.以.wav文件来表示. (2)语言: 语言具有内在的语言特性,可由特殊的方法进行 一次抽象. (3)音乐: 符号化的声音,以乐谱作为符号,如MIDI文件.
3.1.3 WIN 32的多媒体 1. 服务功能有如下几个方面: *控制媒体服务(Media Control Interface , MCI ) *与MCI设备驱动程序进行通信,可扩展的基于字 符和基于消息的接口. *为播放和记录波形音频,播放乐器数字接口文件 (MIDI)以及在播放CD所提供的MCI设备程序. *支持多媒体相关服务的低级应用程序编程接口. *对用波形和MIDI音频设备播放和记录音频的低 级支持. *对精确定时器服务的低级支持. *多媒体文件输入输出服务. *提供控制面板选择项,为用户安装,配置提供方便.
2. 多媒体服务结构的组成: WINMM库:提供了MCI服务和低级多媒体函数. 多媒体设备驱动程序:提供了低级WINMM函数与 多媒体设备硬件之间的通讯. MCI驱动程序,它提供了媒体设备的高级控制. VC++中用以下方式进行调用: #include<WINDOWS.H> #include<Mmsystem.h> #pragma comment(lib,”winmm.lib”)//项目设置
3.2 VC++开发工具中声音的处理 计算机中声音的种类: 音频CD, MP3文件,波形音频文件,MIDI文件. 3.2.1 波形声音的特点 通过采样技术获得,采样频率主要有: 44.1kHz , 22.05kHz, 11.025kHz. 频率越高声音越真实. 采样位数:8位或16位.位数越高采样精度越高. 声道数:声音的记录产生一个波形(单声道)或是 两个波形(双声道) 注:这种波形文件的数据量是十分巨大的,因而在 实际运用中常常要经过压缩.
3.2.2 波形音频文件的播放 • 有三种方法可行:用WIN32API中以wave为前缀 • 的函数,功能多但程序复杂;利用高级音频函数, • 使用方便但功能有限;利用媒本控制接口较好. • 利用高级音频函数播放波形音频文件. • 有MessageBeep, PlaySound, sndPlaySound.这三 • 个播放函数只播放小于100KB的声音. • BOOL MessageBeep(UINT uType);一般播放系 • 统报警声音.应用有限. • uType 见P57页中的定义.
PlaySound函数原型: BOOL PlaySound(LPCSTR pszSound, HMODULE Hmod, DWORD fdwSound); pszSound声音文件名或内存中声音数据的指针等. Hmod 应用程序的实例句柄,不用必须是NULL fdwSound标志参数.(见P58页)
运行实例:详见P59-60 如: PlaySound(“c:\\windows\\media\\Tada.wav”,NULL, SND_FILENAME|SND_ASYNC); PlaySound(“Systemstart”,NULL, SND_ALIAS|SND_ASYNC); sndPlaySound(“MYSOUND.WAV”, SND_ASYNC); // 不能直接播放声音资源
3.2.2 波形音频文件的播放 2. 利用MCI播放声音 MCI函数能播放WAV,MIDI,AVI文件等,功能强. 接口分:命令字符串和命令消息两种. <1>与命令字符串有关的两个函数原型: MCIERROR mciSendstring (LPCTSTR lpszCommand, //MCI命令字符串 LPTSTR lpszReturnString,//存反馈信息缓冲区名 UINT cchReturn,//缓冲区大小 HANDLE hwndCallback)//一般为NULL //成功返回0,否则返回错误码.
BOOL mciGetErrorString( DWORD fdwError, //错误码值 LPTSTR lpszErrorText, //错误信息字符串缓冲区 UINT cchErrorText) //缓冲区字符串长度 例:char buf[50]; MCIERROR mciError; mciError=mciSendString(“open tada.wav type Waveaudio”, buf,strlen(buf),NULL); If (mciError) {mciGetErrorString(mciError,buf,strlen(buf); AfxMessageBox(buf); Return;}// Waveaudio是设备名.
注:设备名和设备类型不同,设备名在注册表或 SYSTEM.INI中的[mci]段.(见操作) 设备名和设备类型有时相同,如cdaudio, wave- Audio, 有的不同,如 avivideo -> digitalvideo . MCI命令如下:
MCI设备又可分为: 简单设备:不作用文件的设备如cdaudio. 复合设备:在播放时要用到数据文件, 如digitalvideo,waveaudio设备.数据文件 称作设备元素. 在打开一个复合设备时要指定设备元素或同时 指定设备名与设备元素,如 Open mysound.wav 或 Open mysound.wav type waveaudio 若按前者打开,则系统自动定位设备名.如 wav = waveaudio 注:当多次打开同一设备来播放不同的数据文件时, 每次都要给打开的设备取一个不同的别名.(见p63)
<2> 命令消息接口 所有MCI命令消息都是通过mciSendCommand函 数发送的,其原型为: MCIERROR mciSendCommand( MCIDEVICEID IDDevice,//设备的ID,打开设备时 不用 UINT uMsg,//命令消息 DWORD fdwCommand,//命令消息的标志 DWORD dwParam);//指向包含命令消息参数的 结构 //若成功返回0,否则返回错误码值.
要使用mciSendCommand函数,则需要二个数据结 构:MCI_PLAY-PARAMS,MCI_WAVE_OPEN_ PARAMS ,二个数据结构的原型见P64. 这二个结 构被包函在头文件中:MMSystem.h 详细内容在P65的(1)至(5) 实例参见P65-72
3.3 VC++开发工具中图像的处理 • 动画原理:通过SetTimer() 在程序中设定一个定 • 时器,每隔一定的时间产生一个WM_TIMER消息, • 通过触发OnTimer() (有相应的显示代码加载在此 • 函数中,主要有BitBlt 函数)来实现动画的效果. • 计时器: SetTimer(1,500,NULL) • 第一个参数为计时器ID号;第二个参数为每隔500 • 毫秒发送一次WM_TIMER消息给OnTimer() ; • 第三个参数NULL表示计时器只用于发送定时消 • 息而不是用来作为回调函数使用. • 注:由于硬件定时器的原因, OnTimer()实际间隔 • 时间为555毫秒收到一条WM_TIMER消息.
CDC::BitBlt的函数原型为: BOOL BitBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop); 成功返回时值为非0, 否则为0值. x, y, nWidth, nHeight, 目标矩阵左上角的逻辑坐标 及宽和高; pSrcDC 标识位图设备上下文若不包括 光栅操作则必须为NULL; xSrc, ySrc分别指定原 位图的左上角的坐标; dwRop指定光栅操作代码.
3.4 VC++开发工具中视频的处理 Windows 95/98/NT支持一种动画控件:Animate Control,播放AVI动画,该控件封装在 CAnimateCtrl类中,其成员函数有以下几个: 1.创建动画控件Create,其原型为: BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd , UINT nID) dwStyle指控件风格:ACS_CENTER使动画片居于 控件中央,且控件窗口尺寸和位置保持不变.不指 定则播放时控件窗口自动调整以适应动画窗口; ACS_TRANSPARENT使动画片的背景透明; ACS_AUTOPLAY重复播放动画片.
动画控件自身窗口风格有:WS_CHILD, WS_VISIBLE, WS_BORDER等. rect指定了控件的尺寸, pParentWnd指向父窗口, nID是控件的ID, 若创建成功则函数返回TRUE. 2. BOOL Open(LPCTSTR lpszFileName)/ BOOL Open(UINT nID) 打开动画片,若参数为NULL,则系统将关闭以前 打开的动画片,成功则函数返回TRUE.
3. BOOL Play(UINT nFrom, UINT nTo, UINT nRep); 功能:播放动画片. nFrom开始帧的索引值,小于65536,若为0则从头 开始播放. nTo 结束帧的索引值,小于65536,若为-1则播放 播放动画到末尾. nRep重播次数,若为-1则无限次播放. 函数成功返回时为TRUE. 4. BOOL Seek(UINT nTo) 功能:静态显示动画片的某一帧. nTo帧的索引值,小于65536,若为0则显示第一帧,若 为-1则显示最后一帧,函数成功返回TRUE值.
5. BOOL Stop():停止动画片的播放,成功时返回 TRUE值. 6. BOOL Close():关闭并从内存中清除动画片,成 功时返回TRUE值. 实例:参见P79