2013-08-18 72 views
3

我有一个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可以访问该工具的参数。

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

回答

5

几分钟前有同样的问题,也看网上,除了你的问题没有什么。然后我就开始挖FFmpeg的源代码,并找到了解决方案,加上进口:

import com.googlecode.javacv.cpp.avutil; 

,然后只要致电:

avutil.av_log_set_level(avutil.AV_LOG_QUIET); 

创建FFmpegFrameGrabber前 - >没有更多的消息形成的ffmpeg。

问候
丹尼尔

+0

这让我想起http://xkcd.com/979/。谢谢你的答案,完美的作品。 2017 – lejlot

+0

解决方案:现在是'import org.bytedeco.javacpp.avutil;' –

0

这是更新的解决方案(从GitHub WRT javacv)

下面添加

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

调用下面的语句给你创建FFmpegFrameGrabber前import语句 - >没有更多消息形成ffmpeg。

av_log_set_level(AV_LOG_PANIC);