做音视频编解码的人都知道ffmpeg。然而,要想在windows上调试ffmpeg却不是一件容易的事情。之前也曾经把x264的代码移植到vs2008上面,具体可以参见我前面的文章。最近终于把ffmpeg的最新代码完全移植到vs2008环境中来。在移植过程中深深的感觉到codec的多样性,我虽然在codec领域工作了很多年,但是ffmpeg里面大多数codec甚至连名字都没有见过。下面把移植过程中需要注意的问题描述一下。
首先,必须要有坚强的毅力和决心。ffmpeg代码量超级大,其总共有3千多个文件,将近100w行代码。移植ffmpeg是一项体力很繁重的活,所以,如果你决定要做,就不要中途放弃。
其次,也是最重要的,就是要掌握方法。ffmpeg代码采用C99的语法,使得微软VS开发环境的不兼容导致产生大量的语法错误。其次,ffmpeg有些采用的linux下面的库也会使得windows上没法编译的问题。如何快速的修改c99语法成为移植ffmpeg的关键!
工欲善其事,必先利其器。通过正则表达式的强大功能,可以一定程度上解决这一问题。对于精通正则表达式的朋友们,完全可以用某种编程语言,例如python,perl等写若干个脚本语言,就可以很轻松的修改c99的语法为标准的c89的语法。这样只需要3,4天的时间完成这项任务。
而我花了将近2个礼拜的时间,其中调试bug花了3天。主要是对于正则表达式不是很在行,只是了解一些正则表达式的写法。也没有用某种编程语言来操作正则表达式的编程经验。我使用的正则表达式工具就是常见的文本编辑器UE。
1. 下载最新的ffmpeg源代码。
我是在github上下载的代码ffmpeg-master。当我把代码跑起来之后发现crash了,调试之后发现ffmpeg-master的版本在初始化的时候有几个bug导致的,对于不熟悉音视频编解码的朋友很难修改这些bug。后来我又下载的稳定的ffmpeg1.2的版本,一比较,发现有三分之一的文件不一样。大概看了下,不一样的地方大部分都不是很关键。我不知道ffmpeg-master的版本是介于1.1和1.2之间的还是高于1.2没有发布的版本,也许ffmpeg1.2的版本没有这些bug。但我已经在master版本中修改的差不多了,所以也没有必要在1.2的版本上重新改。建议大家下载稳定的ffmpeg1.2的版本。
2. 文件重命名。
ffmpeg不同的文件夹下面有很多的文件名都是相同的,这在vs2008开发环境下会是个问题。所以,干脆把所以的文件名都重命名,例如可以都以某个文件夹的前缀。文件太多,不可能一个一个的改。以文件夹libavcodec下面的所有文件为例说明如下:
2.1 打开dos窗口,切换到libavcodec目录下面执行DOS命令:
dir *.c /b >>c_files.txt
2.2 UE打开c_files.txt,使用正则表达式执行替换操作,具体看下图:
在查找什么方框里面输入的正则表达式为:(?m)(^[\w.]+)
在替换为方框里面输入的正则表达式为:rename $1 av_codec_$1
选中正则表达式 perl选项 不用勾选 只匹配整个词语和匹配大小写选项
执行全部替换,保存文件。
2.3 把文件c_files.txt文件后缀改成批处理文件,即c_files.bat。运行这个批处理文件,这样libavcodec文件夹下面的所 有的文件都变成以av_codec_打头的文件了。
2.4 用同样的方法把其它文件夹下面的所有文件重命名。