我有一個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;' –