GStreamer基礎教程11——除錯工具
目標
有時我們的應用並沒有按照我們的預期來工作,並且在總線上獲得的錯誤資訊也沒有足夠的內容。這時我們該怎麼辦呢?幸運的時,GStreamer自身提供了大量的除錯資訊,通常這些資訊會給出一些線索,指向出錯的地方。本教程主要講述:
如何在GStreamer裡面獲得更多地除錯資訊
如何把你自己的除錯資訊加入GStreamer的除錯記錄
如何獲得圖形化的pipeline
列印除錯資訊
除錯記錄
GStreamer和外掛裡面都有大量的除錯資訊,也就是說,在除錯區域內可以給出所有的資訊,包括時間戳,執行緒,種類,原始檔名,函式名等等等等
除錯輸出的控制實在一個GST_DEBUG的環境變數控制的,這裡給出一個例子,GST_DEBUG=2:
0:00:00.868050000 1592 09F62420 WARN filesrc gstfilesrc.c:1044:gst_file_src_start:<filesrc0> error: No such file "non-existing-file.webm"
正如你所看到的,這些資訊有點過於多了。事實上,GStreamer的除錯日誌實在太冗餘了,如果統統開啟的話,很快就會讓這個日誌檔案變成以M為單位的檔案。這會讓應用的執行速度降下來,所以,記錄會被分類,你很少需要開啟所有的種類。
第一個分類是除錯等級,這個可以指定輸出內容的等級:
為了允許除錯內容輸出,把GST_DEBUG的環境變數設定到需要的層級。所有該層級以下的資訊都會顯示。(比如,設GST_DEBUG=2,那麼可以看到ERROR和WARNING資訊)。
而且,每一個外掛或者部分的GStreamer可以定義自己的種類,所以你可以對每個不同的種類指定各自的層級。例如,GST_DEBUG=2,audiotestsrc:5,會對audiotestsrc使用第5級除錯等級,其餘的使用第2級。
這樣GST_DEBUG變數就是一個由逗號來分割的一系列“種類:層級”對了,除了在開始時給出一個預設等級值。
'*'萬用字元也是可以使用的。例如,GST_DEBUG=2,audio*:5就是說明除了所有audio開頭的種類用第5級之外,其餘的都是用第2級。
使用gst-launch-0.10 --gst-debug-help來獲得所有註冊的種類。記住每個外掛都註冊自己的種類,所以,當安裝或者刪除一個外掛時,這個列表會變化。
當GStreamer總線上傳上來的錯誤資訊已經不夠讓你定位分析問題的時候,使用GST_DEBUG這個變數。常見的做法是把輸出重定向到一個除錯日誌裡面去,這樣可以晚一點來檢視。
除錯輸出的每一行的內容應該是:
0:00:00.868050000 1592 09F62420 WARN filesrc gstfilesrc.c:1044:gst_file_src_start:<filesrc0> error: No such file "non-existing-file.webm"
0:00:00.868050000 | 時間戳,HH:MM:SS:sssssssss,記錄自從應用開始之後的時間 |
1592 | 程序ID |
09F62420 | 執行緒ID |
WARN | 除錯資訊等級 |
filesrc | 除錯資訊種類 |
gstfilesrc.c:10444 | 檔名,行號 |
gst_file_src_start | 函式名 |
<filesrc0> | 發出訊息的物件名 |
error:No such file "non-existing-file.webm" | 錯誤訊息內容 |
加入你自己的除錯資訊
在你和GStreamer互動的那部分程式碼裡面,使用GStreamer除錯工具是很有意思的。在這種方法下,你會在同一個檔案得到所有除錯輸出並且當時不同訊息之間的聯絡也會保留下來。
為了做到這一點,請使用GST_ERROR(),GST_WARNING(),GST_INFO(),GST_LOG()和GST_DEBUG()巨集。它們就像printf一樣可以接受一些引數並且它們是使用預設種類的。
為了切換到某個更加有意義的種類,在你的程式碼之前增加這樣兩行:
GST_DEBUG_CATEGORY_STATIC (my_category);
#define GST_CAT_DEFAULT my_category
然後再用gst_init()初始化GStreamer之後加上:
GST_DEBUG_CATEGORY_INIT (my_category, "my category", 0, "This is my very own");
這會註冊一個新的種類(這是在你的應用中,並不在任何檔案裡面),並把該種類設定成預設的。具體請查閱文件的GST_DEBUG_CATEGORY_INIT()內容。
獲得pipeline影象
在那些pipeline變得很龐大連線關係已經看不清的例子中,GStreamer可以輸出描述pipeline拓撲結構以及每個連線的Caps的協商的影象,這個檔案是.dot檔案,用GraphViz之類的免費軟體就可以看了。
在複合element情況下,比如playbin2或者uridecodebin之類,這方法也很方便。.dot檔案也可以把這些元素內部的情形繪製出來。
為了得到.dat檔案,需要把GST_DEBUG_DUMP_DOT_DIR環境變數設定成你需要輸出內容的資料夾。gst-launch會在每次狀態變化時建立一個.dot檔案,這樣你可以看見Caps協商的演變。清楚這個環境變數就可以關閉這項功能。在你的應用裡面,你可以使用GST_DEBUG_BIN_TO_DOT_FILE()和GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()巨集來在你方便的時候獲得.dot檔案。
這裡你有一個用playbin2建立的pipeline的例子。因為playbin2可以處理各種各樣的情形,所以它的內部十分複雜。你的手動建立的pipeline一般不會這麼複雜。下面是playbin2的拓撲圖: