由于公司业务需求,需要做录音播放功能,简单来说就是业务员跟客户的通话记录会落地保存,然后需要用H5实现录音播放,但是录音文件保存的是amr格式,H5的audio标签不支持amr格式,需要把amr格式转mp3格式。于是去查了查相关格式转换的资料,发现前端JS有类似的工具包,但后来想想这格式转换的事情还是给后端做比较合理吧,便在github上搜了半天找到两个Java的转码包,他们都是基于ffmpeg做的封装,兼容了Windos和Linux系统,话不多说,直接开干吧。
方式一:JAVE包
jave项目实际上早就有了,它封装了 ffmpeg 的命令,让开发者可以通过 Java 转换文件格式。不幸的是,这个项目可谓年久失修,存在一些问题,JAVE 项目的问题:
- 项目老旧没再维护。官网最近版本是2009年发布的,其依赖的ffmpeg早已过时,很多情况下用不了。
- 转码一直报异常 EncoderException: Stream mapping
- 没有发布maven仓库,而且 JAVE 本身也不是一个maven项目
- 不支持Mac OS
不过这里介绍的是一位开发者根据网上的资料进行整理和修改,并基于 JAVE 项目的修改和升级。同时将写好的轮子发布到了Maven的中央仓库,github项目地址,项目特点如下:
- 这是一个maven项目,而且已发布到中央仓库。
- 项目依赖的 ffmpeg 可执行文件经过验证可以使用(单元测试中提供了一个简单的检验方法)
- 解决了amr转mp3出现的 EncoderException: Stream mapping
- 支持 Linux/Windows/Mac 平台
使用方式也很简单,代码如下
引入maven依赖
<dependency>
<groupId>com.github.dadiyang</groupId>
<artifactId>jave</artifactId>
<version>1.0.6</version>
</dependency>
调用 AudioUtils.amrToMp3 方法
public void amrToMp3() {
File source = new File("target/test-classes/material/testAudio.amr");
File target = new File("testAudio.mp3");
AudioUtils.amrToMp3(source, target);
}
这个jar包本人在windows10上测试过,确实可行。
方式二:JAVE2包
这个开源项目也是在github上发现的,同样是基于ffmpeg实现(ffmpeg是C语言实现,不同的OS有所区别),不过看起来像是JAVE的升级版,不知道作者是不是一个人,JAVE2不仅仅支持音频还支持视频转码,可谓更加强大。JAVE2(Java音频视频编码器)库是ffmpeg项目上的Java包装器。开发人员可以利用JAVE2将音频和视频文件从一种格式转换到另一种格式。例如,可以将AVI文件转换为MPEG文件,可以将DivX视频流更改为(类似于youtube的)Flash FLV文件,可以将WAV音频文件转换为MP3或Ogg Vorbis文件,可以分离和转换音频和视频轨迹,可以调整视频大小,更改其大小和比例等。
环境支持
JAVE2 需要 Java 8 or higher,JAVE2可以支持在哪些OS上格式转码呢
操作系统 | Windows x32,x64 | MacOS x32,x64 | Linux x32,x64 |
---|---|---|---|
是否支持 | 是 | 是 | 是 |
在使用上JAVE2做了很多定制化需求,例如在引入时,就可以根据不同OS按需引入
引入maven依赖
全平台依赖引入
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>2.7.3</version>
</dependency>
这样引入包括了支持平台的所有二进制文件,一劳永逸。
单个平台引入
当我们只想在Linux上运行时,我们可以只引入Linux的二进制文件,从而达到减少依赖的目的。当我们只想引入某一个平台的二进制文件时可以这样做,首先引入核心包,这个是所有平台都必须引入的
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-core</artifactId>
<version>2.7.3</version>
</dependency>
Linux 64位
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-linux64</artifactId>
<version>2.7.3</version>
</dependency>
Windows 64位
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-win64</artifactId>
<version>2.7.3</version>
</dependency>
MacOS 64位
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-osx64</artifactId>
<version>2.7.3</version>
</dependency>
代码使用例子
try {
File source = new File("file path");
File target = new File("file path);
//Audio Attributes
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
audio.setBitRate(128000);
audio.setChannels(2);
audio.setSamplingRate(44100);
//Encoding attributes
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("mp3");
attrs.setAudioAttributes(audio);
//Encode
Encoder encoder = new Encoder();
encoder.encode(new MultimediaObject(source), target, attrs);
} catch (Exception ex) {
ex.printStackTrace();
succeeded = false;
}