1. 程式人生 > >多媒體開發(8):除錯FFmpeg

多媒體開發(8):除錯FFmpeg

編譯FFmpeg得到二進位制檔案,之後就是對二進位制庫的呼叫,這時FFmpeg就像一個黑盒子。作為程式設計師,難道不想研究一下FFmpeg的具體實現?比如是怎麼拿到歌曲資訊的、怎麼解碼的、怎麼推流的,等等。 看原始碼是理解程式碼實現的一個辦法,而單步除錯能從另一個維度去幫到你。**本文介紹如何單步除錯FFmpeg的程式碼。** ### (一)為什麼要除錯 除錯的好處,一來可以理解程式的執行流程,二來有助於定位問題。 相對於看原始碼,單步除錯,可以看到資料的變化,會深刻很多,而且定位問題時也直觀快速,你甚至可以修改變數的值或下條件斷點,充分發揮偵錯程式的功能。 所以除錯是理解程式碼與定位問題的有效辦法。 ### (二)怎麼除錯 小程用的是mac機。先完成FFmpeg原始碼下載與編譯的準備工作。 #### (0)下載FFmpeg原始碼 git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg 或者: curl -0 http://ffmpeg.org/releases/ffmpeg-\${VERSION}.tar.bz2 tar jxvf ffmpeg-\${VERSION}.tar.bz2 VERSION設定為最新的ffmpeg版本號。 至於用什麼工具來開啟這些原始碼檔案,你應該考慮適合自己,而且適合看大型專案的工具,比如sourceinsight、sublime、vim、emacs、xcode、Android Studio之類。 #### (1)編譯FFmpeg 編譯要使用到編譯器,在mac機上最簡單的辦法就是安裝xcode了,這樣保證編譯器clang是存在的。 為了除錯,這次的編譯可以很簡單,只要把優化選項去掉,再make即可: make clean ./configure --disable-optimizations make configure是FFmpeg提供的配置指令碼,用來生成Makefile跟config.h檔案,Makefile在編譯時使用,而config.h(裡面各種巨集的定義)被FFmpeg原始碼使用,也會影響到FFmpeg的功能裁剪。 對於configure的引數,你也可以通過./configure --help來檢視所有的選項,然後再找到關於優化的選項。 這裡的make clean,是為了清一下之前的編譯汙染,如果之前沒有編譯過,那就不需要執行。 另外,如果make之後,再執行make install,就會把FFmpeg安裝到mac系統。對於除錯來說這個是不必要的,只要make出二進位制庫就好了。 成功編譯後,可以看這幾個檔案: ![FFmpeg帶除錯資訊的程式](https://free-picture1.oss-cn-shenzhen.aliyuncs.com/%E5%A4%9A%E5%AA%92%E4%BD%93%E5%BC%80%E5%8F%91/ffmpeg%E5%BA%94%E7%94%A8-%E8%B0%83%E8%AF%95ffmpeg/ffmpeg%E7%BC%96%E8%AF%91%E7%BB%93%E6%9E%9C.png) #### (2)用gdb除錯FFmpeg 如果你喜歡用命令列,那使用gdb或lldb來進行除錯是不錯的選擇。 在使用gdb前,需要安裝並給gdb簽名,如果你還沒有準備好gdb,並且有興趣使用gdb的話,可以閱讀分割線以內的內容,這裡面也包括了gdb常用的命令。 --- 安裝gdb: > brew install homebrew/dupes/gdb 對gdb授權,參照: https://blog.csdn.net/cairo123/article/details/52054280 寫一個測試的例子: touch gdbtest.c: int main() { int a = 10; printf("%d\n"); } 編譯: > gcc -o gdbtest gdbtest.c -g 注意須帶-g,以生成符號dSYM檔案。 然後就可以除錯了,常用命令有這些: gdb gdbtest --載入可執行程式 r --run,執行,可以帶引數 i b --info break,斷點資訊 b 3 --break 3,第3行下斷點 b main --main函式第一行下斷點 b other_c:fun1 --檔案other_c的fun1函式第一行下斷點 b 120 --在120行下斷點 clear --刪除所有斷點 d 3 --delete 3,刪除斷點3 disable 1 --禁用斷點1 enable 1 --啟用斷點1 s --step,跳進去 f --finish,跳出來 n --next,執行一行 n 3 --next 3,執行3行 c --continue,繼續直至下一個斷點或結束 p a --print a,輸出變數a的值 list/l --檢視程式碼 q/kill --退出本次除錯 bt --檢視呼叫堆疊 return --把當前函式return --- 為了便利,我直接用FFmpeg的程式來切入除錯(當然也可以寫自己的程式碼來呼叫FFmpeg),比如可以選擇ffplay_g這個程式來切入,除錯它所依賴的基礎即FFmpeg。 除錯ffplay_g需要輸入引數,在gdb ffplay_g後,r "xxx/file.mp3"即可,表示用ffplay_g來播放這個檔案。 以下是我使用gdb來簡單除錯的演示視訊: ![gdb除錯FFmpeg](https://free-picture1.oss-cn-shenzhen.aliyuncs.com/%E5%A4%9A%E5%AA%92%E4%BD%93%E5%BC%80%E5%8F%91/ffmpeg%E5%BA%94%E7%94%A8-%E8%B0%83%E8%AF%95ffmpeg/debug_ffmpeg.gif) 需要留意,帶_g的是帶有除錯資訊的程式,那是除錯需要的。 #### (3)用xcode來除錯FFmpeg 顯然,使用gdb來除錯,對於閱讀程式碼或操作都不算太直觀,這時,你可以考慮用xcode來除錯FFmpeg。 這裡不介紹每個配置環節了,因為,你可以參考以下這一篇圖文並茂的文章,按步操作就可以了: http://www.jianshu.com/p/226c19aa6e42 至此,已經介紹完怎麼除錯FFmpeg。 **總結一下,本文介紹瞭如何在macos上除錯FFmpeg的原始碼,包括使用gdb或xcode來除錯的辦法,同時也介紹瞭如何編譯帶有除錯資訊的FFmpeg。有緣再見,see you.** --- ![動動腦,不會老](https://free-picture1.oss-cn-shenzhen.aliyuncs.com/%E5%A4%9A%E5%AA%92%E4%BD%93%E5%BC%80%E5%8F%91/ffmpeg%E5%BA%94%E7%94%A8-%E8%B0%83%E8%AF%95ffmpeg/%E9%80%BB87_%E5%8F%91%E5%B8%