1. 程式人生 > 實用技巧 >FFMPEG Tips (1) 如何列印日誌

FFMPEG Tips (1) 如何列印日誌

由於如今的工作比以前忙了,已經有好些日子沒有分享技術博文了,還是得繼續堅持下去。鑑於如今視訊直播如此火爆,那就選個主題,聊聊播放器、聊聊 FFMPEG 那些事吧。

FFMPEG 是個好東西,可以說目前市面上的任何一款“通用型”播放器,都離不開 FFMPEG,因為沒有什麼其他的庫比它支援的格式更加全面了。

www.imdb.com/list/ls083025452/
www.imdb.com/list/ls083025452/?ref_=otl_a
m.imdb.com/list/ls083025452/
www.imdb.com/list/ls083025452/?ref_=otl_k0
www.imdb.com/list/ls083025452/?ref_=otl_4

www.imdb.com/list/ls083025452/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025452/?quima=k0
www.imdb.com/list/ls083025452/?mode=desktop
www.imdb.com/list/ls083025473/
www.imdb.com/list/ls083025473/?ref_=otl_i
m.imdb.com/list/ls083025473/
www.imdb.com/list/ls083025473/?ref_=otl_2a
www.imdb.com/list/ls083025473/?ref_=otl_4
www.imdb.com/list/ls083025473/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025473/?uogwe=2a
www.imdb.com/list/ls083025473/?mode=desktop
www.imdb.com/list/ls083025478/
www.imdb.com/list/ls083025478/?ref_=otl_1
m.imdb.com/list/ls083025478/
www.imdb.com/list/ls083025478/?ref_=otl_95
www.imdb.com/list/ls083025478/?ref_=otl_1
www.imdb.com/list/ls083025478/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025478/?xvvxv=95
www.imdb.com/list/ls083025478/?mode=desktop
www.imdb.com/list/ls083025412/
www.imdb.com/list/ls083025412/?ref_=otl_9
m.imdb.com/list/ls083025412/
www.imdb.com/list/ls083025412/?ref_=otl_33
www.imdb.com/list/ls083025412/?ref_=otl_3
www.imdb.com/list/ls083025412/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025412/?tnthp=33
www.imdb.com/list/ls083025412/?mode=desktop
www.imdb.com/list/ls083025433/
www.imdb.com/list/ls083025433/?ref_=otl_r
m.imdb.com/list/ls083025433/
www.imdb.com/list/ls083025433/?ref_=otl_FF
www.imdb.com/list/ls083025433/?ref_=otl_3
www.imdb.com/list/ls083025433/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025433/?jxhjt=FF
www.imdb.com/list/ls083025433/?mode=desktop
www.imdb.com/list/ls083025463/
www.imdb.com/list/ls083025463/?ref_=otl_K
m.imdb.com/list/ls083025463/
www.imdb.com/list/ls083025463/?ref_=otl_Y4
www.imdb.com/list/ls083025463/?ref_=otl_6
www.imdb.com/list/ls083025463/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025463/?ywkeq=Y4
www.imdb.com/list/ls083025463/?mode=desktop
www.imdb.com/list/ls083025423/
www.imdb.com/list/ls083025423/?ref_=otl_s
m.imdb.com/list/ls083025423/
www.imdb.com/list/ls083025423/?ref_=otl_6W
www.imdb.com/list/ls083025423/?ref_=otl_2
www.imdb.com/list/ls083025423/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025423/?qigsy=6W
www.imdb.com/list/ls083025423/?mode=desktop
www.imdb.com/list/ls083025490/
www.imdb.com/list/ls083025490/?ref_=otl_3
m.imdb.com/list/ls083025490/
www.imdb.com/list/ls083025490/?ref_=otl_17
www.imdb.com/list/ls083025490/?ref_=otl_3
www.imdb.com/list/ls083025490/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025490/?jxrvf=17
www.imdb.com/list/ls083025490/?mode=desktop
www.imdb.com/list/ls083025493/
www.imdb.com/list/ls083025493/?ref_=otl_Q
m.imdb.com/list/ls083025493/
www.imdb.com/list/ls083025493/?ref_=otl_0w
www.imdb.com/list/ls083025493/?ref_=otl_2
www.imdb.com/list/ls083025493/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025493/?qwuka=0w
www.imdb.com/list/ls083025493/?mode=desktop
www.imdb.com/list/ls083025480/
www.imdb.com/list/ls083025480/?ref_=otl_X
m.imdb.com/list/ls083025480/
www.imdb.com/list/ls083025480/?ref_=otl_XZ
www.imdb.com/list/ls083025480/?ref_=otl_3
www.imdb.com/list/ls083025480/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025480/?jxbbn=XZ
www.imdb.com/list/ls083025480/?mode=desktop
www.imdb.com/list/ls083025483/
www.imdb.com/list/ls083025483/?ref_=otl_G
m.imdb.com/list/ls083025483/
www.imdb.com/list/ls083025483/?ref_=otl_6a
www.imdb.com/list/ls083025483/?ref_=otl_0
www.imdb.com/list/ls083025483/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025483/?mgmyi=6a
www.imdb.com/list/ls083025483/?mode=desktop
www.imdb.com/list/ls083025906/
www.imdb.com/list/ls083025906/?ref_=otl_I
m.imdb.com/list/ls083025906/
www.imdb.com/list/ls083025906/?ref_=otl_82
www.imdb.com/list/ls083025906/?ref_=otl_0
www.imdb.com/list/ls083025906/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025906/?gayiy=82
www.imdb.com/list/ls083025906/?mode=desktop
www.imdb.com/list/ls083025909/
www.imdb.com/list/ls083025909/?ref_=otl_6
m.imdb.com/list/ls083025909/
www.imdb.com/list/ls083025909/?ref_=otl_22
www.imdb.com/list/ls083025909/?ref_=otl_0
www.imdb.com/list/ls083025909/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025909/?ikcuq=22
www.imdb.com/list/ls083025909/?mode=desktop
www.imdb.com/list/ls083025958/
www.imdb.com/list/ls083025958/?ref_=otl_4
m.imdb.com/list/ls083025958/
www.imdb.com/list/ls083025958/?ref_=otl_cW
www.imdb.com/list/ls083025958/?ref_=otl_4
www.imdb.com/list/ls083025958/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025958/?mggms=cW
www.imdb.com/list/ls083025958/?mode=desktop
www.imdb.com/list/ls083025977/
www.imdb.com/list/ls083025977/?ref_=otl_j
m.imdb.com/list/ls083025977/
www.imdb.com/list/ls083025977/?ref_=otl_Jh
www.imdb.com/list/ls083025977/?ref_=otl_3
www.imdb.com/list/ls083025977/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025977/?drzpl=Jh
www.imdb.com/list/ls083025977/?mode=desktop
www.imdb.com/list/ls083025918/
www.imdb.com/list/ls083025918/?ref_=otl_R
m.imdb.com/list/ls083025918/
www.imdb.com/list/ls083025918/?ref_=otl_dx
www.imdb.com/list/ls083025918/?ref_=otl_7
www.imdb.com/list/ls083025918/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025918/?nrdtx=dx
www.imdb.com/list/ls083025918/?mode=desktop
www.imdb.com/list/ls083025933/
www.imdb.com/list/ls083025933/?ref_=otl_d
m.imdb.com/list/ls083025933/
www.imdb.com/list/ls083025933/?ref_=otl_93
www.imdb.com/list/ls083025933/?ref_=otl_9
www.imdb.com/list/ls083025933/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025933/?hxnph=93
www.imdb.com/list/ls083025933/?mode=desktop
www.imdb.com/list/ls083025965/
www.imdb.com/list/ls083025965/?ref_=otl_i
m.imdb.com/list/ls083025965/
www.imdb.com/list/ls083025965/?ref_=otl_e0
www.imdb.com/list/ls083025965/?ref_=otl_0
www.imdb.com/list/ls083025965/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025965/?yuwmu=e0
www.imdb.com/list/ls083025965/?mode=desktop
www.imdb.com/list/ls083025963/
www.imdb.com/list/ls083025963/?ref_=otl_j
m.imdb.com/list/ls083025963/
www.imdb.com/list/ls083025963/?ref_=otl_XP
www.imdb.com/list/ls083025963/?ref_=otl_3
www.imdb.com/list/ls083025963/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025963/?fxtlh=XP
www.imdb.com/list/ls083025963/?mode=desktop
www.imdb.com/list/ls083025921/
www.imdb.com/list/ls083025921/?ref_=otl_N
m.imdb.com/list/ls083025921/
www.imdb.com/list/ls083025921/?ref_=otl_Jt
www.imdb.com/list/ls083025921/?ref_=otl_9
www.imdb.com/list/ls083025921/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025921/?jpttj=Jt
www.imdb.com/list/ls083025921/?mode=desktop
www.imdb.com/list/ls083025922/
www.imdb.com/list/ls083025922/?ref_=otl_F
m.imdb.com/list/ls083025922/
www.imdb.com/list/ls083025922/?ref_=otl_DR
www.imdb.com/list/ls083025922/?ref_=otl_9
www.imdb.com/list/ls083025922/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025922/?ljnpv=DR
www.imdb.com/list/ls083025922/?mode=desktop
www.imdb.com/list/ls083025995/
www.imdb.com/list/ls083025995/?ref_=otl_0
m.imdb.com/list/ls083025995/
www.imdb.com/list/ls083025995/?ref_=otl_k0
www.imdb.com/list/ls083025995/?ref_=otl_8
www.imdb.com/list/ls083025995/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025995/?eewgc=k0
www.imdb.com/list/ls083025995/?mode=desktop
www.imdb.com/list/ls083025996/
www.imdb.com/list/ls083025996/?ref_=otl_b
m.imdb.com/list/ls083025996/
www.imdb.com/list/ls083025996/?ref_=otl_J1
www.imdb.com/list/ls083025996/?ref_=otl_9
www.imdb.com/list/ls083025996/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025996/?nbxdz=J1
www.imdb.com/list/ls083025996/?mode=desktop
www.imdb.com/list/ls083025984/
www.imdb.com/list/ls083025984/?ref_=otl_8
m.imdb.com/list/ls083025984/
www.imdb.com/list/ls083025984/?ref_=otl_iS
www.imdb.com/list/ls083025984/?ref_=otl_0
www.imdb.com/list/ls083025984/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025984/?susic=iS
www.imdb.com/list/ls083025984/?mode=desktop
www.imdb.com/list/ls083025800/
www.imdb.com/list/ls083025800/?ref_=otl_4
m.imdb.com/list/ls083025800/
www.imdb.com/list/ls083025800/?ref_=otl_Qc
www.imdb.com/list/ls083025800/?ref_=otl_4
www.imdb.com/list/ls083025800/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025800/?uisuy=Qc
www.imdb.com/list/ls083025800/?mode=desktop
www.imdb.com/list/ls083025852/
www.imdb.com/list/ls083025852/?ref_=otl_d
m.imdb.com/list/ls083025852/
www.imdb.com/list/ls083025852/?ref_=otl_7N
www.imdb.com/list/ls083025852/?ref_=otl_3
www.imdb.com/list/ls083025852/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025852/?zdjdx=7N
www.imdb.com/list/ls083025852/?mode=desktop
www.imdb.com/list/ls083025858/
www.imdb.com/list/ls083025858/?ref_=otl_1
m.imdb.com/list/ls083025858/
www.imdb.com/list/ls083025858/?ref_=otl_Px
www.imdb.com/list/ls083025858/?ref_=otl_1
www.imdb.com/list/ls083025858/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025858/?pvnhr=Px
www.imdb.com/list/ls083025858/?mode=desktop
www.imdb.com/list/ls083025813/
www.imdb.com/list/ls083025813/?ref_=otl_4
m.imdb.com/list/ls083025813/
www.imdb.com/list/ls083025813/?ref_=otl_IU
www.imdb.com/list/ls083025813/?ref_=otl_8
www.imdb.com/list/ls083025813/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025813/?kecam=IU
www.imdb.com/list/ls083025813/?mode=desktop
www.imdb.com/list/ls083025819/
www.imdb.com/list/ls083025819/?ref_=otl_F
m.imdb.com/list/ls083025819/
www.imdb.com/list/ls083025819/?ref_=otl_xd
www.imdb.com/list/ls083025819/?ref_=otl_9
www.imdb.com/list/ls083025819/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025819/?nnbvj=xd
www.imdb.com/list/ls083025819/?mode=desktop
www.imdb.com/list/ls083025838/
www.imdb.com/list/ls083025838/?ref_=otl_t
m.imdb.com/list/ls083025838/
www.imdb.com/list/ls083025838/?ref_=otl_R9
www.imdb.com/list/ls083025838/?ref_=otl_1
www.imdb.com/list/ls083025838/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025838/?npbdl=R9
www.imdb.com/list/ls083025838/?mode=desktop
www.imdb.com/list/ls083025863/
www.imdb.com/list/ls083025863/?ref_=otl_Y
m.imdb.com/list/ls083025863/
www.imdb.com/list/ls083025863/?ref_=otl_Au
www.imdb.com/list/ls083025863/?ref_=otl_4
www.imdb.com/list/ls083025863/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025863/?wiuiw=Au
www.imdb.com/list/ls083025863/?mode=desktop
www.imdb.com/list/ls083025822/
www.imdb.com/list/ls083025822/?ref_=otl_4
m.imdb.com/list/ls083025822/
www.imdb.com/list/ls083025822/?ref_=otl_0w
www.imdb.com/list/ls083025822/?ref_=otl_2
www.imdb.com/list/ls083025822/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025822/?quoys=0w
www.imdb.com/list/ls083025822/?mode=desktop
www.imdb.com/list/ls083025828/
www.imdb.com/list/ls083025828/?ref_=otl_3
m.imdb.com/list/ls083025828/
www.imdb.com/list/ls083025828/?ref_=otl_73
www.imdb.com/list/ls083025828/?ref_=otl_7
www.imdb.com/list/ls083025828/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025828/?vnjrn=73
www.imdb.com/list/ls083025828/?mode=desktop
www.imdb.com/list/ls083025890/
www.imdb.com/list/ls083025890/?ref_=otl_m
m.imdb.com/list/ls083025890/
www.imdb.com/list/ls083025890/?ref_=otl_2Q
www.imdb.com/list/ls083025890/?ref_=otl_8
www.imdb.com/list/ls083025890/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025890/?uccsq=2Q
www.imdb.com/list/ls083025890/?mode=desktop
www.imdb.com/list/ls083025892/
www.imdb.com/list/ls083025892/?ref_=otl_8
m.imdb.com/list/ls083025892/
www.imdb.com/list/ls083025892/?ref_=otl_E4
www.imdb.com/list/ls083025892/?ref_=otl_4
www.imdb.com/list/ls083025892/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083025892/?ymkge=E4
www.imdb.com/list/ls083025892/?mode=desktop
www.imdb.com/list/ls083027001/
www.imdb.com/list/ls083027001/?ref_=otl_U
m.imdb.com/list/ls083027001/
www.imdb.com/list/ls083027001/?ref_=otl_C4
www.imdb.com/list/ls083027001/?ref_=otl_6
www.imdb.com/list/ls083027001/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083027001/?sgmqm=C4
www.imdb.com/list/ls083027001/?mode=desktop
www.imdb.com/list/ls083027006/
www.imdb.com/list/ls083027006/?ref_=otl_X
m.imdb.com/list/ls083027006/
www.imdb.com/list/ls083027006/?ref_=otl_7F
www.imdb.com/list/ls083027006/?ref_=otl_5
www.imdb.com/list/ls083027006/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083027006/?jltnb=7F
www.imdb.com/list/ls083027006/?mode=desktop
www.imdb.com/list/ls083027058/
www.imdb.com/list/ls083027058/?ref_=otl_C
m.imdb.com/list/ls083027058/
www.imdb.com/list/ls083027058/?ref_=otl_0g
www.imdb.com/list/ls083027058/?ref_=otl_0
www.imdb.com/list/ls083027058/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083027058/?wcigu=0g
www.imdb.com/list/ls083027058/?mode=desktop
www.imdb.com/list/ls083027077/
www.imdb.com/list/ls083027077/?ref_=otl_6
m.imdb.com/list/ls083027077/
www.imdb.com/list/ls083027077/?ref_=otl_cC
www.imdb.com/list/ls083027077/?ref_=otl_2
www.imdb.com/list/ls083027077/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083027077/?mkosc=cC
www.imdb.com/list/ls083027077/?mode=desktop
www.imdb.com/list/ls083027072/
www.imdb.com/list/ls083027072/?ref_=otl_Y
m.imdb.com/list/ls083027072/
www.imdb.com/list/ls083027072/?ref_=otl_86
www.imdb.com/list/ls083027072/?ref_=otl_2
www.imdb.com/list/ls083027072/?mode=desktop&ref_=m_ft_dsk
www.imdb.com/list/ls083027072/?oogwo=86
www.imdb.com/list/ls083027072/?mode=desktop

我要寫的主題,與雷神不同,我會測重介紹使用 FFMPEG 開發播放器過程中的一些比較基礎的小經驗或者說開發筆記,因此,使用 Tips 這個單詞,意味小技巧、小帖士,因此,本系列的目標讀者是 FFMPEG 的入門者,也歡迎路過的高手們能對分享的內容給出寶貴的建議和意見。

本文則從開發和除錯程式最重要的一點:打 LOG 說起,看看基於 FFMPEG 開發,如何列印 LOG,如何設定日誌的級別。

1. FFMPEG 列印日誌的函式

FFMPEG 有一套自己的日誌系統,它使用 av_log() 函式來列印日誌,其宣告位於:<libavutil/log.h>

它的函式原型如下:

/**
 * Send the specified message to the log if the level is less than or equal
 * to the current av_log_level. By default, all logging messages are sent to
 * stderr. This behavior can be altered by setting a different logging callback
 * function.
 * @see av_log_set_callback
 *
 * @param avcl A pointer to an arbitrary struct of which the first field is a
 *        pointer to an AVClass struct.
 * @param level The importance level of the message expressed using a @ref
 *        lavu_log_constants "Logging Constant".
 * @param fmt The format string (printf-compatible) that specifies how
 *        subsequent arguments are converted to output.
 */
void av_log(void *avcl, int level, const char *fmt, …);

引數含義:

avcl:指定一個包含 AVClass 的結構體,指定該 log 所屬的結構體,如 AVFormatContext、AVCodecContext 等等,可以設定為 NULL

level:log 的級別,下面給出可選的值

fmt:跟 c 語言的 printf() 定義一樣

2. FFMPEG 日誌級別

LOG 的級別是一個 int 型別,其可選的數值及其含義如下:

/**
 * Print no output.
 */
#define AV_LOG_QUIET    -8

/**
 * Something went really wrong and we will crash now.
 */
#define AV_LOG_PANIC     0

/**
 * Something went wrong and recovery is not possible.
 * For example, no header was found for a format which depends
 * on headers or an illegal combination of parameters is used.
 */
#define AV_LOG_FATAL     8

/**
 * Something went wrong and cannot losslessly be recovered.
 * However, not all future data is affected.
 */
#define AV_LOG_ERROR    16

/**
 * Something somehow does not look correct. This may or may not
 * lead to problems. An example would be the use of '-vstrict -2'.
 */
#define AV_LOG_WARNING  24

/**
 * Standard information.
 */
#define AV_LOG_INFO     32

/**
 * Detailed information.
 */
#define AV_LOG_VERBOSE  40

/**
 * Stuff which is only useful for libav* developers.
 */
#define AV_LOG_DEBUG    48

3. FFMPEG 設定和獲取當前日誌級別

由一個全域性的變數來控制哪個級別及以上的日誌會列印輸出,設定和獲取這個全域性變數的函式如下:

/**
 * Get the current log level
 *
 * @see lavu_log_constants
 *
 * @return Current log level
 */
int av_log_get_level(void);

/**
 * Set the log level
 *
 * @see lavu_log_constants
 *
 * @param level Logging level
 */
void av_log_set_level(int level);

例如,當全域性的日誌級別設定為 `AV_LOG_ERROR`,那麼凡是日誌級別高於 `AV_LOG_ERROR` 的日誌,都不會被打印出來。

4. FFMPEG 日誌列印函式的使用示例

假設要列印 DEBUG 和 ERROR 級別的日誌,用法示例如下:

av_log(NULL, AV_LOG_DEBUG, "Hello World ! \n");
av_log(NULL, AV_LOG_ERROR, "Error:%d ! \n", errorCode);

5. FFMPEG 日誌列印函式的封裝

當然,如果你覺得 av_log 用起來不是很順手,你可以定義個巨集封裝下,例如:

#ifndef _SYS_LOG_
#define _SYS_LOG_

#include <libavutil/log.h>

#define LOGD(format, ...) av_log(NULL, AV_LOG_DEBUG, format, ##__VA_ARGS__);
#define LOGV(format, ...) av_log(NULL, AV_LOG_VERBOSE, format, ##__VA_ARGS__);
#define LOGI(format, ...) av_log(NULL, AV_LOG_INFO, format, ##__VA_ARGS__);
#define LOGW(format, ...) av_log(NULL, AV_LOG_WARNING, format, ##__VA_ARGS__);
#define LOGE(format, ...) av_log(NULL, AV_LOG_ERROR, format, ##__VA_ARGS__);

#endif

6. Android 中列印 FFMPEG 的日誌

由於 FFMPEG 預設使用的是 printf 來列印日誌,而 Android 系統有著一套自己的 LOG 系統,因此,需要讓 FFMPEG 的日誌重定向使用 Android 的日誌系統,具體方法描述如下:

通過 FFMPEG 的 av_log_set_callback() 註冊一個 LOG callback function,FFMPEG 就會把 LOG 列印功能重定向到 callback function 中,程式碼示例如下(你也可以到我的 Github 檢視封裝好的原始碼: https://github.com/Jhuster/clib):

#ifdef __ANDROID_API__
#include <android/log.h>

#define ALOG(level, TAG, ...)    ((void)__android_log_vprint(level, TAG, __VA_ARGS__))

#define SYS_LOG_TAG "nmplayer"

static void syslog_print(void *ptr, int level, const char *fmt, va_list vl)
{
    switch(level) {
    case AV_LOG_DEBUG:
        ALOG(ANDROID_LOG_VERBOSE, SYS_LOG_TAG, fmt, vl);
        break;
    case AV_LOG_VERBOSE:
        ALOG(ANDROID_LOG_DEBUG, SYS_LOG_TAG, fmt, vl);
        break;
    case AV_LOG_INFO:
        ALOG(ANDROID_LOG_INFO, SYS_LOG_TAG, fmt, vl);
        break;
    case AV_LOG_WARNING:
        ALOG(ANDROID_LOG_WARN, SYS_LOG_TAG, fmt, vl);
        break;
    case AV_LOG_ERROR:
        ALOG(ANDROID_LOG_ERROR, SYS_LOG_TAG, fmt, vl);
        break;
    }
}

static void syslog_init()
{
    av_log_set_callback(syslog_print);
}

#endif // __ANDROID_API__

在程式碼初始化的地方呼叫一下 syslog_init() 後,就可以使用 av_log() 在 Android 平臺輸出除錯日誌了。

7. FFPlay 設定日誌級別

平時自己寫的播放器播放某些流播放有問題的話,也可以使用 ffplay 來對比除錯一下,看看使用 ffplay 是否可以播放,報錯資訊是什麼,ffplay 開啟 DEBUG 日誌輸出的方法示例如下:

$ ffplay -v debug $URL

-v 引數是用於配製 ffplay 的日誌級別,其定義如下:

-loglevel [repeat+]loglevel | -v [repeat+]loglevel

Set the logging level used by the library. Adding "repeat+" indicates that repeated log output should not be compressed to the first line and the "Last message repeated n times" line will be omitted. "repeat" can also be used alone. If "repeat" is used alone, and with no prior loglevel set, the default loglevel will be used. If multiple loglevel parameters are given, using ’repeat’ will not change the loglevel. loglevel is a string or a number containing one of the following values:

‘quiet, -8’
Show nothing at all; be silent.

‘panic, 0’
Only show fatal errors which could lead the process to crash, such as an assertion failure. This is not currently used for anything.

‘fatal, 8’
Only show fatal errors. These are errors after which the process absolutely cannot continue.

‘error, 16’
Show all errors, including ones which can be recovered from.

‘warning, 24’
Show all warnings and errors. Any message related to possibly incorrect or unexpected events will be shown.

‘info, 32’
Show informative messages during processing. This is in addition to warnings and errors. This is the default value.

‘verbose, 40’
Same as info, except more verbose.

‘debug, 48’
Show everything, including debugging information.

‘trace, 56’
By default the program logs to stderr. If coloring is supported by the terminal, colors are used to mark errors and warnings. Log coloring can be disabled setting the environment variable AV_LOG_FORCE_NOCOLOR or NO_COLOR, or can be forced setting the environment variable AV_LOG_FORCE_COLOR. The use of the environment variable NO_COLOR is deprecated and will be dropped in a future FFmpeg version.