一、概述
Java语言本身对音视频的处理不是很完善,想要在java中对音视频进行高效的处理,只能引入一些第三方的技术。
FFmpeg是一个使用C++编写的多媒体视频处理工具,处理音视频非常高效。
JavaCV是一个Github上的开源项目,该项目封装了很多C++的优秀的库,让这些库可以很方便的在Java中进行调用。本文就使用该项目中封装的FFmpeg依赖进行集成。
二、最佳集成实践
2.1、maven集成
<?xml version="1.0" encoding="UTF-8"?>
<project>
<properties>
<!-- 这里是JavaCV的版本 -->
<javacpp.version>1.5.7</javacpp.version>
<!-- 这里是JavaCV FFmpeg的版本 -->
<javacpp-ffmpeg.version>5.0</javacpp-ffmpeg.version>
</properties>
<dependencies>
<!-- javacv相关 -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>${javacpp.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- ffmpeg相关 -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>${javacpp-ffmpeg.version}-${javacpp.version}</version>
</dependency>
<!-- 这里的引入取决于你使用的平台,笔者这里需要在windows、linux中使用,所以需要引入相关平台的可执行文件、.so文件 -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>${javacpp-ffmpeg.version}-${javacpp.version}</version>
<classifier>windows-x86_64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>${javacpp-ffmpeg.version}-${javacpp.version}</version>
<classifier>linux-x86_64</classifier>
</dependency>
</dependencies>
</project>
2.2 gradle集成
// javacv相关, transitive=false表示不进行依赖传递,即排除所有子依赖
implementation (group: 'org.bytedeco', name: 'javacv', version: '1.5.7'){
transitive=false
}
implementation group: 'org.bytedeco', name: 'ffmpeg', version: '5.0-1.5.7'
implementation group: 'org.bytedeco', name: 'ffmpeg', version: '5.0-1.5.7', classifier: 'android-arm'
implementation group: 'org.bytedeco', name: 'ffmpeg', version: '5.0-1.5.7', classifier: 'android-arm64'
三、简单使用
下面就用一个简单的示例,演示一下如何在java项目中,执行ffmpeg的命令。使用javacv集成ffmpeg,除了调用javacv封装的类之外,还附带了ffmpeg的可执行文件。
// 加载ffmpeg可执行文件的路径
String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
// 使用ffmpeg将mp3文件转换为wav文件
ProcessBuilder processBuilder = new ProcessBuilder(ffmpeg, "-i", "input.mp3", "output.wav");
// 执行命令,并等待命令执行完成
int exitCode = processBuilder.inheritIO().start().waitFor();