diff --git a/Html/html/index.html b/Html/html/index.html
index 48069a8..40e3565 100644
--- a/Html/html/index.html
+++ b/Html/html/index.html
@@ -59,20 +59,20 @@
diff --git a/src/main/java/Camera/GrabbingTask.java b/src/main/java/Camera/GrabbingTask.java
index c8dcedc..c9cdd15 100644
--- a/src/main/java/Camera/GrabbingTask.java
+++ b/src/main/java/Camera/GrabbingTask.java
@@ -12,17 +12,26 @@ import org.bytedeco.javacv.FrameGrabber;
import org.tinylog.Logger;
public class GrabbingTask implements Runnable {
+ // for while loop control
+ private final AtomicBoolean isGrabbing;
+ // for grabbing frames
+ private final FrameGrabber grabber;
+
+ // Consumers
@Setter private Consumer onMessageUpdate;
@Setter private Consumer onHQFrameUpdate;
@Setter private Consumer onLQFrameUpdate;
@Setter private Consumer onHQBase64Update;
@Setter private Consumer onLQBase64Update;
+
+ // status of capture fps
@Getter private int CaptureFPS = 0;
- private final AtomicBoolean isGrabbing;
- private final FrameGrabber grabber;
- @Getter private final int lowquality_width = 640;
- @Getter private final int lowquality_height = 360;
+ @Getter @Setter private int lowquality_width = 640;
+ @Getter @Setter private int lowquality_height = 360;
+
+ // for FPS calculation
+ private int intendedFps = 10;
private void updateMessage(String message) {
if (onMessageUpdate != null) {
@@ -62,10 +71,10 @@ public class GrabbingTask implements Runnable {
- public GrabbingTask(AtomicBoolean isGrabbing, FrameGrabber grabber) {
+ public GrabbingTask(AtomicBoolean isGrabbing, FrameGrabber grabber, int fps) {
this.isGrabbing = isGrabbing;
this.grabber = grabber;
-
+ if (fps>0) intendedFps = fps;
}
@@ -73,39 +82,51 @@ public class GrabbingTask implements Runnable {
isGrabbing.set(false);
}
- private void grabprocess() throws Exception{
- grabber.flush();
- Frame fr =grabber.grab();
-
+ private void processFrame(Frame fr){
if (fr!=null){
updateHQFrame(fr);
updateHQBase64(SomeCodes.FrameToBase64(fr));
Frame resized = SomeCodes.ResizeFrame(fr, lowquality_width, lowquality_height);
updateLQFrame(resized);
updateLQBase64(SomeCodes.FrameToBase64(resized));
- } else updateMessage("Grabber returned null frame");
+ } else updateMessage("processFrame have null frame");
}
+ private void flush_grabber(){
+ try {
+ if (grabber!=null) grabber.flush();
+ } catch (FrameGrabber.Exception e) {
+ Logger.error("Error flushing grabber: "+e.getMessage());
+ }
+ }
@Override
public void run() {
isGrabbing.set(true);
Logger.info("Grabbing Task started");
double fps = grabber.getFrameRate();
- Logger.info("Grabber framerate = {}", fps);
+ int skippedframes = (int)(fps / intendedFps);
+ //Logger.info("Grabber framerate = {}, intendedFps = {}, Skipping frames = {}", fps, intendedFps, skippedframes);
+ int framecount = 0;
+ flush_grabber();
long starttick = System.currentTimeMillis();
while (isGrabbing.get()) {
-
- long elapsed = System.currentTimeMillis() - starttick;
- starttick = System.currentTimeMillis();
- //Logger.info("Elapsed time = {} ms", elapsed);
- if (elapsed>0) CaptureFPS = (int) (1000 / elapsed);
try{
Thread.yield();
- grabprocess();
+ Frame frame = grabber.grab();
+ if (framecount0) {
+ int xx = (int) (1000 / elapsed);
+ if (xx {
- if (value!=null){
- if (value.imageWidth>0 && value.imageHeight>0){
- setLastHQFrame(value);
- HQWidth = value.imageWidth;
- HQHeight = value.imageHeight;
- }
-
- }
- });
- tt.setOnLQFrameUpdate(value -> {
- if (value!=null){
- if (value.imageWidth>0 && value.imageHeight>0){
- setLastLQFrame(value);
- LQWidth = value.imageWidth;
- LQHeight = value.imageHeight;
- }
- }
- });
- tt.setOnHQBase64Update(this::setLastHQBase64);
- tt.setOnLQBase64Update(this::setLastLQBase64);
+ GrabbingTask tt = getGrabbingTask();
grabbingTask = tt;
new Thread(tt).start();
@@ -111,6 +90,8 @@ public class RtspGrabber {
}
}
+
+
/**
* Stop grabbing frames
*/
@@ -139,4 +120,32 @@ public class RtspGrabber {
public String HQStreamingStatus(){
return gson.toJson(new String[]{String.valueOf(HQWidth), String.valueOf(HQHeight) , String.valueOf(grabbingTask.getCaptureFPS())});
}
+
+ @NotNull
+ private GrabbingTask getGrabbingTask() {
+ GrabbingTask tt = new GrabbingTask(isGrabbing, grabber,10);
+ tt.setOnMessageUpdate(Logger::info);
+ tt.setOnHQFrameUpdate(value -> {
+ if (value!=null){
+ if (value.imageWidth>0 && value.imageHeight>0){
+ setLastHQFrame(value);
+ HQWidth = value.imageWidth;
+ HQHeight = value.imageHeight;
+ }
+
+ }
+ });
+ tt.setOnLQFrameUpdate(value -> {
+ if (value!=null){
+ if (value.imageWidth>0 && value.imageHeight>0){
+ setLastLQFrame(value);
+ LQWidth = value.imageWidth;
+ LQHeight = value.imageHeight;
+ }
+ }
+ });
+ tt.setOnHQBase64Update(this::setLastHQBase64);
+ tt.setOnLQBase64Update(this::setLastLQBase64);
+ return tt;
+ }
}
diff --git a/src/main/java/id/co/gtc/Main.java b/src/main/java/id/co/gtc/Main.java
index b894008..f14ed88 100644
--- a/src/main/java/id/co/gtc/Main.java
+++ b/src/main/java/id/co/gtc/Main.java
@@ -51,11 +51,11 @@ public class Main {
init_properties();
init_audiofiles();
+ init_Vapix();
init_audio();
+ init_pantiltcontroller();
init_webserver();
init_rtspgrabber();
- init_pantiltcontroller();
- init_Vapix();
}
private static void init_system_monitoring(){