FFmpeg的打印日志实现在FFmpeg-n4.2.1/libavutil/log.c中。
日志默认级别是AV_LOG_INFO
static int av_log_level = AV_LOG_INFO;
使用av_log_set_level将日志级别设置为调试级别(AV_LOG_DEBUG)
av_log_set_level(AV_LOG_DEBUG);
源码:
void av_log_set_level(int level){
av_log_level = level;
}
#define AV_LOG_QUIET -8 保持沉默,不输出
#define AV_LOG_PANIC 0 确实出了问题,即将崩溃。
#define AV_LOG_FATAL 8 有些地方出了问题,并且不可能修复
#define AV_LOG_ERROR 16 有些地方出了问题,不能毫无损失地恢复。
#define AV_LOG_WARNING 24 有些东西看起来不太对,有可能出问题
#define AV_LOG_INFO 32 标准信息。
#define AV_LOG_VERBOSE 40 详细的信息。
#define AV_LOG_DEBUG 48 调试信息,只对libav*开发者有用的东西。
#define AV_LOG_TRACE 56 非常冗长的调试信息,对libav*开发非常有用。
例如下面的打印信息:
[mpegts @ 0x7f92cc002f00] Format mpegts probed with size=2048 and score=50
这个信息由下面的函数打印:
av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
av_log 调用 av_vlog:
void av_log(void* avcl, int level, const char *fmt, ...){
va_list vl;
va_start(vl, fmt);
av_vlog(avcl, level, fmt, vl);
va_end(vl);
}
av_vlog则调用默认注册的回调函数av_log_default_callback
void av_vlog(void* avcl, int level, const char *fmt, va_list vl){
void (*log_callback)(void*, int, const char*, va_list) = av_log_callback;
if (log_callback)
log_callback(avcl, level, fmt, vl);
}
static void (*av_log_callback)(void*, int, const char*, va_list)
= av_log_default_callback;
av_log_default_callback函数伪代码
void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl){
if (level > av_log_level) return; "控制打印级别"
format_line(...); "格式化输出"
colored_fputs(...);"设置终端字体颜色:\033[字背景颜色;字体颜色m字符串\033[0m"
}
彩色打印方法参见博客【linux】printf在终端打印彩色hello world