Directshow - LAV Filter介绍

1        介绍

LAVFSplitter是使用ffmpeg库的DirectShow DemuxFilter,下面是开发者给出的介绍(http://forum.doom9.org/showthread.php?t=156191)。

LAVFSplitter is a multi-format media splitterthat uses libavformat (the demuxing library from ffmpeg) to demux all sorts ofmedia files. The project has been growing in my mind for quite a while, until ifound out that Ti-BEN from the XBMC DSPlayer team was working on this as well, sowe joined forces and developed the first prototype together. Since then sometime passed, and this is the third design that came out of our combinedefforts. It is already in use in the XBMC DSPlayer branch as the internalsplitter, and now available as a standalone for everyone!

2        编译

LAVFSplitter的源码可以在http://code.google.com/p/lavfilters/地址下载到。

2.1  环境需求

VS2010: LAVFSplitter是使用VS2010开发的,所以比较顺利的编译最好要安装VS2010

MinGW: 由于LAVFSplitter主要是使用ffmpeg来进行码流处理的,所以还要编译ffmpeg,在Windows在编译ffmpeg需要MinGW。关于MinGW是干什么的到网上百度一下就知道了。安装MinGW的时候要包含MSYS选项。

2.2   编译

源码的压缩包中包含build_ff_win32.sh和build_ff_x64.sh的两个脚本,依据自己的系统在命令行下运行即可。其中ffmpeg的源码在下载的源码中已经包含了。

如果你的系统之前安装过VS2008,而又编译过DirectShow的一些东西,那么再安装VS2010编译有可能出现一堆似乎不应该的错误。这个错误有可能是由于包含的头文件引起的,在网上找到了一个解决方案,如下:

==============================================================

从VS08把项目升级过来以后,第一火大的就是怎么也编译不过去,让人恼的是以为VS脑残了,连系统的头文件都认为语法错误吗?罪魁在这里:C:\WinDDK\6001.18001\inc\api\sal.h重复引用了一个头文件, 而且2份文件其实内容不一样(据说DDK的那份比较'过时')所以解决方法是 试试C:\Program Files\Microsoft Visual Studio 10.0\VC\include来取代C:\WinDDK\6001.18001\inc\api或者直接删掉C:\WinDDK\6001.18001\inc\api\sal.h.当然, 也有可能是编码错误(unicode ormulti-byte character), 或者是使用了stdcall,或其他的其他。

题外,VS2008和VS2010在UI上有一小小的不同,VS2010中Tools->Options->Projectand Solutions->VC++ Directories的对话框不见了,你可以在工程的Properties中找到相应的设置地方。

2.3  LAV Splitter浅析

由于只看了LAV Splitter代码,就简单的一下它的大体结构。LAVSplitter是一个DirectShow的Filter,在其组建中定义两个Filter,一个是LAV Splitter,一个是LAV SplitterSource,具体可以参看dllmain.cpp中g_Templates的定义。Splitter中实现了一个Producer和Consumer的模式,结构如图:

 

 

ThreadProce是CAMThread中的虚函数,CLAVSplitter和CLAVOutputPin都继承至CAMThread,并实现了ThreadProc。CLAVSplitter的Thread在Pause状态被启动,具体参见CLAVSplitter::Pause。CLAVOutPin的Thread在CLAVOutputPin::Active中被启动。

 


你可能感兴趣的:(技术相关)