我有一个Java应用程序,它使用ffmpeg
库和javacv
加载和处理视频文件。在java中制作ffmpeg/javacv较少详细信息
我正在使用以下代码,将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;
}
每次视频被加载时,一个库输出大量的元信息有关的视频本身:
输入#0,MOV,MP4,M4A,3GP,3G2,MJ2,从“/家/ lejlot /数据/ test.mp4' : 元数据: major_brand:ISOM minor_version:512 compatible_brands:isomiso2mp41 编码器:Lavf53.21.1时间:00:04:36.27,启动:0.000000,比特率:305 kb/s的 流#0:0(und):视频:mpeg4(简单配置文件)(mp4v/0x7634706D),yuv420p,1280x720 [SAR 1:1 DAR 16:9],303 kb/s的,20,85 帧,30 TBR,1K TBN,1K TBC 元数据: handler_name:VideoHandler
这显然我不想看到。我不能(不希望)修改库源代码,而是修改我自己的代码,以便拦截此日志并丢弃它。
据我试图通过
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);
}
到即暂时阻断标准输出/ stderr流,但它似乎并没有帮助,日志信息仍显示
public boolean add(String videofile) {
Utils.silentStdErr();
Utils.silentStdOut();
FrameGrabber g = new OpenCVFrameGrabber(videofile);
try{
g.start();
}
,,,
“原始”的ffmpeg可以设置为较不详细使用
ffmpeg -loglevel panic
但不是OpenCVFrameGrabber
不是FFmpegFrameGrabber
可以访问该工具的参数。
总结 - 如何在不修改库的源代码的情况下丢弃这些日志消息?
这让我想起http://xkcd.com/979/。谢谢你的答案,完美的作品。 2017 – lejlot
解决方案:现在是'import org.bytedeco.javacpp.avutil;' –