惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
宝玉的分享
宝玉的分享
Jina AI
Jina AI
IT之家
IT之家
博客园 - Franky
MyScale Blog
MyScale Blog
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
雷峰网
雷峰网
WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
美团技术团队
S
SegmentFault 最新的问题
罗磊的独立博客
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
D
Docker
博客园 - 司徒正美
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
阮一峰的网络日志
阮一峰的网络日志
M
MIT News - Artificial intelligence

博客园 - 方东信

【far 语言】语言文档目录 【far 语言】注解系统 【far 语言】数组 【far 语言】并发编程(协程) 【far 语言】控制流 【far 语言】异常处理 【far 语言】farcc 构建工具 【far 语言】函数 【far 语言】组合与继承 【far 语言】接口与泛型 【far 语言】List 列表 【far 语言】Map 映射 【far 语言】原生内存与 FFI 【far 语言】字符串 【far 语言】语法总览 【far 语言】类型系统 Java 远程调用类,控制类的办法,老了,记不住了。靠 java opc ua 基于s7 pand3d实现服务端渲染并推流 UI弹窗遮罩屏蔽触发事件的处理 far的数据类型 Windows下Tesseract-OCR的安装与使用 LoRA配置 大模型三阶段训练方法(LLaMa Factory) windows系统下anaconda的安装和使用 trl ppo 【手把手从零实现】Qwen2.5-VL:环境配置/功能实验(图片识别理解、目标检测、文字OCR、文档解析、视频理解)/模型微调(MS-Swift 和 LLaMA-Factory) seata 1.8.0 报错大全 Springboot 报错 java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking vLLM部署多模态大模型Qwen2.5-VL-3B-Instruct
音视频:JavaCV 采集桌面画面并显示的方法
方东信 · 2025-11-12 · via 博客园 - 方东信

JavaCV 封装了javacpp-presets库很多native API,简化了开发,对Java程序员来说比较友好。

之前使用JavaCV库都是使用ffmpeg native API开发,这种方式太多坑了,还是JavaCV封装好的库开发方便。

cut-off

引入依赖

前几天刚刚发布了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>

cut-off

OpenCV采集摄像头数据

JavaCV的demo中有摄像头及麦克风采集音视频数据的例子,例子中采集摄像头数据时使用的就是OpenCVFrameGrabber,而画面回显采用CanvasFrame这个类。

demo &gt;&gt; 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();
  }
}

画面预览效果图:

摄像头画面回显

cut-off

FFmpeg采集摄像头数据

FFmpegFrameGrabber采集摄像头数据需要指定输入,如:video=Integrated Camera,这里Integrated Camera是摄像头的设备名。

可以通过以下方式获取摄像头设备名:

  1. 打开“计算机管理”-&gt;“设备管理器”-&gt;“照相机”。

  2. 使用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();
  }
}

cut-off

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");
    

画面预览效果图:

桌面画面采集回显

这里由于我的电脑是2K屏,这里1920x1080只是截图了屏幕的一部分。

对比,使用FFmeg native API 开发,JavaCV封装好的API确实少了很多功夫。

Rust编程语言群 1036955113
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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。