使用xuggler冻结应用程序

时间:2011-03-15 09:39:46

标签: java rtsp

首先,我为我糟糕的英语道歉。

我正在尝试xuggler使用rts协议从ip网络摄像头读取显示视频。 xuggler连接到摄像头并开始读取流。几分钟后,我的应用程序冻结了。我也试过调试,但我看不出xuggler使用的本机库中发生了什么。当我在 mediaReader.readPacket(); 之前添加到我的代码 system.out.println()之后,我意识到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);
  }

}

谢谢你的回答

马立克

1 个答案:

答案 0 :(得分:0)

如果您尝试使用相同的协议将此相机传输到其他程序,您会得到相同的结果吗?这可能是Xuggler无法控制的进一步问题。可能是Xuggler没有正确处理流中的错误 - 如果是这样的话,我知道你无能为力。就我所见,当然听起来并不像你在代码中做错了。

如果做不到这一点,我唯一能想到的就是以某种方式在一个单独的线程中关闭命令并强制它终止,如果它需要的时间超过一定时间才能返回。然后,您可以尝试修复它 - 它可能只是对readPacket()的单独调用正常,或者您可能需要关闭/重新打开流。这是一个小屋,但是工作的人比没有好!