我有一个使用ffmpeg
库和javacv
加载和处理视频文件的Java应用程序。
我当前正在使用以下代码,将videofile
加载到我的数据容器中。
public boolean add(String videofile) {
FrameGrabber g = new OpenCVFrameGrabber( videofile );
try{
g.start();
}
catch(Exception e){
g = new FFmpegFrameGrabber( videofile );
try {
g.start();
}catch(Exception x){
return false;
}
}
grabbers.add( new Pair(videofile, g) );
frames.add( 0 );
preprocessed=false;
return true;
}
每次加载视频时,库都会输出有关视频本身的许多元信息:
显然我不想看到。我不能(不想)修改库的源代码,而是修改自己的库的源代码,以便它可以截获该日志并将其丢弃。
到目前为止,我试图暂时阻止stdout/stderr流通过
private static final devnull = new PrintStream(new OutputStream() {
@Override
public void write(int b) {
//DO NOTHING
}
@Override
public void write(byte[] b,int x,int y){
}
});
/**
* Blocks messages to stdout
*/
public static void silentStdOut(){
System.setOut(devnull);
}
/**
* Blocks messages to stderr
*/
public static void silentStdErr(){
System.setErr(devnull);
}
但它似乎无济于事,仍然显示日志消息
public boolean add(String videofile) {
Utils.silentStdErr();
Utils.silentStdOut();
FrameGrabber g = new OpenCVFrameGrabber( videofile );
try{
g.start();
}
,,,
可以使用以下命令将“原始” ffmpeg设置为不那么冗长
ffmpeg -loglevel panic
但是
OpenCVFrameGrabber
和FFmpegFrameGrabber
都不允许访问该工具的参数。总结一下-如何在不修改库源代码的情况下丢弃这些日志消息?
最佳答案
几分钟前遇到了同样的问题,并且还在网上看了看,除了您的问题。然后,我开始在ffmpeg来源中进行挖掘,找到了解决方案,并添加了导入:
import com.googlecode.javacv.cpp.avutil;
然后只需调用:
avutil.av_log_set_level(avutil.AV_LOG_QUIET);
在创建FFmpegFrameGrabber->从ffmpeg没有更多消息之前。
问候
丹尼尔