JavaCV 是一款开源的视觉处理库,基于GPLv2协议,对各种常用计算机视觉库封装后的一组jar包,封装了OpenCV、libdc1394、OpenKinect、videoInput和ARToolKitPlus等计算机视觉编程人员常用库的接口。JavaCV通过其中的utility类方便的在包括Android在内的Java平台上调用这些接口。


终端视频播放推流方案

方案一:

优点:支持流媒体播放,缺点:服务器端编解码性能差(编解码)

基于vod视频播放业务架构图 视频播放方案_视频

数据流处理:

基于vod视频播放业务架构图 视频播放方案_视频_02


方案二:

优点:服务器压力小(不做编解码),缺点:客户端播放支持方案固定

基于vod视频播放业务架构图 视频播放方案_javacv_03

流媒体处理流程

基于vod视频播放业务架构图 视频播放方案_opencv_04

相关知识说明

JavaCV的一些知识

Mat类表示一个图片矩阵,要处理的图片都要读进这个矩阵中。

VideoCapture类表示一个视频对象,它的open()方法传视频地址就是打开视频,传设备号就是打开摄像头。

图片的一些必备知识

(一)图像的认识

图片分矢量图和像素图图,矢量图是由数学表示,比较抽象,不太好理解,比如你脑海里想象一个四边形,这个四边形就是矢量的。CDR、CAD处理的图像就是矢量图,因为是数学表示的,可以无限放大和缩小,不会产生锯齿。像素图是由矩阵的像素点组成,每个像素点就是个小方块,每个方块只能显示一种颜色,单位面积内像素点越密集,图像越清晰。但是放大以后因为像素点是方形的,所以能看见锯齿。PS软件就是处理像素图的。JavaCV也是典型的像素图处理软件,通过相机、摄像头获取到的图片都是像素图。

(二)像素点的认识

像素点每次只能显示一个颜色,颜色由3基本色(RGB)或者4基本色(CMYK)组成,在任何设备彩色屏幕上显示的都是RGB像素,彩色打印机打印的是CMYK色。这就是为什么在电脑上显示的颜色和打印出来的颜色有小许不同。JavaCV主要算法就是计算像素点的颜色,通过各种数学变换得到相似度一类的。笔者个人认为这种方式太牵强,还是要在矢量图上下功夫才行,因为大脑内的所有图像都是矢量的。(个人意见,勿喷,要脸)

(二)视频的认识

视频由图片组成,一帧代表一张图片,帧率就是指每秒切换多少张图片。


相关学习参考资料



OpenCV 手册(你可以从这里开始学习编码环境的构建):http://opencv-java-tutorials.readthedocs.io/en/latest/


OpenCV API:https://docs.opencv.org/

JavaCV下载地址:http://www.softpedia.com/get/Programming/Other-Programming-Files/JavaCV.shtml

JavaCV Github地址:https://github.com/bytedeco/javacv

JavaCV示例:https://github.com/bytedeco/javacv-examples

个人学习示例:

https://github.com/SunFlowerOfProtocol/javacv-cvnavi-demo


更多实际编码示例参考:Java音视频开发详解

开发Maven依赖配置

pom.xml,有些包根据自己的环境做选择。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cvnavi.javacv</groupId>
    <artifactId>javacv-cvnavi-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.3.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp</artifactId>
            <version>1.3.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.3.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv -->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>opencv</artifactId>
            <version>3.2.0-1.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv-platform -->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>opencv-platform</artifactId>
            <version>3.2.0-1.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/ffmpeg -->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg</artifactId>
            <version>3.2.1-1.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/ffmpeg-platform -->
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg-platform</artifactId>
            <version>3.2.1-1.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.hoary.ffmpeg/FFmpeg-windows-x86_64 -->
        <dependency>
            <groupId>com.github.hoary.ffmpeg</groupId>
            <artifactId>FFmpeg-windows-x86_64</artifactId>
            <version>2.0.1.1</version>
        </dependency>

    </dependencies>

</project>






注:JavaCV实际上是封装过OpenCV的,如果想了解更多 建议还是从OpenCV开始学习基础类的操作。