FFmpeg+javacpp中av_log使用
1、ffmpeg中av_log源码
ffmpeg-6.0\libavutil\log.h
ffmpeg-6.0\libavutil\log.c
ffmpeg-6.0\libavformat\dump.c
2、av_dump_format 信息
import static org.bytedeco.ffmpeg.global.avformat.av_dump_format;
org.bytedeco.ffmpeg.global Class avformat java.lang.Object org.bytedeco.ffmpeg.presets.avformat org.bytedeco.ffmpeg.global.avformat
String url = "F:\\Music\\Let Me Down Slowly.mp3";
AVFormatContext pFormatCtx = avformat_alloc_context(); // 解封装上下文
if (avformat_open_input(pFormatCtx, url, null, null) != 0) {
XLog.e("AVFormatContext","open file failed!"); // 打开流媒体
return;
}
if (avformat_find_stream_info(pFormatCtx, (PointerPointer<Pointer>) null) < 0) {
XLog.e("AVFormatContext","find stream info failed!"); // 读取流媒体信息
return;
}
av_dump_format(pFormatCtx, 0, url, 0);
avformat_close_input(pFormatCtx);
3、av_log封装使用:AvLog.java
org/bytedeco/ffmpeg/global/avutil.java
3.1 av_log等级
默认等级
AV_LOG_INFO = 32;
/**
* Print no output.
*/
public static final int AV_LOG_QUIET = -8;
/**
* Something went really wrong and we will crash now.
*/
public static final int AV_LOG_PANIC = 0;
/**
* Something went wrong and recovery is not possible.
* For example, no header was found for a format which depends
* on headers or an illegal combination of parameters is used.
*/
public static final int AV_LOG_FATAL = 8;
/**
* Something went wrong and cannot losslessly be recovered.
* However, not all future data is affected.
*/
public static final int AV_LOG_ERROR = 16;
/**
* Something somehow does not look correct. This may or may not
* lead to problems. An example would be the use of '-vstrict -2'.
*/
public static final int AV_LOG_WARNING = 24;
/**
* Standard information.
*/
public static final int AV_LOG_INFO = 32;
/**
* Detailed information.
*/
public static final int AV_LOG_VERBOSE = 40;
/**
* Stuff which is only useful for libav* developers.
*/
public static final int AV_LOG_DEBUG = 48;
/**
* Extremely verbose debugging, useful for libav* development.
*/
public static final int AV_LOG_TRACE = 56;
public static final int AV_LOG_MAX_OFFSET = (AV_LOG_TRACE - AV_LOG_QUIET);
3.2 不会自动换行
public class Demo {
public static void main(String[] args) throws Exception {
XLog.config("Xh-Demo", false, true);
/*String url = "F:\\Music\\Let Me Down Slowly.mp3";
AVFormatContext pFormatCtx = UtilsTool.getFormatContext(url);
AvLog.dumpFormat(pFormatCtx, 0, url, 0);
UtilsTool.closeAVFormatContext(pFormatCtx);*/
XLog.d("av_log_get_level() 等级: " + avutil.av_log_get_level());
XLog.d("av_log 等级: " + AvLog.getLevel());
AvLog.setLevel(avutil.AV_LOG_TRACE);
avutil.av_log(null, avutil.AV_LOG_INFO, "你好");
avutil.av_log(null, avutil.AV_LOG_INFO, "java\n");
AvLog.i("你好");
AvLog.i("java");
AvLog.i("\n");
}
}
3.3 AvLog.java
package org.xhbruce.utils;
import org.bytedeco.ffmpeg.avformat.AVFormatContext;
import static org.bytedeco.ffmpeg.global.avformat.av_dump_format;
import static org.bytedeco.ffmpeg.global.avutil.*;
/**
public static final int AV_LOG_QUIET = -8;
public static final int AV_LOG_PANIC = 0;
public static final int AV_LOG_FATAL = 8;
public static final int AV_LOG_ERROR = 16;
public static final int AV_LOG_WARNING = 24;
public static final int AV_LOG_INFO = 32;
public static final int AV_LOG_VERBOSE = 40;
public static final int AV_LOG_DEBUG = 48;
public static final int AV_LOG_TRACE = 56;
public static final int AV_LOG_MAX_OFFSET = (AV_LOG_TRACE - AV_LOG_QUIET);
*/
public class AvLog {
private static final String[] AV_LOG_LEVEL = {"AV_LOG_QUIET","AV_LOG_PANIC","AV_LOG_FATAL","AV_LOG_ERROR"
,"AV_LOG_WARNING","AV_LOG_INFO","AV_LOG_VERBOSE","AV_LOG_DEBUG","AV_LOG_TRACE","AV_LOG_MAX_OFFSET"};
private AvLog() {
}
public static String getLevel() {
return matchLevel(av_log_get_level());
}
public static void setLevel(int level) {
av_log_set_level(level);
}
public static void t(String message) {
av_log(null, AV_LOG_TRACE, message);
}
public static void d(String message) {
av_log(null, AV_LOG_DEBUG, message);
}
public static void v(String message) {
av_log(null, AV_LOG_VERBOSE, message);
}
public static void i(String message) {
av_log(null, AV_LOG_INFO, message);
}
public static void w(String message) {
av_log(null, AV_LOG_WARNING, message);
}
public static void e(String message) {
av_log(null, AV_LOG_ERROR, message);
}
public static void f(String message) {
av_log(null, AV_LOG_FATAL, message);
}
public static void p(String message) {
av_log(null, AV_LOG_PANIC, message);
}
public static void dumpFormat(AVFormatContext ic, int index, String url, int is_output) {
av_dump_format(ic, index, url, is_output);
}
private static String matchLevel(int level) {
switch (level) {
case AV_LOG_QUIET:
return AV_LOG_LEVEL[0];
case AV_LOG_PANIC:
return AV_LOG_LEVEL[1];
case AV_LOG_FATAL:
return AV_LOG_LEVEL[2];
case AV_LOG_ERROR:
return AV_LOG_LEVEL[3];
case AV_LOG_WARNING:
return AV_LOG_LEVEL[4];
case AV_LOG_INFO:
return AV_LOG_LEVEL[5];
case AV_LOG_VERBOSE:
return AV_LOG_LEVEL[6];
case AV_LOG_DEBUG:
return AV_LOG_LEVEL[7];
case AV_LOG_TRACE:
return AV_LOG_LEVEL[8];
}
return "";
}
}