librtmp 日志的修改和操作

来源:互联网 发布:网络电视直播软件 最新 编辑:程序博客网 时间:2024/06/03 09:19
最近在做libRtmp(也就是rtmpdump)的工作,发现librtmp默认的日志是关闭的。出现错误了也没法去查找原因。进过一番摸索,终于找了好的解决办法。

首先,找到rtmp控制日志的地方:log.h 和log.c。 在log.h的文件中的35行左右,找到:/* Enable this to get full debugging output *//*#define _DEBUG */注释掉下面一句就可以输出了。理论上是这样,编译之后运行,发现了一个问题: 在rmtp.c的文件中,提示有些找不到。。

#ifdef _DEBUGextern 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)));#elsevoid RTMP_LogPrintf(const char *format, ...);void RTMP_LogStatus(const char *format, ...);void RTMP_Log(int level, const char *format, ...);#endifvoid 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 
0 0
原创粉丝点击