#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();
}
}
В приведенном выше коде у меня есть два метода
- startCameraLive()
- 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»?