Java 巧妙将音频amr格式转换成MP3(linux 以及windows)

作为一名技术宅男,没事就上掘金来淘宝,在这学习了很多东西,也一直想开个博客,写写自己的东西,一方面就当是笔记,另一方面也可以作为他人学习的前进的一种参考,本着这样的想法今天来开启我的第一篇博客之路,俗话说前人栽树后人乘凉,我们受益于前人,亦让后人得益于我们,废话不多说了让我们开启转码吧,在此郑重说明:所写内容均来自与实战,可借鉴,有问题可与本人联系,共同探讨,一起进步.

需求背景简介

在一个特定的场景之下,pc端管理后台可以为场景上传一个默认的语音讲解,然后在app端,用户可以为听场景的讲解也可以单独为场景配音,上传通过之后,会在用户端展示供他人播放。 **

难点解刨

录音上传很简单,但是在上传后会发现Android的录音默认是amr格式的,audio标签不能播放,为了兼容性决定将音频的格式统一成MP3。将pc端上传的音频一并处理,并计算音频的时长。

实战

鉴于此想法,开启填坑之路。 度娘了一些博客,基本都是指向了JAVe.jar,官网:www.sauronsoftware.it/projects/ja… ,想着有希望了,但点击下载才发现最后的一个版本是2009,已经快十年都没更新升级了,然后又看了一下文档介绍:Installation and requirements In order to use JAVE in your Java application, you have to add the file jave-1.0.jar in your application CLASSPATH. JAVE runs on a Java Runtime Environment J2SE v.1.4 or later.JAVE includes and uses a ffmpeg executable built for Windows and Linux operating systems on i386/32 bit hardware platforms. In order to run JAVE on other platforms you have to replace the built-in ffmpeg executable with another one suitable for your needs. This is very simple, once you have built your own ffmpeg binaries. The operation is described in the "Using an alternative ffmpeg executable" section., 大意就是说安装JAVE的Java 1.4以上版本,仅仅支持32位的Windows and Linux。这一点非常的坑,不可能为了转码将linux以及windows都换成32位的,但是继续又说到根据需要用二进制文件ffmpeg 替换一下,就可以在不同环境下使用了,这个好像可以解决;注意这一句‘Using an alternative ffmpeg executable’,点进去后可以看到,

这一段说的就很清楚了,jave并不是纯java写的,真正干活的是ffmpeg这个c语言写的,这下清楚了,原来是官方是只提供了32位的ffmpeg可执行文件,我们需要干的就是弄一个64位的可执行文件就可以搞定了,然后继承FFMPEGLocator 类,实现里边的方法在创建新的编码器就可以,点开上边的网址http://ffmpeg.mplayerhq.hu/,,来到ffmpeg的官网点击下载看到

看到linux 好开心,再看最后一行,32位64位静态编译是什么鬼,点进去看一看

卧槽,安装说明,毫不犹豫进去看看

我的乖乖,静态编译安装,二进制的,美太太,然后按照说明一路执行命令就可以了,执行完成后就可以得到一个64位二进制文件ffmpeg,然后将ffmpeg拷贝出来放在Java项目中就可以了。最主要的事情完成了。偷笑一下。 再次回到JAVE的官网继续看,拉到文档底部,可以看到 Examples,然后剔除不要的(只需转码),基本就剩下:

File source = new File("source.amr");
File target = new File("target.mp3");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("libmp3lame");
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("mp3");
attrs.setAudioAttributes(audio);
Encoder encoder = new Encoder();
encoder.encode(source, target, attrs);
复制代码

现在一目了然,根据官方文档只需替换用Encoder encoder = new Encoder(new MyFFMPEGExecutableLocator())就可以在linux64上使用了。同时windows也可以使用原来的编码器。也就是说只需要在不同的环境下切换编码器就可以了。这样就可以完美的解决windows以及linux下的音频转码问题了。

提示:如果在linux上依然不能成功,请给ffmpeg的相关执行权限

声明:本人第一次写博客,有不当的地方还请海涵,有不明白的问题可以留言,不喜勿喷,请学会尊重别人。

### 回答1: 在 Java 中可以使用 javax.sound.sampled 包中的类来录制和播放声音。不过,这个包并不支持将音频文件从一种格式转换为另一种格式。要想实现音频格式转换,需要使用第三方的音频处理库。 对于将 AMR 格式转换MP3 格式,可以使用 Apache Commons 项目中的 Apache Commons Sound 库。下面是一个简单的示例代码: ``` import org.apache.commons.sound.sampled.AudioFormat; import org.apache.commons.sound.sampling.AudioFileFormat; import org.apache.commons.sound.sampling.AudioInputStream; import org.apache.commons.sound.sampling.AudioSystem; import java.io.File; public class AmrToMp3 { public static void main(String[] args) throws Exception { // 输入文件 File inputFile = new File("input.amr"); // 输出文件 File outputFile = new File("output.mp3"); // 创建音频输入流 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputFile); // 创建 MP3 格式音频格式对象 AudioFormat mp3Format = new AudioFormat(AudioFormat.Encoding.MPEG2L3, audioInputStream.getFormat().getSampleRate(), audioInputStream.getFormat().getSampleSizeInBits(), audioInputStream.getFormat().getChannels(), audioInputStream.getFormat().getFrameSize(), audioInputStream.getFormat().getFrameRate(), true); // 创建音频输出流 AudioInputStream mp3InputStream = new AudioInputStream(audioInputStream, mp3Format, audioInputStream.getFrameLength()); // 写入文件 AudioSystem.write(mp3InputStream, AudioFileFormat.Type.MP3, outputFile); } } ``` 在运行这段代码之前,需要在项目中添加 Apache Commons Sound 库的依赖。具体的依赖信息可以在 Apache Commons Sound 库的官方文档中 ### 回答2: 要用Java代码将AMR格式转换MP3格式,可以使用第三方库LAME来实现。LAME是一个开源的音频编码器库,可以将AMR文件编码为MP3格式。 首先,你需要下载LAME库的Java绑定。在这个绑定中,你可以通过Java调用LAME库的函数来进行音频编码。 接下来,你需要用Java代码调用LAME库中的函数。具体的步骤如下: 1. 首先,你需要加载LAME库。使用System.loadLibrary()方法,将LAME库加载到Java虚拟机中。 2. 创建一个WavReader对象,用来读取AMR文件。你可以使用自己定义的WavReader类,或者使用其他开源库,如JAVE等。 3. 创建一个Mp3Writer对象,用来写入MP3文件。同样,你可以使用自己定义的Mp3Writer类,或者其他开源库。 4. 通过WavReader对象读取AMR文件中的音频数据,将其解码为PCM格式。解码过程可以使用LAME库中的lame_decode()函数完。 5. 将解码得到的PCM数据通过Mp3Writer对象编码为MP3格式。你可以使用LAME库中的lame_encode_buffer_interleaved_ieee_float()函数完。 6. 最后,将编码得到的MP3数据写入到目标文件中。 以下是伪代码示例: ```java // 加载LAME库 System.loadLibrary("lame"); // 创建WavReader对象 WavReader reader = new WavReader("input.amr"); // 创建Mp3Writer对象 Mp3Writer writer = new Mp3Writer("output.mp3"); // 创建缓冲区 byte[] amrBuffer = new byte[amrBufferSize]; float[] pcmBuffer = new float[pcmBufferSize]; // 解码AMR文件,并编码为MP3格式 int bytesRead = 0; int pcmSamples = 0; while ((bytesRead = reader.read(amrBuffer)) > 0) { pcmSamples = lame_decode(amrBuffer, bytesRead, pcmBuffer); lame_encode_buffer_interleaved_ieee_float(pcmBuffer, pcmSamples, mp3Buffer); writer.write(mp3Buffer); } // 关闭文件流 reader.close(); writer.close(); ``` 请注意,以上示例是伪代码,实际实现中需要根据具体情况进行调整。此外,你需要根据实际项目需求,对音频流数据进行适当的处理和错误处理。希望以上回答对你有帮助! ### 回答3: 要用Java代码实现AMR格式转换MP3格式,我们可以使用第三方库lame进行转换。以下是一个简单的代码示例: 首先,你需要下载并导入lame库(lame-3.99.5.jar)到你的Java项目中。 接下来,你可以使用以下代码进行转换: ```java import com.googlecode.mp3transform.Decoder; import com.googlecode.mp3transform.Encoder; public class AMRToMP3Converter { public static void convertAMRtoMP3(String inputFilePath, String outputFilePath) { try { Decoder decoder = new Decoder(); Encoder encoder = new Encoder(); // 解码AMR文件 short[] pcm = decoder.decode(new File(inputFilePath)); // 编码为MP3文件 encoder.encode(pcm, pcm.length, new File(outputFilePath)); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String inputFilePath = "input.amr"; String outputFilePath = "output.mp3"; convertAMRtoMP3(inputFilePath, outputFilePath); } } ``` 在上述代码中,我们首先创建了一个Decoder对象和一个Encoder对象。然后,我们使用Decoder的decode方法将AMR文件解码为PCM数据,并存储在一个short数组中。接下来,我们使用Encoder的encode方法将PCM数据编码为MP3文件。 你可以将AMR文件的路径和要输出的MP3文件的路径传递给convertAMRtoMP3方法以进行转换。 需要注意的是,上述代码仅仅是一个简单示例,实际应用中可能需要更多的参数配置和异常处理。此外,你需要确保导入了正确版本的lame库,并在运行代码之前设置正确的classpath。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值