JavaCV

JavaCV是多种开源计算机视觉库组成的包装库一组jar包。
JavaCV是一款基于JavaCPP 调用方式(JNI的一层封装),由多种开源计算机视觉库组成的包装库,封装了包含FFmpeg、OpenCV、tensorflow、caffe、tesseract、libdc1394、OpenKinect、videoInput和ARToolKitPlus等在内的计算机视觉领域的常用库和实用程序类。JavaCV基于Apache License Version 2.0协议和GPLv2两种协议,JavaCV支持Windows、Linux、MacOS,Android、IOS在内的Java平台上调用这些接口。

JavaCPP

FFmpeg是C语言中著名的音视频库(不是c++,使用c++调用ffmpeg库的性能损失与Java方式调用损耗相差并不大)。
JavaCV基于JavaCPP在FFmpeg和Java之间构建了桥梁;当然这是有性能损失的,性能损失暂且不提;由于调用ffmpeg之于jvm是native方法,所以通过ffmpeg创建的结构体实例与常量、方法等等都是使用堆外内存(存放在元空间【本地内存】)都需要像C那样手动的释放这些资源(jvm并不会帮你回收这部分), 以此来保证不会发生内存溢出/泄露等风险。

JAVACV 与 JavaCPP关系

JavaCPP提供了在Java中高效访问本地C++的方法。采用JNI技术实现,支持所有Java实现包括Android系统,Avian 和 RoboVM。
JavaCPP提供了一系列的Annotation将Java代码映射到C++代码,并使用一个可执行的jar包将C代码转化为可以从JVM内调用的动态链接库文件。可以简单的理解为JavaCV利用了JavaCPP和JavaCPP Presets做支持

JAVACV封装的一些关键对象与流程

JavaCV通过JavaCPP调用了FFmpeg,并且对FFmpeg复杂的操作进行了封装;
关键对象:

  • FrameGrabber:用于获取视频流(FFmpegFrameGrabber是具体的FrameGrabber实现)。
  • FrameRecorder:用于记录视频流(FFmpegFrameRecorder是具体的FrameRecorder实现)。
  • Frame:用于处理图像或视频帧。
    处理流程:
  • 实例化FrameGrabber(例如FFmpegFrameGrabber)。
  • 设置必要的参数(例如输入视频文件路径或网络流地址)。
  • 调用start()方法开始获取视频流。
  • 循环获取视频帧(Frame对象)。
  • 对获取到的帧进行处理(例如转换格式、编码、裁剪等)。
  • 实例化FrameRecorder(例如FFmpegFrameRecorder)。
  • 设置输出文件路径、视频分辨率、格式等参数。
  • 调用start()方法开始记录帧。
  • 将处理过的帧传递给FrameRecorder进行记录。
  • 处理完毕后,调用stop()方法停止记录。
  • 释放资源。
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("input.mp4");
grabber.start();
 
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("output.mp4", 640, 480);
recorder.setFormat("mp4");
recorder.start();
 
Frame frame;
while ((frame = grabber.grabFrame()) != null) {
    // 对帧进行处理
    // ...
    recorder.record(frame);
}

grabber.stop();
recorder.stop();
grabber.release();
recorder.release();

帧抓取器(FrameGrabber)

封装了FFmpeg的检索流信息,自动猜测视频解码格式,音视频解码等具体API,并把解码完的像素数据(可配置像素格式)或音频数据保存到Frame中返回。

帧录制器/推流器(FrameRecorder)

封装了FFmpeg的音视频编码操作和封装操作,把传参过来的Frame中的数据取出并进行编码、封装、发送等操作流程。

帧(Frame)

用于存放音视频帧(图像像素和音频采样数据,如果没有配置FrameGrabber的像素格式和音频格式,那么默认解码后的视频格式yuv420j,音频则是pcm采样数据)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐