2013-08-18 40 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);