amr文件转mp3格式


由于公司业务需求,需要做录音播放功能,简单来说就是业务员跟客户的通话记录会落地保存,然后需要用H5实现录音播放,但是录音文件保存的是amr格式,H5的audio标签不支持amr格式,需要把amr格式转mp3格式。于是去查了查相关格式转换的资料,发现前端JS有类似的工具包,但后来想想这格式转换的事情还是给后端做比较合理吧,便在github上搜了半天找到两个Java的转码包,他们都是基于ffmpeg做的封装,兼容了Windos和Linux系统,话不多说,直接开干吧。

方式一:JAVE包

jave项目实际上早就有了,它封装了 ffmpeg 的命令,让开发者可以通过 Java 转换文件格式。不幸的是,这个项目可谓年久失修,存在一些问题,JAVE 项目的问题:

  1. 项目老旧没再维护。官网最近版本是2009年发布的,其依赖的ffmpeg早已过时,很多情况下用不了。
  2. 转码一直报异常 EncoderException: Stream mapping
  3. 没有发布maven仓库,而且 JAVE 本身也不是一个maven项目
  4. 不支持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;                                          
}               

Author: 顺坚
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 顺坚 !
评论
 Previous
那个被叫做太阳的公司 那个被叫做太阳的公司
近一百多年来,在IT信息产业的发展过程中,特别在20世纪八九年代是IT科技史上群星闪耀的时代。在这个大时代里,很多公司原本有可能成为信息产业的王者与弄潮儿,但最终却与之失之交臂,这些公司无论其曾经多么的辉煌,当它们开始走下坡路时,被人遗忘的
2020-03-21
Next 
搭建Ant-Design-Pro项目 搭建Ant-Design-Pro项目
最近公司项目使用了ant design pro,从没接触过react的我只能趁着周末学习熟悉,赶紧上手。(都是泪。。)说到ant design pro,得先了解一下ant design是个什么东西?ant design蚂蚁金服基于reac
2020-03-15
  TOC