DirectShow播放视频步骤

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

步骤

  1. 创建Filter Graph Manager的实例。
  2. 使用过滤器图形管理器构建过滤器图形。
  3. 运行图表,使数据在筛选器中移动。
  4. 详细内容请看连接https://docs.microsoft.com/zh-cn/windows/desktop/DirectShow/how-to-play-a-file

猜你喜欢

转载自blog.csdn.net/u010019479/article/details/81517047