FFmpeg的Android打印

来源:互联网 发布:xampp ubuntu安装 编辑:程序博客网 时间:2024/06/05 15:09

FFmpeg加入android打印

  • 传入log callbakc打印的都是这个函数的函数名,无法定位问题。
  • 研究了libavutil/log.c,发现可以在av_vlog里加入一行,专门用于打印。

1 log_callback_ffmpeg 传递给ffmpeg打印

  • 这种打印的结果是函数名都是log_callback_ffmpeg
static void log_callback_ffmpeg(void *ptr, int level,                                const char *fmt, va_list vargs){    int level_setting = av_log_get_level();       if (level == AV_LOG_DEBUG) {        slogd("%s", logStr);    } else if (level == AV_LOG_INFO) {        slogi("%s", logStr);    } else if (level == AV_LOG_WARNING) {        slogw("%s", logStr);    } else if (level <= AV_LOG_ERROR) {        sloge("%s", logStr);    }}

2 av_vlog 加入一行打印函数名

  • 参考[http://m.blog.csdn.net/article/details?id=9014697]加入下面这行,用于打印函数名、行号等:
    SCLOGD("%s() in %s, Line: %d\n", __func__, __FILE__, __LINE__);
  • 其中,SCLOGD的声明为:
#define SCLOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "scff", __VA_ARGS__)
  • 注意,上面才是正确使用__android_log_print的方法

-结果是,这样也不行,打印的是av_vlog所在文件名、行号和函数名。

3 头文件

#pragma once/** ANDROID */#if defined(__ANDROID__)#include <android/log.h>这里加入你的代码#endif

不需要再libavutil/Makefile中加入LDFALGS += llog

4 只好直接替换av_log了

  • 参考[http://m.blog.csdn.net/article/details?id=50562024]
  • 重新编译好麻烦啊,我这里是avfilter、avformat、 avcodec、avresample、 postproc、swscale、avutil、avdevice,几乎到了最后才能编译到log.c.
  • static const char *get_level_str(int level){switch (level) {case AV_LOG_QUIET:    return "quiet";case AV_LOG_DEBUG:    return "debug";case AV_LOG_VERBOSE:    return "verbose";case AV_LOG_INFO:    return "info";case AV_LOG_WARNING:    return "warning";case AV_LOG_ERROR:    return "error";case AV_LOG_FATAL:    return "fatal";case AV_LOG_PANIC:    return "panic";default:    return "";}}
    • 采用如下替换打印:
 int get_droid_level(int level);#define av_log(avcl, level, fmt, ...)  __android_log_print(get_droid_level(level), "ZBFFmpeg", "[%s_%d_%s]"fmt,__FILE__,__LINE__,__FUNCTION__,##__VA_ARGS__)

成功。

0 0
原创粉丝点击