个人对于Directshow的理解 回复otisyf

来源:互联网 发布:阿里云全球总部 编辑:程序博客网 时间:2024/04/28 21:14
jinlking:谢谢指教.
首先对于您说的:我的音频格式要有一个Source Filter ,如果Source出来的还不是PCM数据的话,还要有一个Codec filter进行解码???
但是按DirectShow开发指南中关于DirectX中如此介绍:filter中的Source Filter负责获取数据,Transform Filter负责数据格式转换(包含编码/解码),Rending Filter负责数据最后去向!
1)那你说的要加入的Codec filter可以放在Transform Filter中处理吗?而且不能通过在filter提供的原始中的Source Filter中加入对文件的过滤吗?
2)filter提供的原始中的Source Filter过滤的文件必须是标准格式的或者PCM数据吗?我的原始文件为压缩文件.

回复 otisyf
首先一般PC上面有两种类型的AudioRender,一个是基于DSound另外一个是基于AudioWave,他们支持的并不只是PCM数据,但是这两个Render支持的格式肯定有限,并且一般都是一些未压缩的格式。
如果Source出来的不是它所支持的格式,就肯定要写一个Codec Filter,CodecFilter就是Transform Filter啊,我的理解只有OutputPin就是Source,有进有出的就可以理解成Transform Filter(包含Codec Filter) ,有进无出的就是Render Filter,Codec Filter我把它理解成负责格式解码的Transform filter.

Codec Filter有很多,基本上每种格式都要有对应的Codec,如Mp3 ogg flac ape wav等等,有些你的系统已经有了,那么你的播放器通过智能连接就可以播放对应格式的文件,但是,如果没有这种Codec或者注册有问题,那么Graph找不到对应的Codec Filter就不能播放。

原始的Source Filter,你的意思是不是系统已经有的并且注册过的Source filter,原始的Source Filter一般的操作系统上面就有好几个,对于几种不同的文件存储方式,一般文件是采用RIFF进行存储的,这样应该能够用原始的Source Filter(个人猜测),我也不知道系统自带的Source Filter能否支持你的格式,没有深究过。

而且不能通过在filter提供的原始中的Source Filter中加入对文件的过滤吗?这个问题我看的不是很懂,因为Source FIlter都是要注册的,注册之后的Source Filter就可以与某种或者某类文件相关联(如果是网络文件,就与某种网络协议相关连),打开一个文件的时候,自动的通过协议、后缀名或者数据匹配找到对应的Source filter,这样就实现了你所说的文件过滤。“文件过滤”我是这样理解的。

2、单纯的PMC数据一般不能播放的,因为缺少文件头,只有数据,render是不会知道采样率、声道等音频播放的必要信息,一般媒体文件都是一块一块的组成的(chunk),每一个chunk都是由四个字符FOUCC标准,这四个字符是一个标准组织维护的(但并不是所有文件都依据这个标准),根据这四个字符你就知道,我的这一块存的是什么东东,是文件头  还是数据,是音频文件头 或者视频文件头,或者是一副图片(Mp3中的封面)、或者是一串字符(Mp3 ID3中的歌词),甚至还可以是自定义的一些东东,Source Filter就是负责解析文件的。但是解析出来的并不是Render可以播放的,还要通过对应的解码方法进行解码才能播放,对应的解码就是Codec FIlter,也就是Transform Filter


初学DShow,有问题大家可以相互交流一下。