Камера Canon застревает через некоторое время — 1200D EOS sdk java

#java #live-streaming #canon-sdk

#java #прямая трансляция #canon-sdk

Вопрос:

мы используем canon eos sdk 2.14 для прямой трансляции и съемки. камера canon 1200D

ниже приведены настройки камеры :

режим прямой трансляции: включен

Режим автофокусировки: гибкий

ниже приведен код

 import java.awt.image.BufferedImage;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.SwingWorker;

import edsdk.api.CanonCamera;
import edsdk.api.commands.FocusModeCommand.Mode;

public class CameraWorker {
    static CanonCamera camera = null;
    public SwingWorker<Void, Void> liveViewWorker = null, shootWorker = null;

    public void startCameraLive() {
        try {
            camera = new CanonCamera();
            if (camera != null amp;amp; camera.openSession()) {
                if (camera.beginLiveView()) {
                    camera.setFocusMode(Mode.AUTO);
                    camera.setLiveViewMode(true);
                    liveViewWorker = new SwingWorker<Void, Void>() {
                        @Override
                        protected Void doInBackground() throws Exception {
                            try {
                                while (continueLoop) {
                                    try {
                                        Thread.sleep(100);
                                        camera.setLiveViewMode(true);
                                        final BufferedImage image = camera.downloadLiveView();

                                        if (image != null) {
                                                    ///set image to live view
                                        }else{
                                        System.out.println("NO LIVE VIEW>>>>>>>>>>>>>>>>>>>>>>");
                                        }
                                    } catch (Exception e) {
                                        System.out.println("Exception Occured while getting Live View....");
                                        e.printStackTrace();
                                    }
                                }
                            } catch (Exception e2) {
                                e2.printStackTrace();
                            }
                            return null;
                        }

                        protected void done() {
                            try {
                                camera.endLiveView();
                                camera.closeSession();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    };
                    liveViewWorker.execute();
                }else{
                System.out.println("Live View not started.....");
                }
            }
        } catch(Exception e){
            e.printStackTrace();
        }
    }

      public void onFaceCapture() {
          shootWorker = new SwingWorker<Void, Void>() {
                BufferedImage croppedFaceImage;
                @Override
                protected Void doInBackground() throws Exception {
                    File[] camPictures = camera.shoot();

                    if (camPictures != null amp;amp; camPictures.length > 0) {
                        for (File curFile : camPictures){
                            try {
                                byte[] imageBuffer = FileNDirUtils.getFileBytes(curFile.getAbsolutePath());

                            }catch(Exception e1){
                                System.out.println("ERRORR:::::::::>>>>>>>>" e1.getMessage());
                            }
                        }
                    }else{
                        System.out.println("camPictures Null");
                    }
                    return null;
                }
                protected void done() {
                    try {

                    ////////set final image to display


                    } catch(Exception e1){
                        System.out.println("ERRORR:::::::::>>>>>>>>" e1.getMessage()  " reason ::: " e1.getCause());
                        e1.printStackTrace();
                    }
                    finally {
                        System.out.println("Done in finally........1");
                    }
                }
            };
            shootWorker.execute();
        }
}
 

В приведенном выше коде у меня есть два метода

  1. startCameraLive()
  2. onFaceCapture()

сначала я запускаю просмотр в реальном времени и непрерывно отображаю загруженное изображение, и когда пользователь нажимает кнопку захвата, будет выполнен второй метод. оба метода вызываются, как показано ниже

 SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        loop = true;
        cameraWorker = new CameraWorker();
        cameraWorker.startCameraLive();
    }
});
 

второй метод, подобный этому

 SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
             timerDisplay.setVisible(false);
             face_position_msg.setVisible(false);
             cameraWorker = new CameraWorker();
             cameraWorker.onFaceCapture();
         }
   });
 

теперь проблема ::::

после 5 или 6 итераций камера застревает, и ничего не работает. все зависает, и после закрытия приложения и перезапуска приложения оно не работает. нам нужно отключить камеру или нажать кнопку захвата на камере вручную, чтобы снова начать работу.

режим прямой трансляции, который включен в начале, автоматически отключается. нам нужно установить его снова.

в startCameraLive() мы устанавливаем :::

camera.setFocusMode(Режим.АВТО);

camera.setLiveViewMode(true);

но все же, когда камера застревает, режим просмотра в реальном времени отключается.

как мы можем избавиться от этой проблемы, и мы хотели бы знать, в чем основная причина этой проблемы. исключений вообще нет: (

Пожалуйста, помогите…

Ответ №1:

Вы пытались проверить, работает ли метод Swingworkers с:

 System.out.println(javax.swing.SwingUtilities.isEventDispatchThread());
 

Или, может быть, добавление в ваш класс «расширяет SwingWorker»?