замораживание приложения с использованием xuggler - PullRequest
1 голос
/ 15 марта 2011

Во-первых, я прошу прощения за мой плохой английский.

Я пытаюсь xuggler прочитать отображаемое видео с веб-камеры ip по протоколу rts.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);
  }

}

спасибо за ваш ответ

Марек

1 Ответ

0 голосов
/ 03 августа 2011

Если вы попытаетесь передать эту камеру по тому же протоколу в другую программу, получите ли вы тот же результат?Это может быть проблемой в дальнейшем, которую Xuggler не может контролировать.Возможно, Xuggler неправильно обрабатывает ошибку в потоке - если это так, я знаю, что вы ничего не можете сделать.Конечно, это не похоже на то, что вы сделали неправильно в коде, насколько я вижу.

Если это не удастся, единственное, о чем я могу думать, это как-то запустить команду в отдельном потоке и заставитьэто прекратить, если это займет больше времени, чем определенное время, чтобы вернуться.Затем вы можете поэкспериментировать с тем, что это исправляет - это может быть просто отдельный вызов readPacket(), который работает нормально, или вам может потребоваться закрыть / открыть поток.Это подделка, но рабочие тела лучше, чем ничего!

...