第三讲 多媒体编程技术 3.1 多媒体概述 3.1.1 视觉类媒体

Download Report

Transcript 第三讲 多媒体编程技术 3.1 多媒体概述 3.1.1 视觉类媒体

第三讲
多媒体编程技术
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。
单色位图:每个字节存储八个像素,(每个像素
用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为前缀
的函数,功能多但程序复杂;利用高级音频函数,
使用方便但功能有限;利用媒本控制接口较好.
1. 利用高级音频函数播放波形音频文件.
有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是设备名.
设备类型
Animation
Cdaudio
Dat
Digitalvideo
Other
Owerlay
Scanner
Sequencer
Vidiodisc
waveaudio
描述
动画设备
CD播放器
数字音频磁带机
某一窗口中的数字视频
未定义的MCI设备
重叠设备(窗口中的模拟视频)
图像扫描仪
MIDI序列器
视盘机
播放数字波形文件音频设备
注:设备名和设备类型不同,设备名在注册表或
SYSTEM.INI中的[mci]段.(见操作)
设备名和设备类型有时相同,如cdaudio, waveAudio, 有的不同,如 avivideo -> digitalvideo .
MCI命令如下:
命令
描述
Capacility
查询设备能力
Close
关闭设备
Info
查询设备信息
open
打开设备
命令
Pause
Play
Record
Resume
Seek
Set
Status
stop
描述
暂停设备的播放或记录
开始设备的播放
开始
恢暂停播放或记录的设备
改变媒体的当前位置
改变设置
查询设备状态信息
停止设备的播放或记录
例: play cdaudio [from < track > to < track > ]
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++开发工具中图像的处理
1. 动画原理:通过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指定光栅操作代码.
光栅操作码
描述
BLACKNESS 所有输出变黑
DSTINVERT 反转目标位图
光栅操作码
MERGECOPY
MERGEPAINT
NOTSRCCOPY
NOTSRCERASE
SRCAND
SRCCOPY
SRCERASE
SRCINVERT
SRCPAINT
WHITENESS
描述
用布尔AND来合并特征与源位图
用布尔OR来合并特征与源位图
拷贝反转源位图到目标
反转用布尔OR来合并源与目标位图的结果
用布尔AND来合并目标像素与源位图
拷贝源位图到目标位图
反转目标位图并用AND合并这个结果和源
位图
使用XOR合并目标像素和源位图
使用OR合并目标像素和源位图
所有输出变白
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