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

多媒體開發(8):調試FFmpeg

run 包括 啟用 return tar.bz2 %d 參考 efi turn

編譯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出二進制庫就好了。

成功編譯後,可以看這幾個文件:
技術分享圖片

(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來簡單調試的演示視頻:

技術分享圖片

需要留意,帶_g的是帶有調試信息的程序,那是調試需要的。

(3)用xcode來調試FFmpeg

顯然,使用gdb來調試,對於閱讀代碼或操作都不算太直觀,這時,讀者可以考慮用xcode來調試FFmpeg。

小程這裏不介紹每個配置環節了,因為,讀者可以參考以下這一篇圖文並茂的文章,按步操作就可以了:
http://www.jianshu.com/p/226c19aa6e42

至此,已經介紹完怎麽調試FFmpeg。


總結一下,本文介紹了如何在macos上調試FFmpeg的源碼,包括使用gdb或xcode來調試的辦法,同時也介紹了如何編譯帶有調試信息的FFmpeg。


技術分享圖片

多媒體開發(8):調試FFmpeg