librtmp 日誌的修改和操作

最近在做libRtmp(也就是rtmpdump)的工作,發現librtmp默認的日誌是關閉的。出現錯誤了也沒法去查找原因。進過一番摸索,終於找了好的解決辦法。

首先,找到rtmp控制日誌的地方:log.h 和log.c。 在log.h的文件中的35行左右,找到:


/* Enable this to get full debugging output */
/*#define _DEBUG */
註釋掉下面一句就可以輸出了。理論上是這樣,編譯之後運行,發現了一個問題: 在rmtp.c的文件中,提示有些找不到。。

#ifdef _DEBUG
extern FILE *netstackdump;
extern FILE *netstackdump_read;
#endif 
這兩個找不到。。。所以,註釋掉這些內容,同時需要註釋掉rtmp.c文件中相關的代碼。 編譯之後終於能運行了。

但是宋小寶發話了:日誌在哪兒呢?怎麼沒有輸出呢?扒拉鍋外頭去了?給我一個完美的解釋!

下面就是解釋:

查看log.h,發現有這些個函數的申明:

typedef void (RTMP_LogCallback)(int level, const char *fmt, va_list);
void RTMP_LogSetCallback(RTMP_LogCallback *cb);
void RTMP_LogSetOutput(FILE *file);
#ifdef __GNUC__
void RTMP_LogPrintf(const char *format, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
void RTMP_LogStatus(const char *format, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
void RTMP_Log(int level, const char *format, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
#else
void RTMP_LogPrintf(const char *format, ...);
void RTMP_LogStatus(const char *format, ...);
void RTMP_Log(int level, const char *format, ...);
#endif
void RTMP_LogHex(int level, const uint8_t *data, unsigned long len);
void RTMP_LogHexString(int level, const uint8_t *data, unsigned long len);
void RTMP_LogSetLevel(RTMP_LogLevel lvl);
RTMP_LogLevel RTMP_LogGetLevel(void); 

void RTMP_LogSetCallback(RTMP_LogCallback *cb); void RTMP_LogSetOutput(FILE *file); 這兩個方法可以看出:可以設置回調,或者日誌輸出文件。


這就簡單了。舉例 用回調的方法接受日誌:


在想接受日誌的地方申明一個這樣的函數:


void 方法名(int level, const char *fmt, va_list); 
然後調用RTMP_LogSetCallback(方法名); 然後再實現一下申明的方法體,就可以輸出日誌了。


但是,輸出來的怎麼只有Error級別的日誌??這怎麼夠呢!!


查到log.c文件中,有對日誌輸出級別的控制(35行左右):


RTMP_LogLevel RTMP_debuglevel = RTMP_LOGERROR; 
這裏就控制輸出Error級別的日誌。我們可以修改爲其他的值,值的定義在log.h中:


typedef enum
{ RTMP_LOGCRIT=0, RTMP_LOGERROR, RTMP_LOGWARNING, RTMP_LOGINFO,
RTMP_LOGDEBUG, RTMP_LOGDEBUG2, RTMP_LOGALL
} RTMP_LogLevel; 
可以改爲RTMP_LOGALL。也就是輸出全部日誌。這樣對我們的調試有很大的幫助。


對於android,想要在回調方法中輸出正確的值,單純的用LOG_(fmt, va-list)是不行的,輸出來在logcat中看,將會是亂碼。解決方法就是在輸出之前,用vsprintf格式化一下。


void logCallback(int logLevel, const char* msg,va_list args)
{
char log[1024];
vsprintf(log, msg, args);
Log("%s", log);
} 
這樣的話,輸出來就不是亂碼了。


From:  http://www.th7.cn/Program/Android/201607/901613.shtml 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章