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.youkuaiyun.com/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.youkuaiyun.com/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__)
成功。