librtmp 日志的修改和操作 给android打印

原创
2016/07/07 17:41
阅读数 943

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

这样的话,输出来就不是乱码了。

 

希望对你有帮助。

展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部