Java实现文件格式转换(如amr转MP3)并上传FTP服务器实例

1.准备JAR包



2.代码

 首先确定你要转换的文件类型,如amr转成MP3格式,如果你想转换其他的格式,可以参考JAVE 视音频转码,文中详细解释了

JAVE(Java Audio Video Encoder)各个组件介绍及属性设置。

Eg(amrToMp3.class):

package test;
import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.InputFormatException;
import java.io.File;


/**
 *   文件格式转换测试类
  * @Title: 
  * @Description: TODO 
  * @author: minglei ZHAO   
  * @return   
  * @date: 2018年7月9日 下午3:40:27
 */
public class amrToMp3 {


  public static void main(String[] args) throws Exception {
    changeTemp();
  }
  public static void changeTemp() throws InputFormatException {
    File source = new File("E:\\音频怪物 - 短信和闹铃.mp3");   //源文件
    File target = new File("E:\\音频怪物 - 短信和闹铃.amr");   //目标文件
    AudioAttributes audio = new AudioAttributes();
    audio.setCodec("libmp3lame");
    EncodingAttributes attrs = new EncodingAttributes();
    attrs.setFormat("mp3");
    attrs.setAudioAttributes(audio);
    Encoder encoder = new Encoder();
    try {
      encoder.encode(source, target, attrs);
    } catch (IllegalArgumentException | EncoderException e) {
      e.printStackTrace();
    }

  }
}

另外如果你的需求中要求是传入base64编码格式的文件字符串,可以参考以下代码:

package test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import util.ftpUtil;


/**
 * 将本地文件通过base64编码生成在文件中 ,方便通过postman等接口测试工具发送请求,进行接口测试
  * @Title: 
  * @Description: TODO 
  * @author: minglei ZHAO   
  * @return   
  * @date: 2018年7月9日 下午3:37:01
 */
public class FileToBase64 {
public static void main(String[] args) {
  File file = new File("E:/", "file12.txt");  //创建文件对象
  
  
  try {
      if (!file.exists()) {               //如果文件不存在则新建文件
          file.createNewFile();           

      }
      FileOutputStream output = new FileOutputStream(file);
      ftpUtil ftpUtil = new ftpUtil();
      String getImageStr = ftpUtil.GetImageStr("E:/test.amr");
      byte[] bytes =getImageStr.getBytes();
      output.write(bytes);                //将数组的信息写入文件中
      output.close();
  } catch (IOException e) {
      e.printStackTrace();
  }
}
}

接下来,你就可以进行测试了,Main方法如下:

package test;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import util.FileUtil;
import util.ftpUtil;

/**
 * 
  * @Title: 
  * @Description: TODO 
  * @author: minglei ZHAO   
  * @return   
  * @date: 2018年7月9日 下午3:45:39
 */
public class Main {
  public static void main(String[] args) throws Exception {
    ftpUtil ftpUtil = new ftpUtil();
    FileUtil fileUtil = new FileUtil();
    
    String path = "E:/temp/";
    fileUtil.judeDirExists(new File(path));
    String hostname = "192.168.1.185";
    // ftp服务器端口号默认为21
    Integer port = 21;
    // ftp登录账号
    String username = "lkqftp";
    // ftp登录密码
    String password = "lkqftp";
    
    // 将文件转换成base64(这个步骤可以省略,我这么做是因为前端传过来的是base64的字符串,该amr文件为了方便我测试)  
    String getImageStr = ftpUtil.GetImageStr("E:/20180705_165931.amr");
    // 将base65转成文件
    byte[] generateImage = ftpUtil.GenerateImage(getImageStr);
    File source = fileUtil.getFileFromBytes(generateImage,path+"//"+"20180705_165931.amr");
    File target = new File(path+"//"+"20180705_165931.mp3");
    //将amr文件转换成Mp3文件 
    ftpUtil.amrToMp3(source,target);
    // 将base64转换成byte[]
    String getImageStr2 = ftpUtil.GetImageStr(path+"//"+"20180705_165931.mp3");
    byte[] generateImage2 = ftpUtil.GenerateImage(getImageStr2);
    
    // 通过ftp将文件流写出
    InputStream is = new ByteArrayInputStream(generateImage2);
    String a = "mp6";
    String b = "zml";
    ftpUtil.uploadFile(a + "/" + b, "20180705_165931.mp3", is, hostname, port, username, password);
    //删除临时生成的文件
    fileUtil.deleteFile(path+"20180705_165931.amr");
    fileUtil.deleteFile(path+"20180705_165931.mp3");
  }
}

3.问题总结

在本地测试过程中,会遇到各种各样的错,以下做出我遇到的问题:


Windows下出现如上报错,不要紧,看下文件是否转换成功,通过qq影音等工具试听文件转换后是否能正常播放,我就出现过amr文件无法渲染导致转换报错。。。。。如下,虽然代码报错,但MP3文件照常生成。



因为Windows对JAVE的集成较好。而

将代码移植到linux中时出现了很多在Windows平台下不会出现的异常。例如报错或者文件生成之后为0KB。这有两个可能的原因造成。  1.JAVE中jar包中包含的ffmpeg不匹配  


2.Linux服务器的内核版本太低。(我就是出现的这个问题,所以我会在最后把我的源码发出来供大家参考,因为版本兼容性我已经经过测试,所以第一种原因不会出现问题)

  那么,怎么查看你的linux内核版本呢?

 命令---------------- uname -a  


查看内核版本是否为32或者以上,那么为什么要求必须要内核版本在32以上呢?原因如下:


JAVE只兼容内核为2.6.32以上的版本。。。。。。。。。。。如果你的是32以上版本,怎么测试你的文件在linux是否能正常转换呢?而不是报错,转换失败,文件0KB。。。。方法如下:

1.将JAVE.JAR或者jave-ffmpegjave-1.0.2.jar解压,找到ffmpeg文件,将文件放置到linux服务器中

2.将你需要转换的文件放在同级目录

3.给ffmpeg增加修改权限:  chmod +x ffmpeg

4.执行命令:./ffmpeg -i aaa.amr bbb.mp3  回车

如果出现以下打印输出,说明转换成功,检查转换出的MP3文件是否正常。。。则代码可以正常移植到linux。



下图就是由于内核不匹配出现的错误:




综上》》》》》》》》》》》》》》》》》》》》》》文件格式转换已解决。

我的代码内容包括 base64及文件之间的相互转换、文件上传下载到指定FTP服务器、文件格式转换等内容,相关jar包兼容。可以直接使用。

下载地址>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Java实现文件格式转换代码实例

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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、付费专栏及课程。

余额充值