我有一个
Java应用程序,它使用ffmpeg库和javacv来加载和处理视频文件.
我目前正在使用以下代码,用于将视频文件加载到我的数据容器中.
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;
}
每次加载视频时,库都会输出大量有关视频本身的元信息:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ‘/home/lejlot/data/test.mp4’:
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
encoder : Lavf53.21.1 Duration: 00:04:36.27, start: 0.000000, bitrate: 305 kb/s
Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 1280×720 [SAR 1:1 DAR 16:9], 303 kb/s, 20,85
fps, 30 tbr, 1k tbn, 1k tbc
Metadata:
handler_name : VideoHandler
这显然我不想看到.我不能(不想)修改库源代码,而是修改我自己的源代码,以便它可以拦截这个日志并丢弃它.
到目前为止,我试图临时阻止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都不能访问工具的参数.
总结一下 – 如何在不修改库源代码的情况下丢弃这些日志消息?