本例在DirectX 9.0b版本下,位于DXSDK90b\Samples\C++\DirectShow\Players\PlayWnd。网上也许也能下载到。
此播放器实现的功能:
打开文件、推出
播放、暂停、停止
窗口1倍显示、0.5倍显示、2倍显示、全屏、画面跟随窗口变形
窗口标题栏显示所播放文件的名称和播放状态
快放、慢放
按帧播放
静音等
源码对应于不同的功能设置了各个全局变量,如下:
HWND
HMENU
HINSTANCE ghInst=0;
TCHAR
BOOL
LONG
DWORD
PLAYSTATE g_psCurrent=Stopped;
double
要实现一个播放器,有如下步骤:
1.
2.
3.
4.
IGraphBuilder 构造Filter Graph Manager
IMediaControl 控制流媒体,如启动、停止、暂停等
IMediaEventEx 播放事件接口,创建事件的标志信息并传送给应用程序
IVideoWindow显示窗口控制接口
IBasicAudio声音控制接口
IBasicVideo图像控制接口(波特率,宽度,长度等信息)
IMediaSeeking 播放的位置和播放速度控制接口
IMediaPosition 播放的位置和速度控制接口(控制播放位置只能为设置时间控制方式)
IVideoFrameStep控制单帧播放的接口;
5.
我们来看一下这个例子中的一些主要函数,按照播放流程一步步往下分析。
WinMain函数:实现COM的初始化和反初始化,即上述步骤的第一步和第五步。注册窗口类并调用WndMainProc;
OpenClip函数:这是程序调试成功后立刻实现的函数,它也在ID_FILE_OPENCLIP产生后关闭当前播放的文件回到初始状态(详见WndMainProc)再被调用。当未指定播放文件时,调用InitPlayerWindow设置窗口。指定播放文件后,GetClipFileName取得文件名,获取相应字符串,IsWindowsMediaFile判断是否支持媒体格式,都成功后调用PlayMovieInWindow进行下一步设置,失败则CloseClip;
WndMainProc函数:将消息通知给程序,调用各类函数实现菜单栏及快捷键的功能,如MoveVideoWindow改变窗口尺寸、StepOneFrame和StepFrames按帧播放、ModifyRate和SetRate设置播放速度、ToggleMute静音、ToggleFullScreen全屏、CloseClip停止播放、PauseClip暂停播放、InitVideoWindow和CheckSizeMenu实现窗口缩放等;
PlayMovieInWindow函数:首先编码转换,清理对话残余,之后调用CoCreateInstance创建GraphBuilder,用QueryInterface查询各类接口。用CheckVisibility判断音频和视频,如果是音频,则设置相应的父类窗口和窗口格式,如果是视频,调用InitPlayerWindow取得窗口默认值,并调用EnablePlaybackMenu实现工具栏各个功能。继续初始化,要调用CheckSizeMenu等窗口函数采用默认值,UpdateMainTitle显示最初的标题。如果Graph还未注册,则需要调用AddGraphToRot将Graph添加到注册组件中。准备好以上一切后,才运行该媒体文件;
CloseClip函数:停止媒体文件的播放后,运行为停止状态,窗口显示为音频窗口,关闭全屏,调用CloseInterfaces函数(其中调用了RemoveGraphFromRot解除Graph的注册,并释放各个接口)关闭各个接口,文件名清零,运行回到初始状态。调用UpdateMainTitle显示最初标题,InitPlayerWindow显示初始化窗口。
以上就是播放器实现的主要函数,对应这源码看就能明白这个播放器的大致播放流程。黑体标出的都是源码自己构建的函数,这一例子中的除个别函数外都已在上面表述过了,各个小功能函数的实现没有做多叙述,看一看就能明白。
接触播放器制作不久,若表述有误,还请指正。