用DirectShow实现音视频文件的播放
现在的Windows对多媒体文件暴露的API一般都转向原来DirectX方式的。DirectShow原来是DirectX中的组件,现在已经转移到Windows SDK的组件了。用它来实现多媒体文件的播放与操作具有很好的性能。下面的代码示例就用它播放一个".wav"文件,如果是.wmv, .avi文件,则会自动跳出播放窗口进行对视频的播放。
代码
#include<windows.h>
#include<dshow.h>
void main(){
CoInitialize(NULL); //因为要使用COM组件,所以要初始化
IGraphBuilder *pGraph=NULL; //核心接口
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void**)&pGraph);
IMediaControl *pCtrl=NULL; //用于控制媒体流的接口
IMediaEvent *pEvent=NULL; //触发媒体流事件,如播放结束等
pGraph->QueryInterface(IID_IMediaControl, (void**)&pCtrl);
pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
pGraph->RenderFile(L"C:\\WINDOWS\\Media\\tada.wav", NULL);
pCtrl->Run();
long eCode;
pEvent->WaitForCompletion(INFINITE, &eCode);
pEvent->Release();
pCtrl->Release();
pGraph->Release();
CoUninitialize();
}
#include<dshow.h>
void main(){
CoInitialize(NULL); //因为要使用COM组件,所以要初始化
IGraphBuilder *pGraph=NULL; //核心接口
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void**)&pGraph);
IMediaControl *pCtrl=NULL; //用于控制媒体流的接口
IMediaEvent *pEvent=NULL; //触发媒体流事件,如播放结束等
pGraph->QueryInterface(IID_IMediaControl, (void**)&pCtrl);
pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
pGraph->RenderFile(L"C:\\WINDOWS\\Media\\tada.wav", NULL);
pCtrl->Run();
long eCode;
pEvent->WaitForCompletion(INFINITE, &eCode);
pEvent->Release();
pCtrl->Release();
pGraph->Release();
CoUninitialize();
}
上面编译运行后,需要加 strmiids.lib库进行链接。
下面是DirectShow的结构图:
具体内容可以参考SDK文档