本文分析一下FFmpeg的日志(Log)输出系统的源代码。日志输出部分的核心函数只有一个:av_log()
函数调用结构图
FFmpeg日志输出系统的函数调用结构图。

av_log()
av_log()是FFmpeg中输出日志的函数。随便打开一个FFmpeg的源代码文件,就会发现其中遍布着av_log()函数。一般情况下FFmpeg类库的源代码中是不允许使用printf()这种的函数的,所有的输出一律使用av_log()。
av_log()的头文件:libavutil\log.h
void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);
这个函数的声明有两个地方比较特殊:
(1)函数最后一个参数是“…”。
在C语言中,在函数参数数量不确定的情况下使用“…”来代表参数。printf()的原型定义如下:
int printf (const char*, ...);
(2)声明后面有一个av_printf_format(3, 4)。网上资料说它的作用是按照printf()的格式检查av_log()的格式。
av_log()每个字段的含义如下:
avcl:指定一个包含AVClass的结构体。
level:log的级别
fmt:和printf()一样。
由此可见,av_log()和printf()的不同主要在于前面多了两个参数。其中第一个参数指定该log所属的结构体,例如AVFormatContext、AVCodecContext等等。第二个参数指定log的级别,源代码中定义了如下几个级别。
#define AV_LOG_QUIET -8
#define

本文深入分析了FFmpeg的日志输出系统,核心函数av_log()的功能、参数及其实现机制。av_log()用于统一日志输出,避免使用printf(),并支持多种日志级别。其内部使用va_list处理可变参数,通过av_vlog()传递日志信息。日志级别包括AV_LOG_PANIC到AV_LOG_DEBUG,可通过av_log_set_level()和av_log_get_level()设置和获取当前级别。
最低0.47元/天 解锁文章
1897

被折叠的 条评论
为什么被折叠?



