Modify Websocket GET BASE64 mechanism to get concise FPS between HQ and LQ.
Support multiple quality between users.
This commit is contained in:
@@ -1,9 +1,7 @@
|
||||
package Camera;
|
||||
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import Other.SomeCodes;
|
||||
@@ -11,24 +9,19 @@ import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bytedeco.javacv.Frame;
|
||||
import org.bytedeco.javacv.FrameGrabber;
|
||||
import org.bytedeco.opencv.opencv_core.Mat;
|
||||
|
||||
public class GrabbingTask implements Runnable {
|
||||
@Setter private Consumer<String> onMessageUpdate;
|
||||
@Setter private Consumer<Mat> onMatUpdate;
|
||||
@Setter private Consumer<Frame> onFrameUpdate;
|
||||
@Setter private Consumer<String> onBase64Update;
|
||||
@Setter private Consumer<String> onStreamingStatusUpdate;
|
||||
@Setter private Consumer<Frame> onHQFrameUpdate;
|
||||
@Setter private Consumer<Frame> onLQFrameUpdate;
|
||||
@Setter private Consumer<String> onHQBase64Update;
|
||||
@Setter private Consumer<String> onLQBase64Update;
|
||||
|
||||
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 boolean HQ = false;
|
||||
@Getter private int streaming_width = 0;
|
||||
@Getter private int streaming_height = 0;
|
||||
@Getter private int streaming_fps = 0;
|
||||
AtomicBoolean streamingstatuschanged = new AtomicBoolean(false);
|
||||
|
||||
|
||||
private void updateMessage(String message) {
|
||||
if (onMessageUpdate != null) {
|
||||
@@ -36,87 +29,66 @@ public class GrabbingTask implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
private void updateMat(Mat value) {
|
||||
if (onMatUpdate != null) {
|
||||
onMatUpdate.accept(value);
|
||||
|
||||
|
||||
|
||||
|
||||
private void updateHQBase64(String base64) {
|
||||
if (onHQBase64Update != null) {
|
||||
onHQBase64Update.accept(base64);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateBase64(String base64) {
|
||||
if (onBase64Update != null) {
|
||||
onBase64Update.accept(base64);
|
||||
private void updateLQBase64(String base64) {
|
||||
if (onLQBase64Update != null) {
|
||||
onLQBase64Update.accept(base64);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateFrame(Frame frame) {
|
||||
if (onFrameUpdate != null) {
|
||||
onFrameUpdate.accept(frame);
|
||||
private void updateHQFrame(Frame frame) {
|
||||
if (onHQFrameUpdate != null) {
|
||||
onHQFrameUpdate.accept(frame);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateStreamingStatus(String status) {
|
||||
if (onStreamingStatusUpdate != null) {
|
||||
onStreamingStatusUpdate.accept(status);
|
||||
private void updateLQFrame(Frame frame) {
|
||||
if (onLQFrameUpdate != null) {
|
||||
onLQFrameUpdate.accept(frame);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public GrabbingTask(AtomicBoolean isGrabbing, FrameGrabber grabber) {
|
||||
this.isGrabbing = isGrabbing;
|
||||
this.grabber = grabber;
|
||||
|
||||
}
|
||||
|
||||
public String GetStreamingStatus(){
|
||||
return "Streaming at " + streaming_width + "x" + streaming_height + " " + streaming_fps + "fps";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
isGrabbing.set(true);
|
||||
AtomicInteger framecount = new AtomicInteger(0);
|
||||
TimerTask task = new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (streaming_fps != framecount.get()) {
|
||||
streaming_fps = framecount.get();
|
||||
streamingstatuschanged.set(true);
|
||||
}
|
||||
framecount.set(0);
|
||||
if (streamingstatuschanged.get()) {
|
||||
updateStreamingStatus(GetStreamingStatus());
|
||||
streamingstatuschanged.set(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
Timer timer = new Timer();
|
||||
timer.scheduleAtFixedRate(task, 1000, 1000);
|
||||
while (isGrabbing.get()) {
|
||||
try {
|
||||
//Thread.sleep(100); // 10 fps
|
||||
Frame fr =grabber.grab();
|
||||
if (fr!=null){
|
||||
if (!HQ) fr = SomeCodes.ResizeFrame(fr, lowquality_width, lowquality_height);
|
||||
updateFrame(fr);
|
||||
updateBase64(SomeCodes.BufferedImageToBase64(SomeCodes.FrameToBufferedImage(fr)));
|
||||
Mat mat = SomeCodes.matConverter.convert(fr);
|
||||
updateMat(mat);
|
||||
if (streaming_width != fr.imageWidth) {
|
||||
streaming_width = fr.imageWidth;
|
||||
streamingstatuschanged.set(true);
|
||||
}
|
||||
if (streaming_height != fr.imageHeight) {
|
||||
streaming_height = fr.imageHeight;
|
||||
streamingstatuschanged.set(true);
|
||||
}
|
||||
framecount.incrementAndGet();
|
||||
|
||||
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");
|
||||
} catch (Exception e) {
|
||||
updateMessage("Error grabbing frame: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
timer.cancel();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user