1、
JavaCV [1] 是一款基于JavaCPP [2]调用方式(JNI的一层封装),由多种开源计算机视觉库组成的包装库,封装了包含FFmpeg、OpenCV、tensorflow、caffe、tesseract、libdc1394、OpenKinect、videoInput和ARToolKitPlus等在内的计算机视觉领域的常用库和实用程序类。
JavaCV支持Windows、Linux、MacOS,Android、IOS在内的Java平台上调用这些接口。
2、javacv精简依赖,只依赖win64下的ffmpeg
<?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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/></parent><groupId>com.ldf</groupId><artifactId>j-media-server</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><javacpp.platform.macosx-x86_64>macosx-x86_64</javacpp.platform.macosx-x86_64><javacpp.platform.linux-x86_64>linux-x86_64</javacpp.platform.linux-x86_64><javacpp.platform.windows-x86_64>windows-x86_64</javacpp.platform.windows-x86_64><javacv.version>1.5.10</javacv.version><javacv.ffmpeg.version>6.1.1-1.5.10</javacv.ffmpeg.version></properties><dependencies><!--Spring Boot 相关--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId><exclusions><!-- 内置 3.8.4.Final 版本存在问题--><exclusion><groupId>org.jboss.xnio</groupId><artifactId>xnio-nio</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.jboss.xnio</groupId><artifactId>xnio-nio</artifactId><version>3.8.9.Final</version></dependency><!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.8.25</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-json</artifactId><version>5.8.25</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><!--doc--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi2-spring-boot-starter</artifactId><version>4.5.0</version></dependency><!--自1.0.8后不需要本地instal--><dependency><groupId>com.aizuda</groupId><artifactId>zlm4j</artifactId><version>1.1.4</version></dependency><!-- https://mvnrepository.com/artifact/org.bytedeco/javacv --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>${javacv.version}</version></dependency><!--javacv 精简依赖 只依赖windows64位ffmpeg--><dependency><groupId>org.bytedeco</groupId><artifactId>javacpp</artifactId><version>${javacv.version}</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg</artifactId><version>${javacv.ffmpeg.version}</version><classifier>${javacpp.platform.windows-x86_64}</classifier></dependency><!--javacv 精简依赖 只依赖windows64位ffmpeg--></dependencies><!--腾讯云mvn--><repositories><repository><id>nexus-tencentyun</id><name>Nexus tencentyun</name><url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url></repository></repositories><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><includeSystemScope>true</includeSystemScope></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>
3、文件流
package com.ldf.media.exception;import lombok.SneakyThrows;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;import java.io.File;
import java.util.Objects;public class JnaTest {@SneakyThrowspublic static void main(String[] args) {String videoFile = "F:\\demo.mp4";String outFile = "11.mp4";File file = new File(outFile);FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoFile);grabber.start();int width = grabber.getImageWidth();int height = grabber.getImageHeight();double frameRate = grabber.getFrameRate();FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(file, width, height);if (grabber.getAudioChannels() > 0) {recorder.setAudioChannels(grabber.getAudioChannels());recorder.setAudioBitrate(grabber.getAudioBitrate());recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);}recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.start();while (true) {Frame frame = grabber.grab();if (Objects.isNull(frame)) {break;}recorder.record(frame);System.out.println(frame.timestamp);}recorder.stop();grabber.stop();}
}