我有一个使用ffmpeg库和javacv加载和处理视频文件的Java应用程序。

我当前正在使用以下代码,将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;
    }

每次加载视频时,库都会输出有关视频本身的许多元信息:



显然我不想看到。我不能(不想)修改库的源代码,而是修改自己的库的源代码,以便它可以截获该日志并将其丢弃。

到目前为止,我试图暂时阻止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

但是OpenCVFrameGrabberFFmpegFrameGrabber都不允许访问该工具的参数。

总结一下-如何在不修改库源代码的情况下丢弃这些日志消息?

最佳答案

几分钟前遇到了同样的问题,并且还在网上看了看,除了您的问题。然后,我开始在ffmpeg来源中进行挖掘,找到了解决方案,并添加了导入:

import com.googlecode.javacv.cpp.avutil;

然后只需调用:
avutil.av_log_set_level(avutil.AV_LOG_QUIET);

在创建FFmpegFrameGrabber->从ffmpeg没有更多消息之前。

问候
丹尼尔

10-08 08:46