2011-03-15 138 views
1

首先,我對我的壞英語表示歉意。使用xuggler凍結應用程序

我想讓xuggler使用rts協議從ip webcam讀取顯示視頻。 xuggler連接到相機並開始讀取流。幾分鐘後我的應用程序凍結。我也嘗試過調試,但是我看不到xuggler使用的本地庫中發生了什麼。當我添加到我的代碼system.out.println()之前mediaReader.readPacket();之後,我意識到xuggler凍結了readPacket()方法。你有什麼想法如何解決它?

代碼,我使用:

public class Test { 
private static VideoImage mScreen = null; 
private static IMediaListener mediaListener = new MediaListenerAdapter() { 
    @Override 
    public void onVideoPicture(IVideoPictureEvent event) { 

     try { 

      BufferedImage bi = event.getImage();//Utils.videoPictureToImage(pic);; 
      updateJavaWindow(bi); 

     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 

};

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    IMediaReader mediaReader = ToolFactory.makeReader("rtsp://10.0.1.16/live3.sdp"); 
    mediaReader.setBufferedImageTypeToGenerate(BufferedImage.TYPE_3BYTE_BGR); 
    mediaReader.setAddDynamicStreams(true); 
    mediaReader.setQueryMetaData(false); 
    mediaReader.addListener(mediaListener); 
    mediaReader.getContainer().setInputBufferLength(64000000); 
    mediaReader.getContainer().setProperty("probesize", 500000); 

    openJavaWindow(); 
    while(true){ 
     System.out.println("reading packet"); 
     IError err = mediaReader.readPacket(); 
     System.out.println("end packet"); 
     if(err != null){ 
      break; 
     } 
    } 
    closeJavaWindow(); 
} 



    private static void updateJavaWindow(BufferedImage javaImage) 
    { 
    mScreen.setImage(javaImage); 
    } 

    /** 
    * Opens a Swing window on screen. 
    */ 
    private static void openJavaWindow() 
    { 
    mScreen = new VideoImage(); 
    } 

    /** 
    * Forces the swing thread to terminate; I'm sure there is a right 
    * way to do this in swing, but this works too. 
    */ 
    private static void closeJavaWindow() 
    { 
    System.exit(0); 
    } 

}

感謝您的回答

馬立克

回答

0

如果您嘗試使用相同的協議,以一些其他程序以流這款相機,你得到同樣的結果?這可能是Xuggler無法控制的問題。這可能是Xuggler沒有正確處理流中的錯誤 - 如果是這種情況,我不知道你可以做什麼。據我所知,當然聽起來不像你在代碼中做錯了什麼。

如果不這樣做,我唯一能想到的就是以某種方式在單獨的線程中關閉該命令,並強制它在終止時間超過一定時間後終止。然後,您可以嘗試修正它 - 它可能只是一個單獨的電話readPacket()工作正常,或者您可能需要關閉/重新打開流。這是一個閃光,但工作的沼澤總比沒有好!