Making Ffmpeg/Javacv Less Verbose in Java

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?

2 Answers

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

3

This is updated solution(w.r.t. javacv from github)

add the import statement given below

import static org.bytedeco.javacpp.avutil.AV_LOG_PANIC;  
import static org.bytedeco.javacpp.avutil.av_log_set_level;

call the below statement before you create the FFmpegFrameGrabber -> No more messages form ffmpeg.

av_log_set_level(AV_LOG_PANIC);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Sarah Jenkins

Sarah Jenkins

Senior Technology Editor & AI Specialist

Sarah Jenkins is a veteran tech journalist with over 12 years of experience covering artificial intelligence, mobile innovations, and digital ethics. Her insights have appeared in leading technology publications worldwide.

Share this article
Twitter Facebook Pinterest