一、代码逻辑
我得逻辑是传入rtsp流和文件路径来进行截图保存,但是当传入的路径包含中文时那么路径下的图片就不显示也就是保存失败。修改之前的代码如下:
public static String captureScreen(String rtspStreamUrl, String outputFolderPath) {
String outputFileName = null; // 在try块之外定义outputFileName
FrameGrabber grabber = new FFmpegFrameGrabber(rtspStreamUrl);
OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
try {
grabber.start();
Frame frame = null;
boolean captureOneImage = true;
while (captureOneImage) {
frame = grabber.grab();
if (frame != null) {
Mat mat = converter.convert(frame);
// Generate a unique file name for each captured image
outputFileName = outputFolderPath + "/" + System.currentTimeMillis() + ".jpg";
org.bytedeco.opencv.global.opencv_imgcodecs.imwrite(outputFileName, mat);
captureOneImage = false; // Set the flag to false to stop capturing after one image
}
// Add a delay (adjust as needed)
Thread.sleep(1000);
}
} catch (FrameGrabber.Exception | InterruptedException e) {
e.printStackTrace();
} finally {
try {
grabber.stop();
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
}
}
return outputFileName; // 在方法的最后返回outputFileName的值
}
二、修改代码
1、导入Java2DFrameConverter
类:
import org.bytedeco.javacv.Java2DFrameConverter;
2、在代码中使用Java2DFrameConverter
进行转换:
// 创建Java2DFrameConverter对象
Java2DFrameConverter converter = new Java2DFrameConverter();
// 将Frame对象转换为BufferedImage对象
BufferedImage image = converter.getBufferedImage(frame);
3、使用Path
和Files
类来创建文件和目录。这样可以确保文件操作正确处理中文路径。
outputFileName = outputFolderPath + "/" + System.currentTimeMillis() + ".jpg";
Path outputPath = Paths.get(outputFileName);
try {
Files.createDirectories(outputPath.getParent()); // 创建目录
org.bytedeco.opencv.global.opencv_imgcodecs.imwrite(outputPath.toString(), mat); //保存图片
} catch (IOException e) {
e.printStackTrace();
}
三、修改之后的代码
代码修改之后已经可以正常保存带有中文路径的图片了
public static String captureScreen(String rtspStreamUrl, String outputFolderPath) {
String outputFileName = null; // 在try块之外定义outputFileName
FrameGrabber grabber = new FFmpegFrameGrabber(rtspStreamUrl);
//OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
Java2DFrameConverter converter = new Java2DFrameConverter();
try {
grabber.start();
Frame frame = null;
boolean captureOneImage = true;
while (captureOneImage) {
frame = grabber.grab();
if (frame != null) {
//Mat mat = converter.convert(frame);
// Generate a unique file name for each captured image
outputFileName = outputFolderPath + "/" + System.currentTimeMillis() + ".jpg";
Path outputPath = Paths.get(outputFileName);
// 将Mat对象转换为BufferedImage对象
BufferedImage image = converter.getBufferedImage(frame);
try {
Files.createDirectories(outputPath.getParent()); // 创建目录
// 保存图片
ImageIO.write(image, "jpg", outputPath.toFile());
} catch (IOException e) {
e.printStackTrace();
}
captureOneImage = false; // Set the flag to false to stop capturing after one image
}
// Add a delay (adjust as needed)
Thread.sleep(1000);
}
} catch (FrameGrabber.Exception | InterruptedException e) {
e.printStackTrace();
} finally {
try {
grabber.stop();
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
}
}
return outputFileName; // 在方法的最后返回outputFileName的值
}