Making ffmpeg/javacv less verbose in java
ffmpeg, java, javacv, verbosity
Solution
had the same problem a few minutes ago, and also looked on the net, nothing except your question. Then i started digging in the ffmpeg sources and found a solution, add the import:
import com.googlecode.javacv.cpp.avutil;
and then just call:
avutil.av_log_set_level(avutil.AV_LOG_QUIET);
before you create the FFmpegFrameGrabber -> No more messages form ffmpeg.
Regards Daniel
Problem
I have a Java application that uses `ffmpeg` library and `javacv` to load and process video files. I am currently using following code, for loading `videofile` to my data container. ``` 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; } ``` Each time video is loaded, a library outputs a lot of meta information regarding video itself: 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, 1280x720 [SAR 1:1 DAR 16:9], 303 kb/s, 20,85 fps, 30 tbr, 1k tbn, 1k tbc Metadata: handler_name : VideoHandler which obviously I do not want to see. I cannot (do not want) to modify the libraries source codes, but rather modify my own so it can intercept this log and discard it. As far I tried to temporarly block the stdout/stderr streams through ``` 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); } ``` but it does not seem to help, log message is still displayed ``` public boolean add(String videofile) { Utils.silentStdErr(); Utils.silentStdOut(); FrameGrabber g = new OpenCVFrameGrabber( videofile ); try{ g.start(); } ,,, ``` "Raw" ffmpeg can be set to be less verbose using ``` ffmpeg -loglevel panic ``` but neither `OpenCVFrameGrabber` not `FFmpegFrameGrabber` give access to the tool's parameters. To sum up - how can I discard these log messages without modifing the libraries' source codes?