【音視頻連載-010】第二季 FFmpeg 日誌打印

音視頻學習入門技術文章連載: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

看到 INFODEBUGERROR 這些級別是否是有似曾相識的感受。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 指定了日誌回調的級別,根據不一樣級別作不一樣操做,fmtva_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 進行交流~~

相關文章
相關標籤/搜索