因为最近想做个用于项目测试的视频解码器,所以才尝试对ffdshow做一些了解,但是初次接触这个功能强大的解码器,从安装到构建成功第一个FilterGraph,我用了一个星期的时间!这期间遇到过很多的问题,也浪费了我相当多的时间。为了让更多的朋友少走弯路,我把这个从安装到构建的过程大致记录下来,供你们参考。
一、下载、编译、安装
首先,下载ffdshow的源码。通过ffdshow的项目主页(http://ffdshow-tryout.sourceforge.net/)找到源码的SVN地址:https://ffdshow-tryout.svn.sourceforge.net/svnroot/ffdshow-tryout,下载一份最新的源码。我机器上下载的速度还是可以的,一共10多M的源码,我看会资料的时间就完成了,具体时间我倒没有计算,不过速度大概有20K以上。不过,我看到网上看到很多朋友编译源码的时候出现问题,而且我刚开始编译的时候也是一样,为了这部分朋友着想,如果您实在在编译上花了太多功夫了,那么您可以跳过这一步,直接下载网站上的安装包进行安装。但是这样的话就得不到一些头文件,一些能够通过代码进行的比较高级的设置您就无法进行了。但是,这并不影响我们构建FilterGraph的初级目标。
源码下载完成后,就要开始艰难地编译旅程了。我最开始的时候用的是VC6.0 SP6, 但是发现编译过程中源码中竟然需要包含高版本Studio SDK中的头文件,正好我的电脑上有VC2005 Express,所以就搬出来试验了,不过结果还是行不通,因为我没装Platform SDK :(,最后我决定下载VC2003,因为我参考的一篇文章(http://www.yesure.com/storm/print.php?articleid=15)中就是以2003为例介绍编译的。同时,我也建议您看一下这篇文章。
还有一件同样非常重要的事情,ffdshow的编译除了C++源文件外,还有汇编源文件,所以,你的机器上需要安装一个汇编编译器。nasm是官方使用的编译器,可以从(http://sourceforge.net/projects/nasm/)下载。同样,nasm也是一个非常棒的开源软件。下载nasm后,解压出的文件中有一个nasm.exe,如果想偷懒的话可以把它直接复制到系统目录中去(比如C:\windows)。如果您比较勤快的话,也可以把nasm的路径放到系统的PATH环境变量中。最后,请把nasm.exe改名为nasmw.exe。
接下来,我就以VC2003为工具,介绍整个编译的过程。
下载下来的源码中,根文件夹有个ffdshow.dsp工程文件,不过,编译完这个工程文件并不意味着万事大吉,因为在它的子目录中,还有几个工程是需要编译的!当然,这几个额外需要编译的工程在我上面提到的那篇文章里是讲到的,只不过是在它的最后,而我在编译完ffdshow.dsp之后,就只顾兴奋而全然不管那篇文章的后半段了,因此,这也是我把这个注意事项写到真正开始编译之前的原因,希望那些同样容易被喜悦冲晕头脑的家伙不要错过这几个关键的工程。
先把这几个同样需要编译的工程文件列出来:
D:\ffdshow\src\ffmpeg\libavcodec.vcproj
D:\ffdshow\src\mplayer\libmplayer_dll.vcproj
D:\ffdshow\src\codecs\x264\ff_x264.vcproj
D:\ffdshow\src\codecs\libmpeg2\libmpeg2_ff.vcproj
(注:应该是由于版本演进的原因,我所参考的那篇文章中列的几个工程文件和我新下的代码已经不太对应了,同样发生改变的还有版本管理库,我参考的文章中所使用的还是CVS,而现在ffdshow项目已经使用SVN了)
在编译ffdshow之前,请确认您安装了directx SDK(即DXSDK),可以在MSDN下载最新的版本(http://msdn.microsoft.com/en-us/directx/aa937788.aspx),当然,没有必要非得使用最新版本,9.0以上的版本应该都可以(不过我没试过,我安装的是9.0c)。下载并安装DXSDK后,还需要将该SDK中的BaseClasses工程进行编译,我想看这篇文章的朋友应该不对会此感到陌生,我也就不详细介绍了。最后别忘了将DXSDK的Include、Lib目录和BaseClass的源文件目录、生成Lib文件目录加入到VC2003的搜索路径中,同样,做为一个DirectShow开发者,您肯定已经完成这一步了。如果您在这一步上有问题,请参考DirectShow的相关资料。
先来编译ffdshow.dsp工程文件,其实这个文件编译通过后,另外几个工程应该就不会有障碍了。用VC2003打开ffdshow.dsp,会发现有几个编译配置:Debug、Release,我们就直接选择Release吧,除非你想对ffdshow进行调试。
![几个编译配置](https://i-blog.csdnimg.cn/blog_migrate/34afed95b9f0955cbb8a02ff19f25d2d.jpeg)
现在,在解决方案上点击右键,执行“生成解决方案”。编译过程中如果上报找不到nasmw.exe,请检查是否将它放到了系统目录中,或是将它所在的路径添加到了Path变量。还有一个错误,也是发生在nasmw身上,不过是我在使用VC2005的时候遇到的,就是上报nasmw.exe找不到输入文件。当时这个问题困扰了我相当长时间,最后从网上终于搜索到了一篇文章,其中讲到了解决办法,不过很不幸,那篇文章的链接我找不到了:(。不过,错误的原因我是记得的,就是VC2005在转换VC6的dsp工程文件时,有一个错误,如果您也遇到了这个问题,请打开VC2005转换后生成的sln文件,在其中执行nasmw,会发现这个命令行中的输出文件路径中,加了很多的双引号(在项目文件中显示为"),可以试着把这些多余的双引号去掉,再编译一次试试,如果它对应的asm文件这次编译通过了,就说明是这个问题,您就可以通过“搜索”+“替换”的方式将工程中的相应地方都进行更改了,不过千成别忘了,双引号要写成",而不是直接画个引号上去,否则在打开解决方案的时候会出错的:)
![生成解决方案](https://i-blog.csdnimg.cn/blog_migrate/4a9ce97d7ffc54ad7245bf30d67ca23a.jpeg)
说来也怪,在完成上面的步骤后,我在机器上编译的过程就一帆风顺,除了一堆警告,没有任何error,这让我史料未及。
![编译完成](https://i-blog.csdnimg.cn/blog_migrate/7d6b15c5423f1e51585cbd853159c72a.jpeg)
别忘了另外几个工程,用同样的步骤,把它们也编译完成。
话说回来,网上看到的那么多朋友在编译过程中出现了问题,虽然我没有遇到,但是我觉得大部分应该都是环境的问题,就像我刚开始用VC6和VC2005一样。如果您还没能通过编译这个过程,而且又不想直接拿安装包来用,只能请您仔细查检一下您的机器环境,实在不行也换成VC2003来试一下,虽然它不及VC6经典,也没有2005强大,但至少编译没有出错。
好了,编译通过了,下面该到安装了。可以看到在工程根文件夹下的bin目录中,现在已经生成了一堆dll和一个ffdshow.ax文件,我最初直接用 regsvr32 ffdshow.ax 来注册控件,虽然可以注册成功而且在graphedit中也可以看到ffdshow相关的filter,但是都是不可用的,原因就是ffdshow还需要一堆注册表信息来支持运行,这就是为什么我们需要来制做安装包了。
制作安装包的过程其实很简单,ffdshow是通过NSIS来打包的,NSIS可以通过(http://nsis.sourceforge.net/Main_Page)来下载。下载并安装后,可以到ffdshow的bin\distrib目录中,直接双击ffdshow.nsi来执行打包过程,不过也可以通过运行该目录下的ffdshow-core.bat或ffdshow-core-dec.bat来执行打包,这两个bat文件有什么区别我还不太清楚。打包完成后,在我的机器上会生成ffdshow-core-20051216.exe安装文件,接下来就可以执行这个文件来安装ffdshow的组件了。
如果您已经顺利完成了这些,那么恭喜您已经具备了开发ffdshow应用程序的一切了!现在就让我们一起开始构建第一个FilterGraph吧!不过,今天写了不少了,构建的过程,留给下一篇吧:)