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