Add more functions

This commit is contained in:
2024-11-13 08:35:32 +07:00
parent 1fe4716bab
commit f7f711d3fe
22 changed files with 1307 additions and 294 deletions

View File

@@ -9,6 +9,7 @@ import lombok.Getter;
import lombok.Setter;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;
import org.tinylog.Logger;
public class GrabbingTask implements Runnable {
@Setter private Consumer<String> onMessageUpdate;
@@ -16,13 +17,13 @@ public class GrabbingTask implements Runnable {
@Setter private Consumer<Frame> onLQFrameUpdate;
@Setter private Consumer<String> onHQBase64Update;
@Setter private Consumer<String> onLQBase64Update;
@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;
private void updateMessage(String message) {
if (onMessageUpdate != null) {
onMessageUpdate.accept(message);
@@ -68,27 +69,44 @@ public class GrabbingTask implements Runnable {
}
public void Stop(){
isGrabbing.set(false);
}
private void grabprocess() throws Exception{
grabber.flush();
Frame fr =grabber.grab();
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");
}
@Override
public void run() {
isGrabbing.set(true);
Logger.info("Grabbing Task started");
double fps = grabber.getFrameRate();
Logger.info("Grabber framerate = {}", fps);
long starttick = System.currentTimeMillis();
while (isGrabbing.get()) {
try {
Frame fr =grabber.grab();
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");
} catch (Exception e) {
updateMessage("Error grabbing frame: " + e.getMessage());
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();
} catch (Exception e){
Logger.error("Error grabbing frame: "+e.getMessage());
}
}
Logger.info("Grabbing Task stopped");
}
}

View File

@@ -3,13 +3,14 @@ package Camera;
import com.fazecast.jSerialComm.SerialPort;
import org.tinylog.Logger;
/**
* Pan Tilt Controller
* Using PelcoD protocol
* Source : https://www.commfront.com/pages/pelco-d-protocol-tutorial
* Source : <a href="https://www.commfront.com/pages/pelco-d-protocol-tutorial">PelcoD Tutorial</a>
*/
public class PanTiltController {
private final SerialPort serialPort;
private SerialPort serialPort;
private final byte cameraid;
/**
* Open Pan Tilt Controller
@@ -17,21 +18,38 @@ public class PanTiltController {
* @param baudrate baudrate used
*/
public PanTiltController(String portname, int baudrate, int cameraid){
serialPort = SerialPort.getCommPort(portname);
serialPort.setBaudRate(baudrate);
this.cameraid = (byte)cameraid;
if (serialPort.openPort()){
Logger.info("Serial Port {} opened successfully at {}", portname, baudrate);
} else {
Logger.info("Failed to open Serial Port {} at {}", portname, baudrate);
}
SerialPort[] comports = SerialPort.getCommPorts();
if (comports.length>0){
for (SerialPort port : comports){
Logger.info("Available Serial Port : {}", port.getSystemPortName());
if (port.getSystemPortName().equals(portname)){
Logger.info("Serial Port {} found", portname);
serialPort = port;
break;
}
}
if (serialPort!=null){
serialPort.setBaudRate(baudrate);
if (serialPort.openPort()){
Logger.info("Serial Port {} opened successfully at {}", portname, baudrate);
} else {
Logger.info("Failed to open Serial Port {} at {}", portname, baudrate);
}
} else Logger.info("Serial Port {} not found", portname);
} else Logger.info("No Serial Port found");
}
/**
* Close Pan Tilt Controller
*/
public void Close(){
serialPort.closePort();
if (serialPort!=null) serialPort.closePort();
Logger.info("Serial Port closed");
}

View File

@@ -7,24 +7,59 @@ import org.tinylog.Logger;
import java.util.concurrent.atomic.AtomicBoolean;
import static Other.SomeCodes.gson;
public class RtspGrabber {
private final String rtspUrl;
private FFmpegFrameGrabber grabber;
private final AtomicBoolean isGrabbing = new AtomicBoolean(false);
private @Getter Frame lastHQFrame = null;
private @Getter Frame lastLQFrame = null;
private @Getter String lastHQBase64 = null;
private @Getter String lastLQBase64 = null;
private Frame lastHQFrame = null;
private Frame lastLQFrame = null;
private String lastHQBase64 = null;
private String lastLQBase64 = null;
private @Getter int HQWidth = 0;
private @Getter int HQHeight = 0;
private @Getter int LQWidth = 0;
private @Getter int LQHeight = 0;
private GrabbingTask grabbingTask;
public RtspGrabber(String ip, String path) {
this.rtspUrl = "rtsp://" + ip + path;
Logger.info("RtspGrabber created with url: " + rtspUrl);
}
private synchronized void setLastHQFrame(Frame frame){
lastHQFrame = frame;
}
public synchronized Frame getLastHQFrame(){
return lastHQFrame;
}
private synchronized void setLastLQFrame(Frame frame){
lastLQFrame = frame;
}
public synchronized Frame getLastLQFrame(){
return lastLQFrame;
}
private synchronized void setLastHQBase64(String base64){
lastHQBase64 = base64;
}
public synchronized String getLastHQBase64(){
return lastHQBase64;
}
private synchronized void setLastLQBase64(String base64){
lastLQBase64 = base64;
}
public synchronized String getLastLQBase64(){
return lastLQBase64;
}
/**
* Start grabbing frames from rtsp
* @param useTcp Use tcp instead of udp
@@ -34,11 +69,12 @@ public class RtspGrabber {
try{
grabber = FFmpegFrameGrabber.createDefault(rtspUrl);
if (useTcp) grabber.setOption("rtsp_transport", "tcp");
grabber.setTimeout(2000);
grabber.setImageWidth(width);
grabber.setImageHeight(height);
grabber.setPixelFormat(avutil.AV_PIX_FMT_BGR24);
grabber.start();
avutil.av_log_set_level(avutil.AV_LOG_ERROR);
@@ -49,7 +85,7 @@ public class RtspGrabber {
tt.setOnHQFrameUpdate(value -> {
if (value!=null){
if (value.imageWidth>0 && value.imageHeight>0){
lastHQFrame = value;
setLastHQFrame(value);
HQWidth = value.imageWidth;
HQHeight = value.imageHeight;
}
@@ -59,14 +95,15 @@ public class RtspGrabber {
tt.setOnLQFrameUpdate(value -> {
if (value!=null){
if (value.imageWidth>0 && value.imageHeight>0){
lastLQFrame = value;
setLastLQFrame(value);
LQWidth = value.imageWidth;
LQHeight = value.imageHeight;
}
}
});
tt.setOnHQBase64Update(value -> lastHQBase64 = value);
tt.setOnLQBase64Update(value -> lastLQBase64 = value);
tt.setOnHQBase64Update(this::setLastHQBase64);
tt.setOnLQBase64Update(this::setLastLQBase64);
grabbingTask = tt;
new Thread(tt).start();
} catch (Exception e){
@@ -78,17 +115,28 @@ public class RtspGrabber {
* Stop grabbing frames
*/
public void Stop(){
isGrabbing.set(false);
if (grabbingTask!=null){
grabbingTask.Stop();
}
grabbingTask = null;
if (grabber!=null) {
try{
isGrabbing.set(false);
grabber.stop();
grabber.releaseUnsafe();
Logger.info("Grabber stopped");
} catch (Exception e){
Logger.error("Error stopping grabber: " + e.getMessage());
}
}
grabber = null;
}
public String LQStreamingStatus(){
return gson.toJson(new String[]{String.valueOf(LQWidth), String.valueOf(LQHeight) , String.valueOf(grabbingTask.getCaptureFPS())});
}
public String HQStreamingStatus(){
return gson.toJson(new String[]{String.valueOf(HQWidth), String.valueOf(HQHeight) , String.valueOf(grabbingTask.getCaptureFPS())});
}
}