最近在做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