文档章节

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

拉风的道长
 拉风的道长
发布于 2016/07/07 17:41
字数 671
阅读 148
收藏 0

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

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

 

希望对你有帮助。

© 著作权归作者所有

共有 人打赏支持
拉风的道长
粉丝 54
博文 110
码字总数 55629
作品 0
昌平
程序员
私信 提问
Android四大组件之Service

相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了。Service作为Android四大组件之一,在每一个应用程序中都扮演着非...

的书法上的
2014/05/26
0
0
Android Fragment完全解析,关于碎片你所需知道的一切

我们都知道,Android上的界面展示都是通过Activity实现的,Activity实在是太常用了,我相信大家都已经非常熟悉了,这里就不再赘述。 但是Activity也有它的局限性,同样的界面在手机上显示可能...

球球
2013/05/31
0
0
Android单元测试与日志输出

使用单元测试可以保证我们开发的应用质量, 一般我们开发完业务层后对业务层进行测试,确保业务层不会出现bug,对业务层通过之后控制层就可以调用业务层 完成所需的功能。 以前做Java开发的时...

晨曦之光
2012/05/16
395
0
android adb实用命令小结

adb的全称为Android Debug Bridge.是android司机经常用到的工具.但是问题是那么多命令写代码已经够费劲了,过段时间在次使用时压根记不住呀.本次的大餐就是为此开篇的.这一次我们不记命令.要用...

天王盖地虎626
2018/12/17
0
0
Android程序调试方法介绍

静态调试 适用于:通过打印变量的值来查看某一时刻值是否正确 Toast(Snackbar)打印法 一般的Android开发人员最爱的调试法,使用简便,仅需一行代码,轻松打印:~~~Toast.makeText(MainAct...

北辰丨丶
02/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于360插件化Replugin Activity动态修改父类的字节码操作

近期在接入360插件化方案Replugin时,发现出现崩溃情况。 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find class "x.x.x.xActivity" on path: 我自己在插件代码......

Gemini-Lin
34分钟前
0
0
mybatis缓存的装饰器模式

一般在开发生产中,对于新需求的实现,我们一般会有两种方式来处理,一种是直接修改已有组件的代码,另一种是使用继承方式。第一种显然会破坏已有组件的稳定性。第二种,会导致大量子类的出现...

算法之名
昨天
15
0
单元测试

右键方法 Go To --> Test,简便快速生成测试方法。 相关注解 @RunWith(SpringRunner.class) 表示要在测试环境中跑,底层实现是 jUnit测试工具。 @SpringBootTest 表示启动整个 Spring工程 @A...

imbiao
昨天
4
0
欧拉公式

欧拉公式表达式 欧拉公式的几何意 cosθ + j sinθ 是个复数,实数部分也就是实部为 cosθ ,虚数部分也就是虚部为 j sinθ ,对应复平面单位圆上的一个点。 根据欧拉公式和这个点可以用 复指...

sharelocked
昨天
5
0
burpsuite无法抓取https数据包

1.将浏览器和burpsuite的代理都设置好 2.在浏览器地址栏输入: http://burp 3.下载下面的证书,并将证书导入浏览器 cacert.der

Frost729
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部