做音視頻編解碼的人都知道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 用同樣的方法把其它文件夾下面的所有文件重命名。