簡介
AVLog是FFmpeg的日誌輸出工具。在FFmpeg中所有的日誌輸出不是通過printf()函數而是通過av_log()函數。av_log()會最終調用fprintf(stderr,…)函數將日誌內容輸出到命令行界面上。但是在一些非命令行程序(MFC程序,Android程序等)中,av_log()調用的fprintf(stderr,…)就無法將日誌內容顯示出來了。對於這種情況,FFmpeg提供了日誌回調函數av_log_set_callback()。該函數可以指定一個自定義的日誌輸出函數,將日誌輸出到指定的位置。
下面的自定義函數FFmpegLogFunc()將日誌輸出到了“ffmpeglog.txt”文本中。
void FFmpegLogFunc(void ptr, int level, const char fmt, va_list vl) {
FILE *fp = fopen("FFmpegLog.txt", "a+");
if (fp) {
SYSTEMTIME sys;
GetLocalTime(&sys);
char szTime[128] = { 0 };
sprintf(szTime, "I:%4d-%02d-%02d %02d:%02d:%02d ms:%03d:", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds);
fwrite(szTime, strlen(szTime), 1, fp);
vfprintf(fp, fmt, vl);
fflush(fp);
fclose(fp);
}
}
av_log_set_callback(FFmpegLogFunc);
使用說明
av_log(NULL, AV_LOG_WARNING, "start to write oneline to test av_log\n");
日誌回調函數調整
1)選擇性的打印,代碼如下
void FFmpegLogFunc(void ptr, int level, const char fmt,va_list vl)
{
FILE *fp = fopen("ffmpeglog.txt","a+");
if(level > AV_LOG_ERROR) return;
if(fp)
{
vfprintf(fp,fmt,vl);
fflush(fp);
fclose(fp);
}
}
2)避免每次打開文件
void FFmpegLogFunc(void ptr, int level, const char fmt,va_list vl)
{
static FILE *fp = NULL;
if(NULL == fp)
{
fp = fopen("ffmpeglog.txt","a+");
}
if(fp)
{
vfprintf(fp,fmt,vl);
fflush(fp);
}
}
3)指定日誌輸出的等級
調用av_log_set_level(AV_LOG_DEBUG);
說明:比AV_LOG_DEBUG等級高的都不會輸入到文件
等級最高的的宏定義是#define AV_LOG_TRACE 56