DirectShow是windows平台上开发多媒体视频系统的一个很好框架,看到有部分案例使用API开发视音频回放,其实很多国外的编解码器的开发都是基于com组件的方式,供dshow的调用,比如CoreAVC公司的H264解码器(目前版本是2.0),Alexander的ac3解码器,还有RealMediaSplitter等,都是dshow的com组件,所以正确的使用这些第三方的组件可以达到事半功倍的效果,比如使用色彩平衡和音量增强的filter。

这里讨论的是几个开发中的问题。

 一.针对IBaseFilter和IPin需要使用CComPtr包装

开发中,会涉及手动连接渲染链,每个filter在头文件声明中,需要使用智能指针,比如CComPtr<IBaseFilter>  coreAVCFilter;智能指针对于dshow开发有很大的帮助,因为在pin口的连接中,如果不使用智能指针,很难搞清何时释放指针对象。所以使用智能指针后,只要在退出时将指针置为空即可,比如coreAVCFilter = NULL.同时,如果智能指针在使用时,有潜在的内存泄漏,调试程序一定会中断并跳转到代码相应的位置中。

二.使用ConnectDirect连接pin口

另一个问题,是在pin口的连接中,建议使用直接连接

BOOL CDXGraph::ConnectFilters(IPin * inOutputPin, IPin* inInputPin, const AM_MEDIA_TYPE * inMediaType) { if (mGraph && inOutputPin && inInputPin) { HRESULT hr = mGraph->ConnectDirect(inOutputPin, inInputPin, inMediaType); return SUCCEEDED(hr) ? TRUE : FALSE; } return FALSE; }

因为DirectShow有很强的智能连接技术,如果采用了智能连接,很有可能在两个pin口的连接中插入不必要的filter(可能用户的客户机中安装有其他的符合类型的filter)

三.灵活使用视频渲染器

对于vmr9和vmr7的使用,开发中需要谨慎考虑。因为很多实例中,对于最后连接视频渲染器,都使用了智能连接。其实智能连接往往选择了vmr7作为默认的视频渲染模式。针对配置比较高的显卡,可是考虑手动创建vmr9,同时启动vmr9的无窗口模式来优化显示性能。但是针对一些集成显卡,vmr7的显示效果要高于vmr9.建议还是在程序中加入可供用户选择是否使用vmr7或者vmr9.

bool CDXGraph::RenderVideoRender(CComPtr<IBaseFilter> inFilter) { videoRender = NULL; if (!SUCCEEDED(videoRender.CoCreateInstance(CLSID_VideoMixingRenderer9,NULL, CLSCTX_INPROC_SERVER))) { if(!RenderAllOutputPins(inFilter)) { return false; } } return true; }

CComPtr<IVMRFilterConfig9> pConfig = NULL; HRESULT hRes2 = filter_ex_Render->QueryInterface(IID_IVMRFilterConfig9,(LPVOID *)&pConfig); if(SUCCEEDED(hRes2)) { hRes2 = pConfig->SetRenderingMode(VMR9Mode_Windowless);//VMRMode_Windowless hRes2 = pConfig->SetNumberOfStreams(1); hRes2 = filter_ex_Render->QueryInterface(IID_IVMRWindowlessControl9,(LPVOID*)&pWC); } if (SUCCEEDED(hRes2)) { hRes2 = pWC->SetVideoClippingWindow(m_mainFrame->m_videoWnd.m_playerWnd.m_hWnd); hRes2 = pWC->SetAspectRatioMode(VMR9ARMode_LetterBox); }

四.常用mpc中的filter

下面介绍几个常用的dshow所使用的com组件,这些组件都开自于开源代码mpc,这些代码都可是在http://sourceforge.net/中下载到,但是要成功编译mpc的各个filter和主程序,还需要其他额外的步骤。VSFilter.dll是开发的字幕组件,有个视频输入口和不断智能扩展的字幕输入口,flvsplitter是flash播放的分离器,目前flash的视频解码也已经能下载到。realmediasplitter是real的分离器,但是real的视频解码和音频解码,还需要其他的dll文件。matroskasplitter是mkv文件的分离器,他的各个输出口都可以得到输出名称。audioswitcher是开源的音频切换的组件,输入口是自动增加的音频输入口,该组件同时含有音量增加的功能,但是效果不明显。

五.熟悉开发目录中的sample示例

在Dshow的开发目前中(C:/Program Files/DSSKD90/DirectShow/Samples/C++/DirectShow/Filters)也有很多有用的filter例子,比如经常使用的Async,这个例子可以开发出工作在拉模式的自定义的source filter,可以将其修改成连接网络的数据缓冲的filter,还有推模式的Ball等等filter,VMR9的例子中,比较有特色的,是VMR9Allocator,这个例子可以自定义分配3D表面,比如将输出视频表面行成球行并不断旋转等效果。

六.加入第三方filter

在开发中,会使用很多第三方开发的filter,在graphedt.exe中可以找到他们的GUID,所以在程序里使用这个filter,首先要定义#include <initguid.h>,然后DEFINE_GUID(CLSID_AC3FILTER,0xA753A1EC, 0x973E, 0x4718, 0xAF,  0x8E,0xA3, 0xF5, 0x54, 0xD4, 0x5C, 0x44);这样,在创建这个filter组件时,就可以使用CLSID_AC3FILTER来作为参数,传入创建函数CoCreateInstance中了。

DirectShow开发点滴相关推荐

  1. 若干物联网无线技术 - NB-IOT、LoRa、433、GPRS、2.4G、PKE近场通信,基础理论与开发点滴总结

    在项目实践学习中记录的点滴笔记,整理成章,希望能给大家提供工作与学习思路. 往期文章 1.无线通信项目开发 - NB-IOT.LoRa.433.GPRS.2.4G.PKE近场通信,基础理论与开发点滴总 ...

  2. 利用DirectShow开发C#版的MP3播放器(一)

    因工作需要,近期开始接触DirectShow开发的相关技术,由于本人较青睐于C#,因此从网上找了一些关于.NET版的DirectShow库及实例,之后参考相关源码编写了一个用于测试的MP3播放器,源码 ...

  3. 利用DirectShow开发C#版的音频文件播放器(三)

    前面曾经讲到了利用利用DirectShow开发C#版的MP3播放器,这篇文章是对前面两篇文章的补充与升华. 首先,大家不难发现,这篇文章的标题已经修改为音频文件播放器,而不仅仅是针对MP3一种格式,支 ...

  4. 利用DirectShow开发C#版的音频文件播放器(补充完善)

    继今年三月份利用DirectShow开发C#版的音频文件播放器(三)文章之后,一直希望对这个音频文件播放器所存在的一些问题做修改完善,可惜一直忙于工作而无暇顾及这个事情.近日,有读者朋友提到了这个问题 ...

  5. 蓝牙无线技术(BLE)介绍与开发点滴总结

    在项目实践学习中记录的点滴笔记,整理成章,希望能给大家提供工作与学习思路. 往期文章: 1.无线通信项目开发 - NB-IOT.LoRa.433.GPRS.2.4G.PKE近场通信,基础理论与开发点滴 ...

  6. WIFI无线技术介绍与开发点滴总结

    在项目实践学习中记录的点滴笔记,整理成章,希望能给大家提供工作与学习思路. 往期文章: 1.无线通信项目开发 - NB-IOT.LoRa.433.GPRS.2.4G.PKE近场通信,基础理论与开发点滴 ...

  7. DirectShow开发笔记与问题记录(2018.3.12更新)

    本博文主要记录本人在使用DirectShow框架,进行播放器.流媒体处理开发过程中遇到的问题以及解决的方法.一方面作为笔记,方便日后参考,另一方面也记录一些疑难杂症,供大家查询. 问题: 1.使用Qt ...

  8. 设置DirectShow开发的编译环境

    这个章节的内容主要是编写 DirectShow应用所需的一些基本概念,可以把它当作一个高级介绍,理解这些内容只需具备一般的编程和有关多媒体的知识.  2.1. 设置DirectShow开发的编译环境  ...

  9. SpriteKit游戏开发点滴[4] 适配屏幕的技巧

    适配屏幕的技巧 多屏幕分辨率可真是开发者的死对头啊!常言道:你若屏幕分辨多,我就自挂东南枝- 不过对于游戏开发而言,一旦理解了适配屏幕的原理,便可无敌于众多的屏幕分辨率了. 在开始游戏开发时,我们预设 ...

最新文章

  1. 微软职位内部推荐-Sr SDE for Win Apps Ecosystem
  2. 5月14日 游戏闯关,
  3. 如何设置、查看以及调试core文件
  4. android gradle + junit +jacoco +sonarscaner(sonarrunner) 获取单元测试覆盖率以及代码质量
  5. Cobertura和Sonar 5.1的问题
  6. java map 赋值_java Listmap赋值的问题
  7. secucrecrt配置文件导入和保存
  8. nedc和epa续航里程什么意思_电动汽车续航能力NEDC、EPA、WTLP什么意思?哪个最硬核?...
  9. (百万数据量级别)java下的mysql数据库插入越插越慢的问题解决
  10. 11.这就是搜索引擎:核心技术详解 --- 搜索引擎缓存机制
  11. html5 右侧客服代码,简洁右侧栏客服代码
  12. android app应用签名生成工具,Android APK生成证书并签名方法
  13. fafa什么意思_fafafafafa 什么意思
  14. 智慧城市同城V4 v2.2.5 [独立版全插件]同城 同城小程序 同城信息
  15. Idea中git进行回滚版本操作和查看修改记录
  16. python数据库-1
  17. 操作系统的概念、功能
  18. 单目ORB-SLAM流程梳理
  19. 一个简易版的spice VDI 云桌面 客户端 系统
  20. Vue/React项目的package.json文件scripts命令解析

热门文章

  1. 遍历HashMap中元素的三种方法
  2. 【Ceph】Ceph Client
  3. linux configure 的 --prefix 参数的作用
  4. matlab音乐键盘模拟,科学网—[原][Matlab][04] Midi音乐键盘 - 王楠的博文
  5. python文本分类算法_基于Naive Bayes算法的文本分类
  6. [emWin]利用内存设备加速GIF图片显示——2021.03
  7. 5G安全,5G防御,5G网络安全,5G信息安全
  8. 如何在服务里面删除应用(比如说删除掉服务里面的tomcat)?
  9. 通信工程项目管理如何控制成本
  10. 痞子衡嵌入式:IAR环境下无法直接下载调试i.MXRT分散链接工程的解决方案(宏文件.mac+双Flashloader)...