天天看點

【音視訊連載-010】第二季 FFmpeg 日志列印日志列印基礎使用日志列印級别設定自定義日志列印自定義日志列印顔色總結

作者:星隕

來源:

音視訊開發進階

日志列印基礎使用

在 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 系列文章
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
【音視訊連載-010】第二季 FFmpeg 日志列印日志列印基礎使用日志列印級别設定自定義日志列印自定義日志列印顔色總結

繼續閱讀