FFmpeg av_log_set_callback函数使用

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

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

参考


     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/2053210,如需转载请自行联系原作者






相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7月前
|
SQL HIVE
数仓学习-----named_struct和collect_set函数
数仓学习-----named_struct和collect_set函数
153 5
|
2月前
|
PyTorch 算法框架/工具
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
本文介绍了PyTorch中的F.softmax()和F.log_softmax()函数的语法、参数和使用示例,解释了它们在进行归一化处理时的作用和区别。
494 1
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
|
1月前
|
Java Python
gc模块的set_threshold函数
gc模块的set_threshold函数
|
2月前
FFmpeg中结构释放小函数
本文介绍了FFmpeg中用于释放不同结构体内存的泛化变参模板函数CleanUp,以及如何特化该模板以释放AVFormatContext、AVCodecContext、AVPacket、AVFrame和uint8_t*类型的内存,并提供了一个测试文件来演示这些函数的使用。
27 3
|
4月前
|
监控 Serverless 开发者
函数计算发布功能问题之查看函数的调用日志的问题如何解决
函数计算发布功能问题之查看函数的调用日志的问题如何解决
|
5月前
|
存储 JSON 关系型数据库
mysql中find_in_set()函数用法详解及增强函数
总结而言,`FIND_IN_SET()`是MySQL中处理由逗号分隔的字符串列表的一种便捷方法,尤其适用于列表相对较短且不经常更改的场景。然而,对于更为复杂的需要高性能和可扩展性的数据库设计,它可能不是最优选择,应考虑使用更加正规化的数据库结构。
706 2
mysql中find_in_set()函数用法详解及增强函数
|
4月前
|
SQL JavaScript 前端开发
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
|
5月前
|
存储 编解码 容器
FFmpeg avformat_open_input() 函数返回错误protocol not found解决方法(实测有效!附简单FFMPEG的编解码流程)
我个人出现这个错误的时候是在打开文件时报的错误,开始以为我需要加上资源文件,那样QT确实能检测到文件的存在,但是在Debug中他是检测不到这个文件的。
558 1
|
5月前
|
存储 语音技术 Python
语音识别,函数综合案例,黑马ATM,/t/t一个对不齐,用两个/t,数据容器入门,数据容器可以分为列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
语音识别,函数综合案例,黑马ATM,/t/t一个对不齐,用两个/t,数据容器入门,数据容器可以分为列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
|
6月前
|
运维 Ubuntu Serverless
函数计算产品使用问题之函数没有产生任何日志输出,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
下一篇
DataWorks