基于幻世(OurDream)2D 图形引擎的媒体播放设计方法
摘要:常用的媒体播放器是在 Windows 操作系统平台下,利用 ActiveX 技术,以 Windows Media Player 的 OCX 组件为基础来设计的,这样做的好处是最大化利用成熟的技术和现成的设计,且同时保证基本的设计质量。文章介绍了另一种相比较之下同样简单高效的媒体播放设计方法:基于幻世(OurDream)2D 图形引擎的媒体播放设计方法。
关键词:媒体播放器;图形引擎;幻世 2D
中图分类号:TP391.41 文献标识码:A 文章编号:1673-1131(2015)10-0128-02.
1 什么是幻世
幻世(OurDream)是一款轻量级的,基于 DirectX 与OpenGL 的 2D 图形引擎,是专为高速高效绘图而专门设计的,引擎能够充分地利用目标计算机的硬件平台能力,高速完成超大量图形画面的绘制和输出工作。鉴于目前高清媒体的泛滥,这样的能力使得幻世引擎尤其适合用来播放这些高清的多媒体文件,同时简单易用的设计,也使得利用引擎的功能非常简便,这也是许多开发者选择它来完成播放器设计的主要原因。
2 设计播放器
如何设计一个基于幻世引擎的播放器?这里是使用 C++作为设计的语言,使用 Virtual C++ 2010 作为开发工具,幻世引擎 SDK 则是使用目前最新的版本。在设计之前,假定读者熟悉 C++程序设计,并且已经成功完成了开发环境的搭建,能够直接开始幻世程序的设计。
3 设计过程
首先,我们搭建一个幻世引擎的框架,为后面的设计工作做好准备。这个框架程序能够运行,但是只能在屏幕上绘出黑色的背景。使用幻世引擎之前,需要编写引擎的初始化代码,这样才能够让我们自己的程序利用上引擎提供的功能。该过程很简单,只需要先创建一个引擎实例,然后使用其提供的初始化函数就可以进行初始化。(如下所示)engine=Create3D(OURDREAM2D_VERSION);
if (engine= =NULL)
{
MessageBox(0, “Create Engine Fail !”,”ERROR”,MB_OK);return -1;
} C
reate3D 函数便是用来创建引擎实例的函数,它需要一个 参 数 用以 标 明 使 用的 引 擎 版本,直接 使 用 宏 OURDREAM2D_VERSION 即可。
在引擎实例创建成功后,我们通过调用引擎的Initialize函数执行引擎的初始化工作。该函数需要提供一个SOD2DSystemSetup 的数据结构用于告知引擎按照何种要求来进行初始化。该数据结构的具体定义如下(如下所示):
//系统设置信息结构
Struct SOD2DSystemSetup EOD2DVideoType m_eRenderType;HWND m_hWindowID;bool m_bUseZBuffer;
bool m_bWindowed;
bool m_bUseStencilBuffer;
bool m_bHideMouse;
bool m_bUseHighPrecisionFPU;
bool m_bUseVsync;
bool m_bUseLog;
int m_iScreenWidth;
int m_iScreenHeight;
int m_iColorMode;
int m_iTextureFilter;
int m_iAntialias;
int m_iFixFPS;
char m_szIcon[MAX_PATH];
char m_szTitle[256];
char m_szLog[MAX_PATH];
}
解释:
(1)指定渲染器的类型,需要提供一个 EOD2DVideoType的值。
(2)指定幻世引擎将图像输出到的窗口的句柄,可以取 0值,表示用户程序不提供窗口以供输出,引擎会自行创建一个窗口来完成图像的输出。如果指定有效的窗口句柄,则引擎会将画面输出到该窗口上。
(3)指定是否使用 Z 缓冲,对于 2D 图形取 false 值即可。
(4)指定是否使用窗口模式,如为 false,那么以全屏方式运行。
(5)指定是否使用模板缓存,取 false 值即可。
(6)指定是否隐藏系统的鼠标指针,隐藏后,可自行创建或者绘制鼠标指针。
(7)指定是否启用高精度浮点运算。
(8)指定是否启用垂直同步,可以让引擎更新屏幕图像的速度与显示器的刷新速度同步。
(9)指定是否启用日志记录,可以让幻世引擎将运行过程中的事件写到文本文件中,这样便于开发这了解运行中的问题,方便排查错误。 (10)绘图窗口的宽度(分辨率),该值在窗口模式下表示绘图窗口的宽度,在全屏模式下表示横向分辨率。
(11)绘图窗口的高度(分辨率),该值在窗口模式下表示绘图窗口的高度,在全屏模式下表示纵向分辨率。
(12)指定绘图时颜色深度,只能取值 16 与 32,16 即代表 16 位色,32 代表 32 位色,取其他值会导致引擎初始化失败。
(13)指定纹理过滤方式,取值范围-1~8,其中-1 为关闭纹理过滤,0 为启用三线性过滤,1~8 为启用各向异性过滤。
(14)指定图像抗锯齿强度,取值范围 0~4,0 为关闭抗锯齿。
(15)指定最大 FPS(帧速率),指定该值后,引擎的帧速率将会被限制在此值以下。
(16)指定绘图窗口的图标文件位置,如果不需要使用,可以直接置为 NULL。
(17)指定绘图窗口的文字标题,可以置为 NULL 即使用默认的窗口标题。
(18)指定日志文件保存的位置,可以置为 NULL,如果该值置为 NULL,则第 9 项即使为 true 也无效。
接下来,就是完成引擎渲染器接口的获取,这是图像输出的关键,也是后面获得引擎多媒体接口用于播放媒体文件的前提。下面是获取渲染器接口的方法(如下所示):
IRenderSystem*Render=NULL;
render=engine->GetRender();
if (render= =NULL)
{ M
essageBox(0,”Get Render Fail!”,’’ERROR”,MB_OK);engine->SystemStop();return -1;
} 完
成了渲染器的获取,下面就可以得到 IMediaSystem 多媒体系统接口了,这是完成播放器功能的主要部分。同样是简单地向幻世引擎主接口申请即可获得(这里需要声明一个IMediaSystem 的接口变量用来接收获得的接口指针,此处省略了没有展示出来)。如下所示:
media=engine->GetMediaSystem();
if (media= =NULL)
{
MessageBox(0,”Get MediaSystem Fail !”,”ERROR”,MB_OK);engine->SystemStop();
return -1;
}
接下来就是使用接口提供的 AddMedia 函数来加载需要使用的媒体文件了。(如下所示):
SOD2DFloatRect position;
//载入媒体文件
position.Init(15,15,815,615);
WCHAR wmediapath[MAX_PATH];
MultiByteToWideChar (CP_ACP, 0,”big_buck_bunny_1080p_stereo.avi”,-1,Wmediapath,MAX_PATH);
Media->AddMedia(100,wmediapath,position);4 定义循环函数在接口已经获得,播放文件加载后,仍旧不能正常运行的原因在于还有两个重要的参数没有提交给引擎,那就是“帧处理函数”和“帧渲染函数”。
“帧处理函数”就是用来执行播放控制的控制函数,因此在这个函数里面我们将媒体播放过程中的控制功能加入到里面(如下所示):
bool FrameFun(void)
{
Media->OnEvent();
return true;
} “
帧渲染函数”就是用于图像输出的渲染器渲染函数如下所示):
bool RenderFun(void)
{
render->Clear(ARGB(255,0,0,0));
render->BeginScene();
render->EndScene();
return true;
}
完成后使用引擎的相关函数提交给系统就可以了(如下所示):
engine->SetFrameFunction(FrameFun);
engine->SetRenderFunction(RenderFun)
5 进入工作循环
让引擎开始执行循环的帧处理和帧渲染,实现引擎画面动态的变化(如下所示)。
engine->SystemRun()
6 卸载及清理
卸载操作能用来归还引擎运行期间所占用的资源,清理所有使用过的资源,如果不进行此操作,可能会导致系统出现内存或资源泄露,对操作系统可能会造成不良影响(如下所示):
media->Release();
render->Release();
engine->SystemStop()
7 编译生成
全部的代码编写完成后,就进行编译和运行。
8 结语
以上就是关于利用幻世 2D 图形引擎来设计媒体播放器的流程。由于它设计的简易性,使得在同类播放器中的使用也更加便捷。且因为是 2D 图形引擎,在对于图形图像的处理方面更加清晰流畅。希望这个设计能够给予同样爱好计算机设计的朋友有所帮助。