ffmpeg与SDL日志回调方式对比

前言:一个好的库(对开发者友好),一定有一个好的日志系统,可以帮助developer快速的定位问题。

今天我们对比一下ffmpeg和SDL两个开源库开放的日志回调接口,看看各自的优缺点,对实现一个我们自己的lib也是有益的

多说无益,直接开始

接口一览表

ffmpegSDL
int av_log_get_level(void);extern DECLSPEC SDL_LogPriority SDLCALL SDL_LogGetPriority(int category);
void av_log_set_level(int level);extern DECLSPEC void SDLCALL SDL_LogSetPriority(int category,SDL_LogPriority priority);
extern DECLSPEC void SDLCALL SDL_LogSetAllPriority(SDL_LogPriority priority);
void av_log_set_callback(void (*callback)(void*, int, const char*, va_list));extern DECLSPEC void SDLCALL SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata);
extern DECLSPEC void SDLCALL SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata);
void av_log_default_callback(void *avcl, int level, const char *fmt,va_list vl);extern DECLSPEC void SDLCALL SDL_LogResetPriorities(void);
void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl,
                        char *line, int line_size, int *print_prefix);
 
int av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl,
                        char *line, int line_size, int *print_prefix);
 
void av_log_set_flags(int arg); 
int av_log_get_flags(void); 

红色部分是日志回调的基本接口,SDL get接口较为丰富

ffmpeg多了一些日志输出到文件的接口。之所以多了这些接口,是因为ffmpeg既可以作为库使用,也可以作为进程存在。SDL仅作为lib使用

日志等级/类别

ffmpegSDL
AV_LOG_QUIET   /*不输出日志*/SDL_LOG_PRIORITY_VERBOSE
AV_LOG_PANIC   /*不知道和FATAL的区别是什么*/SDL_LOG_PRIORITY_DEBUG
AV_LOG_FATALSDL_LOG_PRIORITY_INFO
AV_LOG_ERRORSDL_LOG_PRIORITY_WARN
AV_LOG_WARNINGSDL_LOG_PRIORITY_ERROR
AV_LOG_INFOSDL_LOG_PRIORITY_CRITICAL
AV_LOG_VERBOSESDL_NUM_LOG_PRIORITIES   /*ALL*/
AV_LOG_DEBUG 
AV_LOG_TRACE 
AV_LOG_MAX_OFFSET /*ALL*/ 

 

SDL支持针对不同的日志类别设置日志级别,SDL自己抽象出来

    SDL_LOG_CATEGORY_APPLICATION,
    SDL_LOG_CATEGORY_ERROR,
    SDL_LOG_CATEGORY_ASSERT,
    SDL_LOG_CATEGORY_SYSTEM,
    SDL_LOG_CATEGORY_AUDIO,
    SDL_LOG_CATEGORY_VIDEO,
    SDL_LOG_CATEGORY_RENDER,
    SDL_LOG_CATEGORY_INPUT,
    SDL_LOG_CATEGORY_TEST

这些日志的类别,并在记录日志时选择一类进行归类。简单总结就是最后这条日志是由两个条件决定是否会输出的,一个是日志的类别,一个是日志的优先级,两者同时作用后&条件生效

比如,可以设置VIDEO的info级别日志进行输出,但是AUDIO的info级别不输出。

回调的参数

ffmpeg不支持回调用户自定义的参数,默认是ffmpeg进行填充一个AVClass*的参数回调给上层。ffmpeg可以将format回调给上层应用,上层应用可以做过滤等操作

SDL允许用户自定义一个void *userdata,并且在回调的时候传给上层,SDL回调给上层的log只有char*格式,不支持上层用户直接根据format再加工

思考

  1. 作为一个lib时,一般不会有主动输出日志到terminal或者到文件的操作。因为被调用时,仅通过lib自己的操作日志不能很方便的反映出实际业务的流程,需要配合调用放自己的log进行分析。上层应用通过回调lib日志进行log存储
  2. 丰富lib API函数返回值,让上层应用直观通过返回值可以清楚的了解到错误的原因
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值