上一篇做了一个简单的媒体文件播放器,它到底与其它程序有什么不同呢?,只有这两个东西不是我们自己的,现在就把它变成我们自己的。
先看看我们做的程序,要播放媒体,就两个步骤,打开文件,播放。跟踪代码的执行过程,无非就是这样:
通过“打开对话框”得到文件:mSourceFile = ();
然后CreateGraph(),看:
void CMyPlayerDlg::CreateGraph(void)
{
DestroyGraph();//老套路了,先破坏,确保mFilterGraph是NULL,先看DestroyGraph()
mFilterGraph = new CDXGraph();
if (mFilterGraph->Create())
{
mFilterGraph->RenderFile(mSourceFile);
mFilterGraph->SetDisplayWindow(());
mFilterGraph->SetNotifyWindow(this->GetSafeHwnd());
mFilterGraph->Pause();
}
}
看DestroyGraph():
void CMyPlayerDlg::DestroyGraph(void)
{//这个函数的作用就是:如果“打开”了就“关闭”,否则什么也不干,
//就是运行了这个函数,一定是“关闭”的
if (mFilterGraph)//CDXGraph * mFilterGraph,是CDXGraph指针
{
mFilterGraph->Stop();
mFilterGraph->SetNotifyWindow(NULL);
delete mFilterGraph;
mFilterGraph = NULL;
}
}
CreateGraph函数我们从new CDXGraph()开始“研究”,就是看其构造函数,什么都没做,就是初始化,往下看mFilterGraph->Create():
bool CDXGraph::Create(void)
{
if (!mGraph)
{
if (EEDED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void **)&mGraph)))
{
//AddToObjectTable();这个是用来做GraphEdit调试的,暂且去掉
return QueryInterfaces();
}
mGraph = 0;
}
return false;
}
第一个不认识的是mGraph,mGraph是什么?是IGraphBuilder * mGraph;
DirectShow是基于模块化的,使用一个Filter Graph Manager来管理整个数据流的处理过程,参与处理的各个功能模块叫做Filter(国内目前的翻译有滤波器、过滤器、滤镜、筛选器等等乱七八糟的), 各个Filter在Filter Graph中按一定的顺序连接成一条流水线协调工作,大致分为3类:Source Filters(负责获取数据)、Transform Filters(负责数据的格式转换,例如数据流的分离/合成、解码/编码)、Rendering Filters(负责数据的去向,显卡、声卡、文件等)。
组件技术基础上,紧密相连, 它接口来构造和实现,其中几个重要的接口经常需要用到的:IGraphBuilder接口,用来创建Filter Graph Manager;IMediaControl接口,用来控制流媒体在Filter Graph中的流动,例如流媒体的启动和停止;IMediaEvent接口,该接口在Filter Graph发生一些事件时用来创建事件的标志信息并传送给应用程序(参考附2);IVideoWindow: 用于设置多媒体播放窗口的属性。(更多接口请参考附1)
所以,在CDXGraph类中有如下一些定义:
媒体文件播放 来自淘豆网www.taodocs.com转载请标明出处.