FFmpeg av_log_set_callback函數使用

簡介
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

參考
http://www.bkjia.com/ASPjc/1034665.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章