音视频学习入门技术文章连载:git
音视频连载系列已经停更一段时间,再这么停下去估计就要掉粉了,捡起来继续更新~~~github
接下来主要是讲解 FFmpeg 相关的内容,好比这篇就从简单的日志打印开始提及。微信
在 FFmpeg 中提供了 av_log() 方法去打印日志,它的函数声明以下:函数
void av_log(void *avcl, int level, const char *fmt, ...)
其中 level
参数指的是日志级别,后面的 fmt
和 ...
表明日志内容,和调用 print
打印信息同样。学习
具体使用以下:this
av_log(nullptr,AV_LOG_INFO,"this is INFO log color"); av_log(nullptr,AV_LOG_DEBUG,"this is DEBUG log color"); av_log(nullptr,AV_LOG_WARNING,"this is WARNING log color"); av_log(nullptr,AV_LOG_ERROR,"this is ERROR log color");
与 Android 日志相似,FFmpeg 也有多种级别的日志。spa
#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 #define AV_LOG_TRACE 56
看到 INFO
、DEBUG
、ERROR
这些级别是否是有似曾相识的感受。3d
这些数值都是 8 的倍数,按照从小到大的顺序递增。指针
在 FFmpeg 中能够设置和获取当前日志打印的级别。日志
// 设置日志打印级别 void av_log_set_level(int level); // 获取日志打印级别 int av_log_get_level(void);
好比设置了当前级别是 AV_LOG_INFO
,那么凡是级别低于它的都不会打印出来了。
那么什么级别算是更低的呢?数字越小的级别越高,数字越大的级别越低。
好比设置了 AV_LOG_INFO
级别,它的值是 32 ,那么 AV_LOG_DEBUG
级别的日志就不会打印,它的值是 48 ,级别更低。而 AV_LOG_ERROR
就会被打印,它的值是 16 ,级别更高。
在 FFmpeg 中能够经过 av_log_set_callback
函数来注册一个日志回调,在回调中自定义日志打印方式。
av_log_set_callback
的函数声明以下:
void av_log_set_callback(void (*callback)(void*, int level, const char* fmt, va_list));
它的参数是传一个函数指针,其中 level
指定了日志回调的级别,根据不一样级别作不一样操做,fmt
和 va_list
就是回调的日志内容了,和 print
函数类似。
如下就是具体的操做:
static void log_callback(void *ptr, int level, const char *fmt, va_list vaList) { switch (level) { case AV_LOG_DEBUG: logD(fmt, vaList); break; case AV_LOG_VERBOSE: logV(LOG_MAGENTA, fmt, vaList); break; case AV_LOG_INFO: logI(fmt, vaList); break; case AV_LOG_WARNING: logW(fmt, vaList); break; case AV_LOG_ERROR: logE(fmt, vaList); break; default: log(fmt, vaList); break; } }
在 switch
作日志级别的分发处理,具体的打印方法教给宏定义的函数。
在这里主要是根据不一样级别,调整日志打印输出的颜色,以下图所示:
注意的是,若是注册了自定义日志打印,那么除了咱们调用
av_log
方法会打印日志以外,FFmpeg 内部的一些日志信息也会经过自定义的方法打印出来。
通常来讲,日志打印都是经过宏函数来定义的。
#define logD(format,...) \ logging(LOG_GREEN,format,##__VA_ARGS__)
其中 ##__VA_ARGS__
意思就是可变参数宏,对应函数里面的三个点可变参数 ...
。
具体的函数实现以下:
static void logging(const char * color ,const char *fmt, va_list vaList) { // 设置日志打印颜色 printf("%s [av-beginner]: ",color); // 打印内容 vprintf( fmt, vaList ); // 结束日志颜色设定 printf(LOG_NONE "\n" ); } static void logging(const char * color ,const char *fmt, ...) { va_list vaList; va_start( vaList, fmt ); logging(color,fmt,vaList); va_end(vaList); }
这里面涉及到可变参数以及日志颜色打印的内容,展开说一下日志颜色打印。
在终端的字符颜色是由转义序列控制的,好比终端中要换行,那么转义序列就是 \n
操做,对于颜色控制一样如此。
具体的显示格式以下:
033[显示方式;前景色;背景色m输出字符串033[0m或
e[显示方式;前景色;背景色m输出字符串e[0m
在调用 print 函数打印信息时,就按照以上的方式便可,好比:
// 打印红色的日志内容 printf("\033[0;31m print red color log \033[0m\n") ;
以上就能够打印出红色的日志信息,具体的关于显示方式、前景色、背景色这些内容,后续的文章再接着说了。
以上就是音视频基础学习连载的 010 篇。
简单讲解了 FFmpeg 中的日志打印内容,本文具体代码见仓库:
https://github.com/glumes/av-...
仓库的代码会比文章提早更新,想要抢先知道后续内容,就关注代码吧,欢迎 star 。
能力有限,文中有不对之处,欢迎加我微信 ezglumes 进行交流~~