JavaCV是一个热门的开源项目。今天我们简单介绍一下JavaCV的技术,然后简单介绍一下如何使用JavaCV进行视频开发。
1、OpenCV介绍
JavaCV的名字来源于著名的OpenCV开源软件库。CV是Computer Vision的缩写,中文含义是“计算机视觉”,OpenCV整体含义就是“开源的计算机视觉和机器学习软件库”。OpenCV主要用c语言开发,其中包含少量的c代码,包括大量的图形处理和计算机视觉功能。
OpenCV不依赖其他库,使用起来非常方便。当然,OpenCV也可以根据需要使用其他库。
OpenCV也可以用于嵌入式开发,我们可以从OpenCV中提取我们需要的代码来使用。
2、JavaCPP介绍
JavaCV是基于JavaCPP技术实现的,所以JavaCPP是JavaCV底层的技术核心。JavaCPP提供了一种机制,让Java程序可以通过注解,以JNI的方式调用C++代码中的函数。
因为JavaCPP易于使用,所以它对Java程序员来说是一个福音。很多高性能软件都是用C/C实现的,可以被Java程序使用。
令人惊讶的是,当我们在github上搜索javacv时,我们发现JavaCV和JavaCPP都是由bytedeco开发的:
原来,bytedeco为了实现JavaCV,专门开发了JavaCPP。太厉害了!
3、JavaCV介绍
,以JavaCPP为基础,实现JavaCV相对简单。 e="font-size:15px;">这是在Intellj IDEA中打开JavaCV时的源代码结构:
从类的数量来看,我们发现JavaCV总共才68个类,太简单了!
而当我们随意打开一个类的实现代码时,我们会发现类的代码同样简单。例如,这是fFmpegFrameRecorder的源代码,功能这么强的类,总共才1300行代码,而且代码逻辑也不复杂:

现在,我们再看一下JavaCV的依赖。JavaCV的pom.xml文件内容如下所示:

可以看到,JavaCV使用了JavaCPP、OpenCV、FFmpeg的相关依赖。
4、使用JavaCV开发视频程序
JavaCV现在用得最多的地方是机器学习,如果我们搜索一下github上使用JavaCV的代码,就可以得出这个结论。但这里只简单介绍一下JavaCV在视频开发中的应用。
JavaCV对视频的概念进行了封装,视频系统被分成两个部分:
- Grabber:从视频源抓取数据;
- Recorder:将数据记录到使用视频的地方;
例如,我们如果需要从某个RTSP地址读取视频流,并且希望使用FFmpeg提供的功能,使用FFmpegFrameGrabber即可实现,下面是一段启动Grabber的代码:
FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(rtspAddress);fFmpegFrameGrabber.setFormat("rtsp");fFmpegFrameGrabber.setOption("rtsp_transport", "tcp");fFmpegFrameGrabber.start();
同样,我们将视频发送到某个目的地址,并且希望使用FFmpeg提供的功能,使用FFmpegFrameRecorder即可实现。
FFmpegFrameGrabber的grab()方法,用于实现抓取视频的功能;FFmpegFrameRecorder的record()方法,用于实现记录视频的功能。
在处理过程中,我们可以获得两类视频数据:
- AVPacket:表示经过解复用,但是尚未解码的音视频数据;
- AVFrame:帧数据,表示经过解复用,并且经过解码之后的音视频数据。
5、JavaCV的优缺点
使用JavaCV的优点是上手快,开发速度也特别快,即使没有多少视频知识的程序员,也能开发出稳定高效的视频处理程序。
但JavaCV的这个优点,也导致了它的缺点,因为JavaCV太简单好用,就会导致我们的程序一旦运行出现错误或者异常,我们不能通过Java程序本身来找错误,我们必须查找JavaCV所依赖的C/C++语言的OpenCV、FFmpeg库来定位错误,这对于Java程序员来说,绝对是一种折磨。