DirectShow是MicrosoftWindows平台上的流媒体架构。可以用它来方便的进行视频捕获和回放。
DirectShow是基于组件对象模型(COM)
下面是DirectShow播放AVI视频的代码
#include <stdio.h>
#include <dshow.h>//DirectShow必须包含的头文件,LIB库为Strmiids.lib 和 Quartz.lib
#pragma comment (lib,"Strmiids.lib")
int main() {
IGraphBuilder *pGraph = NULL;// 用于创建Filter Graph的接口
IMediaControl *pControl = NULL;// 用于向Filter Graph Manager发送Command
IMediaEvent *pEvent = NULL; // 用于接收Filter Graph Manager发出的Event
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) {
fprintf(stderr, "could not init the com library!");
return 0;
}
//创建Filter Graph Manager
hr=CoCreateInstance(CLSID_FilterGraph,NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr)) {
fprintf(stderr, "could not create Filter Graph Manager!");
return 0;
}
//查询并获得接口指针
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
// RenderFile库函数是少数几个能够自动创建Graph的成页,所以这里省去了创建Graph这一步
hr = pGraph->RenderFile(L"C:\\01.avi", 0);
if (SUCCEEDED(hr)) {
hr = pControl->Run();
if (SUCCEEDED(hr)) {
// 等待视频结束
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
// 无限等待
}
}
pControl->Release();
pEvent->Release();
pGraph->Release();
//释放接口
CoUninitialize();//卸载com库
system("pause");
return 0;
}
DirectShow是基于COM的,所以要初始化COM组件使用这个接口 CoInitialize
CoCreateInstance接口可以用它来创建各种过滤器
看到了要首先创建几个接口
IGraphBuilder *pGraph = NULL;// 用于创建Filter Graph(过滤器图表)的接口,DirectShow要播放视频或捕获视频,要创建很多过滤器,这个接口用于连接过滤器或添加过滤器
IMediaControl *pControl = NULL;// 用于向Filter Graph Manager发送Command 这个控制(control)提供了通过过滤器图控制数据流的方法。它包括运行,暂停和停止图表的方法。
IMediaEvent *pEvent = NULL; // 用于接收Filter Graph Manager发出的Event
步骤
- 创建Filter Graph Manager的实例。
- 使用过滤器图形管理器构建过滤器图形。
- 运行图表,使数据在筛选器中移动。
- 详细内容请看连接https://docs.microsoft.com/zh-cn/windows/desktop/DirectShow/how-to-play-a-file