【视频处理工程】6、使用Lav Filter手动建立Filter Graph并播放视频文件

简介: 在前面的这篇博文中,我们开始利用的手动建立Filter Graph,已经完成了Splitter Source Filter和Audio/Video Decoder的建立和链接。

在前面的这篇博文中,我们开始利用的手动建立Filter Graph,已经完成了Splitter Source Filter和Audio/Video Decoder的建立和链接。接下来需要做的是渲染解码完成的音视频数据,分别由Audio Render和Video Render完成。音频渲染器较为简单也很少会出问题,我们主要讨论视频渲染器的问题。

DirectShow所提供的视频渲染器种类有多种,如Video Renderer(已不常用)、VMR-7、VMR-9、EVR等。MSDN的文档讲了各种视频渲染器的相关知识。其中提到了“在vista之后的windows版本中,如果硬件支持应使用EVR”,既然已经是win 7了,那自然是首选EVR了。这部分的代码如下:

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);
	hr = AddFilterByCLSID(pGraph,CLSID_EnhancedVideoRenderer,L"Enhanced Video Renderer",&pRenderer);
 	hr = ConnectFilters(pGraph,pLavVideoDecoder,pRenderer);


	hr = AddFilterByCLSID(pGraph,CLSID_AudioRender,L"Audio render",&pAudioRender);
	hr = ConnectFilters(pGraph,pLavAudioDecoder,pAudioRender);
//......
}


Build工程后运行,使用GraphStudioNext查看生成的Filter Graph,可以看到音视频渲染器都已经成功加入了,如下图所示:


但是我们发现一个问题,电影已经正常播放,但是只有声音却没有图像,这是为何?

通过搜索得知,DirectShow的渲染器定义了两种模式:窗口模式和非窗口模式。窗口模式下,视频渲染器会自动生成一个视频播放窗口,渲染完成的画面会显示在这个视频窗口中;当然我们可以获取这个窗口的句柄进行下一步操作比如讲该窗口置于我们自定义的应用窗口下加以控制。非窗口模式下,视频渲染器需要指定一个视频输出窗口,将数据渲染在该窗口中。在这两种模式中,Video Renderer只支持窗口模式,VMR-7/9支持两种模式,默认为窗口模式。而在MSDN文档中指出,EVR并不支持窗口模式,显示窗口必须由应用程序自己创建。而我们的demo只是一个控制台程序,不存在窗口,自然也就无法渲染视频了。

既然不支持,那我们就换掉,改为使用VMR-9进行绘制。方法很简单,在添加EVR组件的语句中将CLSID_EnhancedVideoRenderer改为CLSID_VideoMixingRenderer9就可以了。

编译链接运行,查看Filter Graph,如下图:


播放画面:


至此,我们已经成功地把一部主流格式的电影文件通过手动建立Filter Graph的方式播放出来了,也对DirectShow的基本概念有了一定的了解。接下来还将继续进一步深入研究与其相关的更多内容。

下载该demo点这里

目录
相关文章
|
3月前
|
定位技术 iOS开发
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
19 0
|
6月前
Three入门 【加载外部模型,使用dat.gui创建动画控制器】
Three入门 【加载外部模型,使用dat.gui创建动画控制器】
32 0
|
7月前
|
存储 JSON 物联网
如何将 OBJ 模型转换和压缩为 GLTF 以与 AWS IoT TwinMaker 配合使用
尝试开始使用 AWS IoT TwinMaker,需要将您的 OBJ 文件转换为 glTF?也许您已经使用 Matterport 对您的环境进行了点云扫描,但不清楚如何将 Matterpak 捆绑包导入 AWS IoT TwinMaker。在本博客中,您将应用模型转换管道来压缩 Matterpak 捆绑包并将其转换为 glTF 格式。此方法将在 AWS IoT TwinMaker 中提供最新的 3D 模型并缩短场景加载时间。
129 0
|
8月前
|
数据可视化 定位技术 API
探索Streamlit中强大而灵活的 st.write() 函数(五):构建丰富多样的应用界面
探索Streamlit中强大而灵活的 st.write() 函数(五):构建丰富多样的应用界面
710 0
|
Java Android开发
|
存储 数据安全/隐私保护 计算机视觉
python 实现dcmtk关联pacs功能 推送下拉影像
1、dcmtk关联pacs的参数介绍 2、dcmtk命令介绍 3、演示工具的功能 4、说明使用的技术 5、遇到的问题 6、工具目前存在的缺点
231 0
python 实现dcmtk关联pacs功能 推送下拉影像
|
应用服务中间件 数据安全/隐私保护 开发者
Filter 的应用场景、Filter 的目标资源、小结| 学习笔记
快速学习 Filte r的应用场景、Filter 的目标资源、小结。
Threejs工厂模型3Dmax模型obj+mtl格式,源文件下载
Threejs工厂模型3Dmax模型obj+mtl格式,源文件下载
717 0
Threejs工厂模型3Dmax模型obj+mtl格式,源文件下载
|
算法 Android开发 数据安全/隐私保护
【Android 逆向】IDA 工具使用 ( 函数窗口 Function window | 创建引用图 Xrefs graph to | 创建调用图 Xrefs graph from )
【Android 逆向】IDA 工具使用 ( 函数窗口 Function window | 创建引用图 Xrefs graph to | 创建调用图 Xrefs graph from )
434 0
【Android 逆向】IDA 工具使用 ( 函数窗口 Function window | 创建引用图 Xrefs graph to | 创建调用图 Xrefs graph from )
|
JavaScript 前端开发 定位技术
Vue 集成腾讯地图基础api Demo集合(基础地图引入与展示模块,地址逆解析,3D/2D切换 ,位置服务,mark标记)
Vue 集成腾讯地图基础api Demo集合(基础地图引入与展示模块,地址逆解析,3D/2D切换 ,位置服务,mark标记)
845 0
Vue 集成腾讯地图基础api  Demo集合(基础地图引入与展示模块,地址逆解析,3D/2D切换 ,位置服务,mark标记)