java amr格式转mp3格式(完美解决Linux下转换0K问题)



因项目需求,需要将 amr 格式的文件转成 mp3格式。
网络上提供的思路大多是使用jave-x-x.jar。
这个包确实有用,因为开发时是在windows环境中,测试转换虽然报了异常:

1
it.sauronsoftware.jave.EncoderException:   Duration: N/A, bitrate: N/A

但也确实转换成功了,可以播放。
可是一旦部署到Linux环境当中,不是转换失败,就是转换的文件为大小 0 k。百思不得其解。

原因

经过一些资料和源码跟踪,终于找到了原因。
jave的能转换的原理其实就是调用外部的二进制可执行文件 ffmpeg,打开它的jar包就可以发现,它里面内置了:
jave原jar包截图jave原jar包截图

所以实际上,jave就是封装了一层对外部ffmpeg的调用。
而windows上能转换是因为:ffmpeg.exe 这个程序没问题。
而Linux上转换失败也是因为 ffmpeg 这个可能版本太老或依赖库缺失。
起初我以为是调用外部的ffmpeg,所以重新安装编译了Linux的ffmpeg,然并卵。
所以只能再想其他解决方案。


解决方法;

1:在java项目中添加jar包http://download.csdn.net/download/z313731418/9336665地址

1.1如果liux版本不同则需要修改jar包中的ffmpeg文件,下载站点:http://ffmpeg.org/download.html

下载下载

然后选择一个32位还是64位:

下载下载

下载之后解压,选择其中的ffmpeg,替换掉。

ffmpeg替换之后

2、java 代码

  1. public static void changeToMp3(String sourcePath, String targetPath) {  
  2.         File source = new File(sourcePath);  
  3.         File target = new File(targetPath);  
  4.         AudioAttributes audio = new AudioAttributes();  
  5.         Encoder encoder = new Encoder();  
  6.         audio.setCodec("libmp3lame");  
  7.         EncodingAttributes attrs = new EncodingAttributes();  
  8.         attrs.setFormat("mp3");  
  9.         attrs.setAudioAttributes(audio);  
  10.         try {  
  11.             encoder.encode(source, target, attrs);  
  12.         } catch (IllegalArgumentException e) {  
  13.             e.printStackTrace();  
  14.         } catch (InputFormatException e) {  
  15.             e.printStackTrace();  
  16.         } catch (EncoderException e) {  
  17.             e.printStackTrace();  
  18.         }  
  19.     }  

3.如果打印出了错误

基本上算是成功了。可以去目录下查看是否有文件。

其他!失败看这里!

如果没成功,或者转换失败,看这里
在操作的时候,为了验证服务器支持这种方式,你可以将下载回来的ffmpeg拷贝到你的服务器上,手动进行转换一次,如果失败,可以留言哦。
可以操作如下:

  1. 解压文件(可以自己下载,也可以下载博主在最后提供的现成的jar包,直接解压jar也,打开.it/sauronsoftware/jave 目录,也可以看到这个ffmpeg )
  2. 进入目录,看到ffmpeg文件后,将其拷贝到Linux环境下。
  3. 准备一个amr文件,将两个文件都拷贝到同一个目录下,进行测试。如果准备好了,如图:
    arm和ffmpegarm和ffmpeg
  4. 接着先给ffmpeg加个执行权限

    1
    
    chmod +x ffmpeg
    
  5. 接着调用 ffmpeg 执行转换下

    1
    
    ./ffmpeg  -i test.amr  test.mp3
    

然后你会看到一堆的日志,并且可能还有提示,“test.amr: Input/output error”,但不要担心,先不管,你查看下这个目录下是否多了一个test.mp3 文件。如果有了,恭喜你,转换成功了,尝试播放下MP3

你可能得到的日志如下:
日志和执行日志和执行.




重点:

用命令可以转换成功,把jar包导进去用程序就不行。

可能是缓存,你到Tomcat下有个temp目录,进入jave 目录,挺多层的,进去看看有没一个ffmpeg文件,删除掉。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值