视频播放器设计分析
春季如何护肤-
视频播放器设计
1
需求分析
由于计算机的普及,
极大地改变了人们的生活。
随之带来了开发各种软件的需
求。
家用型计算机主要用于家用软件、
学习软件、
游戏软件和多媒体和多媒体软件,
以及
播放
CD
、
VCD
、
DVD
、
MP3
等多媒体信息。然而多媒体播放器的开发仍然不能满
足人们的需求,
多媒体文件格式多样,
但却没有一款播放器能够满足所有格式的解
码。人们渴望解码能力更强大,功能更完备的多媒体播放器。
“多媒体”
是一种新型的信息处理与传播技术。
有人认为它是信息及其传输媒
介方面的一场根本革命。人们对新技术的渴望和欢迎、新奇
感和占有欲、宣传热情
和赞美态度,是发自内心的。特别是计算机多媒体技术的功能,令
人大开眼界,惊
叹不已。
它在商业、
信
息检索、
文化娱乐和教育等方面的应用效果明显,
前景广阔。<
/p>
由多媒体播放器的开发现状看来,
并没
有哪一款播放器能适应所有多媒体文件
的解读,随着视频、音频的迅猛发展,媒体文件的
格式层出不穷,由过往美国在线
(AOL)
公司的
Nullsoft
部门开发的
Winamp
独占鳌头,到
Real
Networks
公司的
Real
P
layer
和微软公司的
Windows
Media
Player
风靡全球,
再到如今播放器开发的百花
齐放的竞争时代,多媒体播放器的开发经历了许多风浪和变化
,但是,仍然没有出
现全能的播放器,始终没有跨越编码格式的局限,随着多媒体技术的
不断发展,人
们对多媒体软件的要求也不断高涨,
所以对多媒体
软件的开发也成为当今计算机开
发的重要课题。目前的音频、视频格式繁多,研制格式覆
盖面广的多媒体播放器前
景非常广泛。
随着计算机、
家电、
通信等技术的不断发展,
多媒体技术有着广泛的开发前景,
尤其是多媒体播放器的开发,开发格式覆盖面更广,兼容性更好,功能更完备的播
放器势在必行。本文主要采用
C++ Builder2009
作为开发工具,设计并实现一个多
媒体播放器。可播放
MP
3
,
AVI
,
WMV
,
WMA
,
RM
,
RMVB
,
SWF
等多种格式的多媒体文
件,
并且能够控制播放,暂停,
停止,快进,后退,音量控制的调节,选择上一曲,
p>
选择下一曲,
图像的显示,
文件的计时,<
/p>
列表文件的添减操作等多种播放控制功能,
界面简明,操作简单。
2
系统总体设计
2.1DirectShow
概述
<
/p>
DirectShow
是一种通过自定义或内置的大量的
Filter(
过滤器
)
来处理多媒体
数据的体系结构。这些
Filter
大致分三类:
Source
Filter(
p>
源过滤器
)
、
Tr
ansform
Filter(
转换过滤器
< br>)
、
Render
Filte
r(
呈现过滤器
)
。源过滤器主要负责
获取数据,
数据源可以是文件、网络、计算机采集卡或数字摄像机里的,然后数据向下传
输到
Transform Filter
,它主要负责数据的格
式转换,然后继续向下传输到
Render
Filter
p>
,
它主要负责数据的最终去向,
将数据送给
显卡声卡进行播放或输出变成文
件存储起来,见图
2-1
。
应用程序
命令
DirectShow
过滤器图表管理器
Filters Graph Manager
应用程序
源过滤器
Source
< br>Filters
转换过滤器
Transform
Filters
呈现过滤器
Render
Filters
应用程序
事件
音视频采集设备
各种软硬件解码器
声卡
显卡
图
2-1
DirectShow
开发应用程序原理图
< br>过滤器
Filter
是建立在
C
OM
技术基础上的,每个
Filter
本身就是一个
COM
组件,
各个
Filter
集合组成过滤器图
(Filte
r
.
Graph)
,
< br>DirectShow
提供
Filter Graph
Manager
组件来管理整个过滤器图,比如
Filter
间的连接和数据流动。
Filter
p>
之间
通过
Pin(
针脚
)
连接。
更多感性认识
DirectShow
,可以
< br>DirectX SDK
中的自带的实用的程序
Grap
hEdit
,位于安装目录
。
GraphEdit
是构造
Filter
Graph
Manager
的可视化
工具,在
GraphEdit
中可以很方便地设计出过滤器图,
并验
证其可行性。
比如:
播放一个典型
的
文件
(
将文
件拖动到
GraphEdit
窗口
)<
/p>
所自动构建的
Filter Graph
。见图
2-2
。
MPEG Audio
Decoder
MPEG-1 Stream
Splitter
MPEG Video
Decoder
Video Renderer
Default
DirectSound Device
图
2-2
MPEG
文件播放的
Filter Graph
如图
2
所示,箭头方向即是数据的流动,可以看到:
MPEG-1 Stream
Splitter
属于
Source
Filters
,负责接收源文件数据;
MPEG Audio
Decoder
、
MPEG Video
Decoder
属于
Transform
Filters
;
分别负责视频、
音频的解码;
Default
DirectSound
Device
、
Video
Renderer
属于
Render Filters
,分别负责对视频显示和音频播放。
执行菜单
G
raph->Play
,可以看到播放的影音文件。在
Grap
h->Insert
Filters
可以
看到
DirectShow
提供的大量的支持基本应用的<
/p>
Filter
。
2.2
软件的总体架构
AVI
视频
RMVB
视频<
/p>
视频指针
解码
主界面
用户
图
2-3
软件架构
2.3
详细设计与实现
下面在
C++ Builder
中,利
用
DirectShow
技术设计媒体播放器,介绍了
DirectShow
程序的一般编写方法。以两种方法实现:一种是直
接用
DirectX SDK
;
另一种
是用基于
DirectShow
技术的第三方控件包
DsPack
。
2.3.1
直接用
Direct X
SDK
中的
DirectShow
技术
的媒体播放器。
用
DirectSh
ow
编写播放器,可以说主要包括三步:
①创建一个
Filter Graph
Manager
组件。
②根据实际的
应用,创建一条完整的链路。比如播放一个本地文件:
m_FilterGraph->
RenderFile(
“
Demo1
.
mpg
”,
NULL)
;
③调用
Filter
Graph
Manager(
或某个
Filter)
上的各个接口方法进行控制。并
完成
Filter
Gramph
< br>Manager
与应用程序的事件交互。比如
IMedi
aControl
接口方法
Run()
、
Stop()
来控制媒体的播放与停止。
在本实例中,第一步创建一个
Filter
Graph
Manager
组件,由
自定义的封装类
CDXGraph
来完成,
它的实现文件是
和
CDXGrap
h.h
。
第二三步要实现与
CDXGr
aph
之问的事件交互。由主窗口
MainForm(
和
MainUnit.h)
完成。
该程序部分主要代码如下:
//
定义基本接口。
IGraphBuilder
是最重要的接口,用于构造
Filter graph
< br>;
IMediaControl
播放控制接口,控制播放
、停止、暂停等;
IMediaEventEx
:应用程
序通过此接口获得播放过程中发生的事件,如播放完毕等。
IBasi
cVideo
、
IBasicAudio
分别是图像和声音控制接口;
IVideoWindow
视频
窗口控制接口;
IMediaSeeking
用于媒体数据流的
定位,提供对播放的精确控制,如获得当前播放
位置等。
IGraphBuilder
*mGraph
;
IMediaControl
*mMediaControl
;
IMediaEVentEx
*mEvent
;
IBasicVideo
*mBasicVideo
;
IBasicAudio
*mBasicAudio
;
IVideoWindow
*mVideoWindow
;
IMediaSeeking
*mSeeking
;
//
用
API
函数初始化
C
OM
组件库
CoInitialize(NULL)
;
//
创建
Filter graph<
/p>
对象,得到
IGraphBuilder
接口的接口指针
mGrph
HRESULT hr=CoCr
eateInstance(CLSID_FilteGraph
,
NULL
,
CLSCTX_INPROC_SERVER<
/p>
,
IID_IGraphBuilder
,
(void * *)
&
mGrap
h)
;
//
用
QueryInterface()
函数获取接口指针
hr = mGraph -> QueryInterface(
IID_IMediaControl
,
(void * *)
&
mMedia
Control)
;
hr =
mGraph -> QueryInterface(IID_IMediaEventEx
< br>,
(void *
*)&mEvent)
;
hr =
mGraph -> QueryInterface(IID_IBasicVideo
,
(void * *)
&
mBasicVideo)
;
hr = mGraph -> QueryInterface(IID_IBasi
cAudio
,
(void *
*)&mBasicAudio)
;
hr = mGraph -> QueryInterface(IID_
Ⅳ
ideowindow
,