作者:星隕
來源:
音視訊開發進階日志列印基礎使用
在 FFmpeg 中提供了 av_log() 方法去列印日志,它的函數聲明如下:
void av_log(void *avcl, int level, const char *fmt, ...)
其中
level
參數指的是日志級别,後面的
fmt
和
...
代表日志内容,和調用
print
列印資訊一樣。
具體使用如下:
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 也有多種級别的日志。
#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
這些級别是不是有似曾相識的感覺。
這些數值都是 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-beginner倉庫的代碼會比文章提前更新,想要搶先知道後續内容,就關注代碼吧,歡迎 star 。
能力有限,文中有不對之處,歡迎加我微信 ezglumes 進行交流~~
FFmpeg 系列文章「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。