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

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

引入依赖

前几天刚刚发布了1.5.5,这里使用最新的javacv依赖:

  1. <properties>
  2. <javacpp.version>1.5.5</javacpp.version>
  3. </properties>
  4. <dependencies>
  5. <dependency>
  6. <groupId>org.bytedeco</groupId>
  7. <artifactId>javacv</artifactId>
  8. <version>${javacpp.version}</version>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.bytedeco</groupId>
  12. <artifactId>javacv-platform</artifactId>
  13. <version>${javacpp.version}</version>
  14. </dependency>
  15. </dependencies>

OpenCVFrameGrabber采集摄像头数据

javacv的demo中有摄像头及麦克风采集音视频数据的例子(WebcamAndMicrophoneCapture),例子采集摄像头数据使用的就是OpenCVFrameGrabber,视频画面回显采用的是CanvasFrame

  1. public class Sample01_Camera {
  2. @SuppressWarnings("resource")
  3. public static void main(String[] args) throws Exception {
  4. OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
  5. grabber.setImageWidth(1280);
  6. grabber.setImageHeight(720);
  7. grabber.start();
  8. CanvasFrame canvas = new CanvasFrame("摄像头");
  9. canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  10. canvas.setAlwaysOnTop(true);
  11. while (canvas.isDisplayable()) {
  12. canvas.showImage(grabber.grab());
  13. TimeUnit.MILLISECONDS.sleep(40);
  14. }
  15. grabber.stop();
  16. }
  17. }

画面预览效果图:

FFmpegFrameGrabber采集摄像头数据

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

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

  1. 打开“计算机管理”->“设备管理器”->“照相机”
  2. 使用ffmpeg命令,具体查看之前我的文章 JavaCV FFmpeg采集摄像头YUV视频数据

采用FFmpeg查看本机设备的命令:

  1. ffmpeg.exe -list_devices true -f dshow -i dummy

FFmpegFrameGrabber的使用方式跟OpenCVFrameGrabber的方式是一样的,只不过OpenCVFrameGrabber指定的是设备索引,而FFmpegFrameGrabber指定设备输入。

  1. public class Sample02_Camera {
  2. @SuppressWarnings("resource")
  3. public static void main(String[] args) throws Exception {
  4. FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("video=Integrated Camera");
  5. grabber.setImageWidth(1280);
  6. grabber.setImageHeight(720);
  7. grabber.setFormat("dshow");
  8. grabber.start();
  9. CanvasFrame canvas = new CanvasFrame("摄像头");
  10. canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  11. canvas.setAlwaysOnTop(true);
  12. while (canvas.isDisplayable()) {
  13. canvas.showImage(grabber.grab());
  14. TimeUnit.MILLISECONDS.sleep(40);
  15. }
  16. grabber.stop();
  17. }
  18. }

FFmpegFrameGrabber采集桌面数据

FFmpegFrameGrabber采集桌面采用gdigrab,参考雷神的博客 FFmpeg源代码简单分析:libavdevice的gdigrab

  1. public class Sample03_Desktop {
  2. // https://blog.csdn.net/leixiaohua1020/article/details/44597955
  3. @SuppressWarnings("resource")
  4. public static void main(String[] args) throws Exception {
  5. FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("desktop");
  6. grabber.setFormat("gdigrab");
  7. grabber.setOption("offset_x", "0");
  8. grabber.setOption("offset_y", "0");
  9. grabber.setOption("framerate", "25");
  10. grabber.setOption("draw_mouse", "0");
  11. grabber.setOption("video_size", "1920x1080");
  12. // 这种形式,双屏有问题
  13. // grabber.setImageWidth(1920);
  14. // grabber.setImageWidth(1080);
  15. grabber.start();
  16. CanvasFrame canvas = new CanvasFrame("摄像头");
  17. canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  18. canvas.setAlwaysOnTop(true);
  19. while (canvas.isDisplayable()) {
  20. canvas.showImage(grabber.grab());
  21. TimeUnit.MILLISECONDS.sleep(40);
  22. }
  23. grabber.stop();
  24. }
  25. }

画面预览效果图:

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

=========================================================



关注公众号,阅读更多关于javacv的文章。

JavaCV 采集摄像头及桌面视频数据的更多相关文章

  1. JavaCV 采集摄像头和麦克风数据推送到流媒体服务器

    越来越觉得放弃JavaCV FFmpeg native API,直接使用JavaCV二次封装的API开发是很明智的选择,使用JavaCV二次封装的API开发避免了各种内存操作不当引起的crash. 上 ...

  2. 使用Chrome采集摄像头并生成视频下载

    主要使用2个技术点:WebRtc 的 getUserMedia 和 MediaRecorder 注意点 开始录制调用 start 方法要传入一个采样间隔,这样录制的媒体会按照你设置的值进行分割成一个个 ...

  3. JavaCV FFmpeg采集摄像头YUV数据

    前阵子使用利用树莓派搭建了一个视频监控平台(传送门),不过使用的是JavaCV封装好的OpenCVFrameGrabber和FFmpegFrameRecorder. 其实在javacpp项目集中有提供 ...

  4. Android中直播视频技术探究之---采集摄像头Camera视频源数据进行推流(采用金山云SDK)

    一.前言 在之前已经详细介绍了Android中的一种视频数据源:Camera,不了解的同学可以点击进入:Android中Camera使用详解 ,在这篇文章中我们介绍了如何采集摄像头的每一帧数据,然后进 ...

  5. Android 音视频开发(四):使用 Camera API 采集视频数据

    本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...

  6. 如何用FFmpeg API采集摄像头视频和麦克风音频,并实现录制文件的功能

    之前一直用Directshow技术采集摄像头数据,但是觉得涉及的细节比较多,要开发者比较了解Directshow的框架知识,学习起来有一点点难度.最近发现很多人问怎么用FFmpeg采集摄像头图像,事实 ...

  7. 摄像头脸部识别 (1)opencv 抓取视频数据并保存

    摄像头脸部识别 (1)opencv 抓取视频数据并保存 基于python 和 opencv 3.4.0 (兼容 opencv 2.X 参考注释),详细如代码 import numpy as np im ...

  8. FFMPEG采集摄像头数据并切片为iPhone的HTTP Stream流

    一.Windows下面编译ffmpeg 首先需要解决的问题是:在windows下面编译 ffmpeg, 并让其支持dshow, 本人把ffmpeg编译成功了, 但是编译出来的ffmpeg不支持dsho ...

  9. FFmpeg采集音视频数据命令

    文章转自:https://www.jianshu.com/p/4709ccbda3f9 1.ffmpeg 把文件当做直播推送至服务器 (RTMP + FLV) ffmpeg - re -i demo. ...

随机推荐

  1. Netty(五)Netty 高性能之道

    4.背景介绍 4.1.1 Netty 惊人的性能数据 通过使用 Netty(NIO 框架)相比于传统基于 Java 序列化+BIO(同步阻塞 IO)的通信框架,性能提升了 8 倍多.事 实上,我对这个 ...

  2. Netty(三)基于Bio和Netty 的简易版Tomcat

    参考代码: https://github.com/FLGBetter/tomcat-rpc-demo

  3. 探索 .NET Core 依赖注入的 IServiceCollection

    如果您使用了.NET Core,则很可能已使用Microsoft.Extensions.DependencyInjection中的内置依赖项注入容器,在本文中,我想更深入地了解Microsoft De ...

  4. CSS 水平滚动条 bug & width auto increase bug

    CSS 水平滚动条 bug css overflow & width auto increase bug 问题排查方式 删除可疑的模块,一步步找到问题的原因,定位问题所在 寻找可能会导致 wi ...

  5. how to write string to file in bash

    how to write string to file in bash https://stackoverflow.com/questions/22713667/shell-script-how-to ...

  6. 封装 React Native 原生组件(iOS / Android)

    封装 React Native 原生组件(iOS / Android) 在 React Native中,有很多种丰富的组件了,例如 ScrollView.FlatList.SectionList.Bu ...

  7. uniapp 万年历

    大量代码来至这里 <template> <view class="calendar-main"> <!-- 当前年月 --> <view ...

  8. 大胆预计SPC算力空投收益,月收益22.8%

    此前,NGK官方公告表示,NGK算力持有者获得SPC的数量是根据200万枚SPC除以全网算力总量决定的. 举个例子,假设全网算力总量为500万,那么每个算力持有者如果持有一个算力,则可获得200万÷5 ...

  9. Datahero inc:区块链方案如何在现有食品溯源系统里实现落地?

    在食品行业,区块链溯源平台的应用,主要是指围绕"从农田到餐桌"的安全管理理念,综合运用区块链技术.大数据技术和二维码技术等前沿技术,具有产品生产企业管理. 产品生产档案 (农药/防 ...

  10. django学习-5.获取url参数和name的作用

    1.前言 假如我们要打开这两个博客园地址:[https://www.cnblogs.com/xiamen-momo/archive/2020/11.html].[https://www.cnblogs ...