【视频处理工程】4、DirectShow基本开发过程(二)

简介: 前文讲了一些开发DirectShow的基本配置方法以及一些基本的开发过程,如如何创造一个filter并加入filter graph中。这里继续上文的步骤讨论如何得到filter的pin,以及如何连接两个filter。

前文讲了一些开发DirectShow的基本配置方法以及一些基本的开发过程,如如何创造一个filter并加入filter graph中。这里继续上文的步骤讨论如何得到filter的pin,以及如何连接两个filter。

1、如何获取filter的pin

获取filter上的pin是连接filter之前必须的一步。主要思路是枚举filter上所有的pin,并通过QueryDirection检查pin的方向,以及通过connectedTo检查pin是否已经被链接。方法如下:

HRESULT GetUnconectedPin( IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin )
{
	*ppPin = 0;
	IEnumPins *pEnum = 0;
	IPin *pPin = 0;

	HRESULT hr = pFilter->EnumPins(&pEnum);
	if (FAILED(hr))
	{
		return hr;
	}
	hr = pEnum->Reset();
	while (pEnum->Next(1,&pPin,NULL) == S_OK)
	{
		PIN_DIRECTION ThisPinDirection;
		pPin->QueryDirection(&ThisPinDirection);
		if (ThisPinDirection == PinDir)
		{
			IPin *pTemp = 0;
			hr = pPin->ConnectedTo(&pTemp);
			if (SUCCEEDED(hr))
			{
				//当前pin已经连接,无效;
				pTemp->Release();
			} 
			else
			{
				pEnum->Release();
				*ppPin = pPin;
				return S_OK;
			}			
		}
		pPin->Release();
	}
	pEnum->Release();
	return E_FAIL;
}

需要注意的是,有些filter想要检索出其中的pin是有条件的,比如上文中提到的lav splitter source filter,只有在加载了视频文件之后,才可以检索出其pin。


2、连接两个filter

两个filter之间由上一级的输出pin连接到下一级的输入pin,实现的方法有IFilterGraph::ConnectDirect和IGraphBuilder::Connect实现,方法如下:

HRESULT ConnectFilters( IGraphBuilder *pGraph, IPin *pOut, IBaseFilter *pDest )
{
	if ((pGraph == NULL)||(pOut == NULL)||(pDest == NULL))
		return E_POINTER;

#ifdef _DEBUG
	PIN_DIRECTION PinDir;
	pOut->QueryDirection(&PinDir);
	_ASSERT(PinDir == PINDIR_OUTPUT);
#endif // _DEBUG

	//得到下级filter的输入pin
	IPin *pIn = 0;
	HRESULT hr = GetUnconectedPin(pDest,PINDIR_INPUT,&pIn);
	if (FAILED(hr))
		return hr;

	hr = pGraph->Connect(pOut,pIn);
	pIn->Release();
	return hr;
}

HRESULT ConnectFilters( IGraphBuilder *pGraph, IBaseFilter *pSrc, IBaseFilter *pDest)
{
	if ((pGraph == NULL)||(pOut == NULL)||(pDest == NULL))
		return E_POINTER;

	IPin *pOut = 0;
	HRESULT hr = GetUnconectedPin(pSrc,PINDIR_OUTPUT,&pOut);
	if (FAILED(hr))
		return hr;
	hr = ConnectFilters(pGraph,pOut,pDest);
	pOut->Release();
	return hr;
}

下面我们依样画葫芦,讲lavvideo.ax和lavaudio.ax这两个组件进行注册,并利用相同的方法添加到filter graph中,并与lav splitter source进行连接,代码如下:

int _tmain(int argc, _TCHAR* argv[])
{
//......
 	hr = AddFilterByCLSID(pGraph,CLSID_LavSplitter_Source,L"Lav Splitter Source",&pLavSplitterSource);
	hr = pLavSplitterSource->QueryInterface(IID_IFileSourceFilter,(void **)&pFileSourceFilter);
	hr = pFileSourceFilter->Load(fileName,NULL);//必须loadfile后才能检索pin

	hr = AddFilterByCLSID(pGraph,CLSID_LavVideoDecoder,L"Lav Video Decoder",&pLavVideoDecoder);
	hr = ConnectFilters(pGraph,pLavSplitterSource,pLavVideoDecoder);

	hr = AddFilterByCLSID(pGraph,CLSID_LavAudioDecoder,L"Lav Audio Decoder",&pLavAudioDecoder);
	hr = ConnectFilters(pGraph,pLavSplitterSource,pLavAudioDecoder);
//......
}

上述代码段中CLSID_LavVideoDecoder和CLSID_LavAudioDecoder都是在GraphStudioNext中查找CLSID后定义在头文件中的,分别表示lavfilter的视频和音频解码器组件。用 GraphStudioNext查看该进程的Filter Graph如下图所示:


由上图可见,视频和音频解码器分别已经链接在了source filter的视频和音频输出接口上,不过至于能不能正常使用现在还不得而知。我们的下一个目标就是通过用代码调用lav filter组件的方式手工播放这部电影。

目录
相关文章
|
4天前
|
XML 安全 测试技术
LabVIEW大型项目开发提高质量的工具
LabVIEW大型项目开发提高质量的工具
|
2月前
|
数据可视化 数据库 C++
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用
Qt 5.14.2揭秘高效开发:如何用VS2022快速部署Qt 5.14.2,打造无与伦比的Windows应用
110 0
|
9月前
|
计算机视觉
HarmonyOS学习路之开发篇—多媒体开发(图像开发 一)
HarmonyOS图像模块支持图像业务的开发,常见功能如图像解码、图像编码、基本的位图操作、图像编辑等。当然,也支持通过接口组合来实现更复杂的图像处理逻辑。
HarmonyOS学习路之开发篇—多媒体开发(图像开发 二)
图像编码就是将PixelMap图像编码成不同存档格式图片,用于后续其他处理,比如保存、传输等。当前仅支持JPEG格式。
HarmonyOS学习路之开发篇—多媒体开发(图像开发 二)
|
9月前
|
编解码 算法 内存技术
HarmonyOS学习路之开发篇—多媒体开发(音频开发 一)
HarmonyOS音频模块支持音频业务的开发,提供音频相关的功能,主要包括音频播放、音频采集、音量管理和短音播放等。
|
9月前
|
编解码 API 开发者
HarmonyOS学习路之开发篇—多媒体开发(音频开发 二)
音频采集的主要工作是通过输入设备将声音采集并转码为音频数据,同时对采集任务进行管理。
|
9月前
|
存储 编解码 API
HarmonyOS学习路之开发篇—多媒体开发(相机开发 一)
HarmonyOS相机模块支持相机业务的开发,开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发,最常见的操作如:预览、拍照、连拍和录像等。
|
9月前
|
API 开发者
HarmonyOS学习路之开发篇—多媒体开发(相机开发 二)
Camera操作类,包括相机预览、录像、拍照等功能接口。
|
10月前
|
编解码 监控 开发工具
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
63 0
DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件
|
网络协议 Ubuntu Linux
基于C++(QT框架)设计的网络摄像头项目(支持跨平台运行)
基于C++(QT框架)设计的网络摄像头项目(支持跨平台运行)
878 0
基于C++(QT框架)设计的网络摄像头项目(支持跨平台运行)