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>

OpenCVFrameGrabber采集摄像头数据

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

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

画面预览效果图:

FFmpegFrameGrabber采集摄像头数据

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

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

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

采用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();
}
}

FFmpegFrameGrabber采集桌面数据

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

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只是截图了屏幕的一部分。

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



关注公众号,阅读更多关于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. C# wpf window

    使用vs2017 新建wpf 项目 MainWindow 被定义为partial,是因为他要和xaml的一些属性组合在一起,然后再运行起来,这正是 InitailizeCompoent 这个函数要干的 ...

  2. surge & free online docs website service

    surge & free online docs website service surge 自定义域的域名 https://surge.sh/help/adding-a-custom-dom ...

  3. random array & shuffle 洗牌算法 / 随机算法

    random array & shuffle shuffle 洗牌算法 / 随机算法 https://en.wikipedia.org/wiki/Fisher–Yates_shuffle ES ...

  4. 小程序 & taro 踩坑指南

    小程序 & taro 踩坑指南 微信开发者工具, 不支持 react bug https://github.com/NervJS/taro/issues/5042 solution just ...

  5. Python元组拆包捡到8倍镜快准狠

    元组拆包 元组是不可变列表,列表是通过索引取值的,元组也是: tuple_test = (1, 2, 3) a = tuple_test[0] b = tuple_test[1] c = tuple_ ...

  6. 彻底解决Asp.netCore WebApi 3.1 跨域时的预检查204 options重复请求的问题

    Asp.netCore WebApi 3.1 跨域的预检查options问题 1:我们直接使用core跨域的中间件 ,注入跨域服务, services.AddCors(options => { ...

  7. windows下的python环境安装

    windows下python开发环境的搭建还是很方便的 python本体的下载可以通过官方渠道,也可以通过windows应用商店,这里推荐后者,因为前者还要设置环境变量,而且我设置了之后cmd下也没有 ...

  8. idea添加汉化包之后出现的一些问题 解决方案

    先把原链接放在这:https://jingyan.baidu.com/article/fb48e8bef2bcb66e622e14d2.html 关掉idea之后,一定要记住是在压缩软件中打开,而不是 ...

  9. MapString转Map

    当把map使用toString方法转换后,如何再转换为map对象呢?方法很简单,把字符串进行截取,依次存放到新的map中: public static Map<String,Object> ...

  10. ADT基础(三)—— HashMap

    ADT基础(三)-- HashMap 1 哈希表 哈希表(hash table),也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维 ...