DirectShow笔记

direct show记录


概览


多媒体的特点:
1、数据量很大,同时需要被很快的处理。
2、声音和视频必须被同步,一起开始一起结束,一样的速率。
3、数据来源可以有多种形式:本地文件、网络、电视广播、摄像头等
4、数据格式非常多。
5、开发者不可能提前知道用户的硬件设备。


DirectShow就是被设计用来解决这些问题。


名词


filters
对输入的多媒体流进行一些处理的软件模块,
例如,读取文件、从摄像头获取视频、解码多种流格式、传递数据给显卡、声卡。
实际应用中filter组成一个链,前面的filter输出的数据流入后面的filter,这个链就叫filter graph。数据像流水线一样经过多个filter依次处理。(可能是有分支的链)
filters可以大致分为以下几类:
1、source filter 用以引入数据
2、transform filter 用以处理数据,编码器或解码器属于此类
3、splitter filter 用以分割输入流为两个或多个输出,例如AVI Splitter把字节流分为视频流和音频流。
4、mux filter 用以把多个输入合并为一个流,例如AVI Mux会执行和AVI Splitter相反的操作,把音频和视频流合并成AVI格式的字节流。
所有的filter可用IBaseFilter接口表示


pins
filter的连接点称为pins,也是一种COM对象,可用IPin接口表示


Filter Graph Manager
管理器内部建立一个参考时钟协调filter状态使其协作,提供诸如Run、Stop这样的接口,但是也可以通过COM接口直接访问filter,管理器也传递消息事件到应用(类似于windows消息循环)。
Filter Graph Manager也提供操作filter graph的功能.


写一个应用:
一般有3个任务一定要做
1、创建Filter Graph Manager实例
2、建立filter graph
3、通过Filter Graph Manager实例提供的接口进行控制,应用响应它传递的消息事件


实际编程中。。
因为是COM组件,因此Filter Graph Manager可以理解为一个实现了很多interface的类,我们可能不知道这是个什么类,但是我们知道它实现了哪些接口,因此,要用某些功能时,把它转换为对应的接口类型。


IGraphBuilder就是Filter Graph Manager的一种接口形态,用来建立filter graph
IMediaControl也是一种接口形态,用来控制流,start,stop等
ImediaEvent用来了解Filter Graph Manager的内部状态


IGraphBuilder::RenderFile方法可以自动建立正确的filter graph,比较方便一般使用。
如果文件不存在或者格式不支持,该方法失败,否则,filter graph已经准备好播放了。


上面说了,流控制通过IMediaControl
IMediaControl::Run 启动
IMediaEvent::WaitForCompletion 阻塞当前线程直到视频播放完成,也可以设置超时时间


使用完释放就是通常的COM组件方式了
xxx->Release()


思考:
RenderFile是自动建立filter graph,因此,流程是固定的,如果我们有一些其它操作,比如渲染到其它地方去,可能得需要自己定义一些filter并组成filter graph.

猜你喜欢

转载自blog.csdn.net/yangxun983323204/article/details/79088646