ffmpeg的log输出方式
这里log的输出方式主要分为2种:
1.在默认回调函数,从控制台直接输出
2.通过设置自定义回调函数,自定义输出的(可以写log文件等)
备注(默认是控制台输出的,它和设置回调函数自定义只能2选1),通过如下log.c文件代码可以理解:
static void (*av_log_callback)(void*, int, const char*, va_list) =
av_log_default_callback;
默认走的缺省回调函数, void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl) 就是做一些数据格式化,控制台颜色设置,控制台输出能等
一、默认回调函数av_log_default_callback
默认的log输出等级: static int av_log_level = AV_LOG_INFO;
通过函数av_log_set_level(AV_LOG_INFO)设置;
level 值: AV_LOG_QUIET、AV_LOG_PANIC、AV_LOG_FATAL、AV_LOG_ERROR、AV_LOG_WARNING、AV_LOG_INFO、AV_LOG_VERBOSE、AV_LOG_DEBUG、AV_LOG_TRACE
越设置后面的值,输出到控制台的log越详细,方便开发调试 例如设置为: AV_LOG_TRACE
下面这行代码是控制过滤重复日志,其中的flags是通过av_log_set_flags(AV_LOG_SKIP_REPEATED)函数设置的
if (print_prefix && (flags & AV_LOG_SKIP_REPEATED) && !strcmp(line, prev) &&
*line && line[strlen(line) - 1] != '\r'){
count++;
if (is_atty == 1)
fprintf(stderr, " Last message repeated %d times\r", count);
goto end;
}
二、自定义的回调函数
1.自定义的回调函数定义
代码如下:
void av_log_my_callback(void* ptr, int level, const char* fmt, va_list vl)
{
FILE *fp = fopen("my_log.txt", "a+"); //这里是自定义做的事情,可以写文件操作,写数据库等
if (fp) {
vfprintf(fp, fmt, vl);
fflush(fp);
fclose(fp);
}
}
通过 av_log_set_callback(av_log_my_callback),使用自定义的log输出方式。av_log()方法的日志,都会进入此回调函数。
总结
默认回调方式是受av_log_set_level 的等级控制的,自定义的方式则需要自己去做相应的处理。做个判断也行,如下这样:
if (level > av_log_level)
return;