在java中使ffmpeg/javacv更简洁

lej*_*lot 6 java ffmpeg verbosity 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;        
    }
Run Code Online (Sandbox Code Playgroud)

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

输入#0,mov,mp4,m4a,3gp,3g2,mj2,来自'/home/lejlot/data/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 fps,30 tbr,1k tbn,1k tbc元数据: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);
   }
Run Code Online (Sandbox Code Playgroud)

但它似乎没有帮助,仍然显示日志消息

public boolean add(String videofile) {
    Utils.silentStdErr();
    Utils.silentStdOut();
    FrameGrabber g = new OpenCVFrameGrabber( videofile );
    try{ 
        g.start();
    }
    ,,,
Run Code Online (Sandbox Code Playgroud)

可以将"原始"ffmpeg设置为使用更简洁

ffmpeg -loglevel panic
Run Code Online (Sandbox Code Playgroud)

但两者都OpenCVFrameGrabber不能FFmpegFrameGrabber访问工具的参数.

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

Dan*_*ann 8

几分钟之前有同样的问题,除了你的问题外,还看了网.然后我开始挖掘ffmpeg源代码并找到解决方案,添加导入:

import com.googlecode.javacv.cpp.avutil;
Run Code Online (Sandbox Code Playgroud)

然后打电话:

avutil.av_log_set_level(avutil.AV_LOG_QUIET);
Run Code Online (Sandbox Code Playgroud)

在创建FFmpegFrameGrabber之前 - >没有更多消息来自ffmpeg.

关心
丹尼尔


小智 5

这是更新的解决方案(来自 github 的 javacv)

添加下面给出的导入语句

import static org.bytedeco.javacpp.avutil.AV_LOG_PANIC;  
import static org.bytedeco.javacpp.avutil.av_log_set_level;
Run Code Online (Sandbox Code Playgroud)

在创建 FFmpegFrameGrabber 之前调用以下语句 -> 不再有来自 ffmpeg 的消息。

av_log_set_level(AV_LOG_PANIC);
Run Code Online (Sandbox Code Playgroud)