音视频:JavaCV 采集桌面画面并显示的方法
JavaCV 封装了javacpp-presets库很多native API,简化了开发,对Java程序员来说比较友好。
之前使用JavaCV库都是使用ffmpeg native API开发,这种方式太多坑了,还是JavaCV封装好的库开发方便。

引入依赖
前几天刚刚发布了1.5.5,这里使用最新的javacv依赖:
<properties>
<javacpp.version>1.5.5</javacpp.version></properties><dependencies><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>${javacpp.version}</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>${javacpp.version}</version></dependency></dependencies>

OpenCV采集摄像头数据
JavaCV的demo中有摄像头及麦克风采集音视频数据的例子,例子中采集摄像头数据时使用的就是OpenCVFrameGrabber,而画面回显采用CanvasFrame这个类。
demo >> WebcamAndMicrophoneCapture
public class Sample01_Camera {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.setImageWidth(1280);
grabber.setImageHeight(720);
grabber.start();
CanvasFrame canvas = new CanvasFrame("摄像头");
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while (canvas.isDisplayable()) {
canvas.showImage(grabber.grab());
TimeUnit.MILLISECONDS.sleep(40);
}
grabber.stop();
}
}
画面预览效果图:

摄像头画面回显

FFmpeg采集摄像头数据
FFmpegFrameGrabber采集摄像头数据需要指定输入,如:video=Integrated Camera,这里Integrated Camera是摄像头的设备名。
可以通过以下方式获取摄像头设备名:
-
打开“计算机管理”->“设备管理器”->“照相机”。
-
使用ffmpeg命令,查看本机设备名称。
使用ffmpeg查看本机设备名的命令:
ffmpeg.exe -list_devices true -f dshow -i dummy
在我的电脑上结果显示如下:

本地设备名称
FFmpegFrameGrabber的使用方式跟OpenCVFrameGrabber的方式其实是一样的,只不过OpenCVFrameGrabber指定的是设备索引,而FFmpegFrameGrabber指定设备输入。
public class Sample02_Camera {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("video=Integrated Camera");
grabber.setImageWidth(1280);
grabber.setImageHeight(720);
grabber.setFormat("dshow");
grabber.start();
CanvasFrame canvas = new CanvasFrame("摄像头");
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while (canvas.isDisplayable()) {
canvas.showImage(grabber.grab());
TimeUnit.MILLISECONDS.sleep(40);
}
grabber.stop();
}
}

FFmpeg采集桌面数据
FFmpegFrameGrabber采集桌面采用gdigrab,参考雷神的博客 [FFmpeg源代码简单分析:libavdevice的gdigrab]
https://blog.csdn.net/leixiaohua1020/article/details/44597955
public class Sample03_Desktop {
// https://blog.csdn.net/leixiaohua1020/article/details/44597955
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop");
grabber.setFormat("gdigrab");
grabber.setOption("offset_x", "0");
grabber.setOption("offset_y", "0");
grabber.setOption("framerate", "25");
grabber.setOption("draw_mouse", "0");
grabber.setOption("video_size", "1920x1080");
// 这种形式,双屏有问题
// grabber.setImageWidth(1920);
// grabber.setImageWidth(1080);
grabber.start();
CanvasFrame canvas = new CanvasFrame("摄像头");
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while (canvas.isDisplayable()) {
canvas.showImage(grabber.grab());
TimeUnit.MILLISECONDS.sleep(40);
}
grabber.stop();
}
}
画面预览效果图:

桌面画面采集回显
这里由于我的电脑是2K屏,这里1920x1080只是截图了屏幕的一部分。
对比,使用FFmeg native API 开发,JavaCV封装好的API确实少了很多功夫。
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号