Камера Canon застревает через некоторое время - 1200D EOS SDK Java
Мы используем canon eos sdk 2.14 для прямой трансляции и съемки. камера Canon 1200D
ниже приведены настройки камеры:
режим прямой трансляции: включен
Режим AF: Flexi
ниже код
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 && 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 && 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();
}
}
В приведенном выше коде у меня есть два метода
- startCameraLive()
- onFaceCapture ()
сначала я запускаю режим live view и непрерывно отображаю загруженное изображение, а когда пользователь нажимает кнопку захвата, будет выполнен второй метод. оба метода вызываются как показано ниже
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 (Mode.AUTO);
camera.setLiveViewMode (истина);
но все же, когда камера застряла, режим просмотра в реальном времени становится отключенным.
как мы можем избавиться от этого, и мы хотели бы знать, какова основная причина этой проблемы. нет никаких исключений вообще:(
Пожалуйста помоги...
1 ответ
Вы пытались увидеть, работает ли метод Swingworkers с:
System.out.println(javax.swing.SwingUtilities.isEventDispatchThread());
Или, может быть, добавление в ваш класс "extends SwingWorker"?