我们正在使用canon eos sdk 2.14进行直播和拍摄。 相机是佳能1200D
以下是相机设置:
直播模式:启用
自动对焦模式: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();
}
}
在上面的代码中我有两种方法
首先我开始实时取景并连续显示下载的图像,当用户点击捕获按钮时,将执行第二种方法。这两个方法都按如下方式调用
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(真);
但是当相机卡住时,实时取景模式将被禁用。
我们怎样才能摆脱这种困境,我们想知道这个问题的根本原因。根本没有例外:(
请帮忙......
答案 0 :(得分:1)
您是否尝试过使用Swingworkers方法:
System.out.println(javax.swing.SwingUtilities.isEventDispatchThread());
或者可能在您的课程中添加“扩展SwingWorker”?