在java中使用ffmpeg将amr格式的语音转为mp3格式

ffmpeg是一个非常强大的音视频处理工具,官网是:http://ffmpeg.org/

由于ffmpeg在windows上和linux系统上的执行文件不一样(Windows上不需要安装ffmpeg,只需要下载Windows版本的ffmpeg就行。linux上需要用户自己安装ffmpeg---> 参考链接:http://linux.it.net.cn/e/Linuxit/2014/0828/3980.html

  最近最项目是遇到一个需求,就是将安卓端amr格式的录音文件转为mp3格式,然后在网页上播放。

  一、 Windows系统和linux系统的处理方式

  1、首先在Windows系统上倒好解决。方案有2个,一个是使用jave.jar工具包,另一种是直接将下载好的Windows版本的ffmpeg解压,然后将其中bin目录下ffmpeg.exe文件导入到项目中(或者直接使用代码读取本地的ffmpeg.exe执行文件)。

    1.1、 使用jave.jar工具包

      http://mfan.iteye.com/blog/2032454

    1.2、使用ffmpeg.exe执行文件

      1.2.1、使用本地的ffmpeg.exe执行文件,直接通过File获取

      

      1.2.2、将ffmpeg.exe执行文件导入到项目中,通过 URL url = Thread.currentThread().getContextClassLoader().getResource("ffmpeg/windows/"); 来获取

      

    

    1.3、linux服务器上使用ffmpeg将amr转为mp3

      1.3.1、首先要在linux服务器上安装ffmpeg工具,安装方式见上方  

      

  二、utils工具类(代码具体实现)

  

/**
 * Create By yxl on 2018/6/5
 */
public class AmrToMP3Utils {

    private static Logger logger =Logger.getLogger(AmrToMP3Utils.class);

    /**
     * 将amr文件输入转为mp3格式
     * @param file
     * @return
     */
    public static InputStream amrToMP3(MultipartFile file) {
        String ffmpegPath = getLinuxOrWindowsFfmpegPath();
        Runtime runtime = Runtime.getRuntime();
        try {
            String filePath = copyFile(file.getInputStream(), file.getOriginalFilename());

            String substring = filePath.substring(0, filePath.lastIndexOf("."));

            String mp3FilePath = substring + ".mp3";

            //执行ffmpeg文件,将amr格式转为mp3
            //filePath ----> amr文件在临时文件夹中的地址
            //mp3FilePath  ----> 转换后的mp3文件地址
            Process p = runtime.exec(ffmpegPath + "ffmpeg -i " + filePath + " " + mp3FilePath);//执行ffmpeg.exe,前面是ffmpeg.exe的地址,中间是需要转换的文件地址,后面是转换后的文件地址。-i是转换方式,意思是可编码解码,mp3编码方式采用的是libmp3lame

            //释放进程
            p.getOutputStream().close();
            p.getInputStream().close();
            p.getErrorStream().close();
            p.waitFor();

            File mp3File = new File(mp3FilePath);
            InputStream fileInputStream = new FileInputStream(mp3File);

            //应该在调用该方法的地方关闭该input流(使用完后),并且要删除掉临时文件夹下的相应文件
            /*File amrFile = new File(filePath);
            File mp3File = new File(mp3FilePath);
            if (amrFile.exists()) {
                boolean delete = amrFile.delete();
                System.out.println("删除源文件:"+delete);
            }
            if (mp3File.exists()) {
                boolean delete = mp3File.delete();
                System.out.println("删除mp3文件:"+delete);
            }*/

            return fileInputStream;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            runtime.freeMemory();
        }
        return null;
    }

    /**
     * 将amr文件输入流转为mp3格式
     * @param inputStream  amr文件的输入流(也可以是其它的文件流)
     * @param fileName  文件名(包含后缀)
     * @return
     */
    public static InputStream amrToMP3(InputStream inputStream, String fileName) {
        String ffmpegPath = getLinuxOrWindowsFfmpegPath();
        Runtime runtime = Runtime.getRuntime();
        try {
            String filePath = copyFile(inputStream, fileName);
            String substring = filePath.substring(0, filePath.lastIndexOf("."));
            String mp3FilePath = substring + ".mp3";

            //执行ffmpeg文件,将amr格式转为mp3
            //filePath ----> amr文件在临时文件夹中的地址
            //mp3FilePath  ----> 转换后的mp3文件地址
            Process p = runtime.exec(ffmpegPath + "ffmpeg -i" + " " +filePath + " " + mp3FilePath);//执行ffmpeg.exe,前面是ffmpeg.exe的地址,中间是需要转换的文件地址,后面是转换后的文件地址。-i是转换方式,意思是可编码解码,mp3编码方式采用的是libmp3lame

            //释放进程
            p.getOutputStream().close();
            p.getInputStream().close();
            p.getErrorStream().close();
            p.waitFor();

            File file = new File(mp3FilePath);
            InputStream fileInputStream = new FileInputStream(file);

            //应该在调用该方法的地方关闭该input流(使用完后),并且要删除掉临时文件夹下的相应文件
            /*File amrFile = new File(filePath);
            File mp3File = new File(mp3FilePath);
            if (amrFile.exists()) {
                boolean delete = amrFile.delete();
                System.out.println("删除源文件:"+delete);
            }
            if (mp3File.exists()) {
                boolean delete = mp3File.delete();
                System.out.println("删除mp3文件:"+delete);
            }*/
            return fileInputStream;

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            runtime.freeMemory();
        }
        return null;
    }

    /**
     * 将用户输入的amr音频文件流转为音频文件并存入临时文件夹中
     * @param inputStream  输入流
     * @param fileName  文件姓名
     * @return  amr临时文件存放地址
     * @throws IOException
     */
    private static String copyFile(InputStream inputStream, String fileName) throws IOException {
        Properties props = System.getProperties();
        String filePath = props.getProperty("user.home") + File.separator + "MP3TempFile"; //创建临时目录
        File dir = new File(filePath);
        if (!dir.exists()) {
            dir.mkdir();
        }

        String outPutFile = dir + File.separator + fileName;

        OutputStream outputStream = new FileOutputStream(outPutFile);
        int bytesRead;
        byte[] buffer = new byte[8192];
        while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
        outputStream.close();
        inputStream.close();

        return outPutFile;
    }

    /**
     * 判断系统是Windows还是linux并且拼接ffmpegPath
     * @return
     */
    private static String getLinuxOrWindowsFfmpegPath() {
        String ffmpegPath = "";
        String osName = System.getProperties().getProperty("os.name");
        if (osName.toLowerCase().indexOf("linux") >= 0) {
            ffmpegPath = "";
        } else {
            URL url = Thread.currentThread().getContextClassLoader().getResource("ffmpeg/windows/");
            if (url != null) {
                ffmpegPath = url.getFile();
            }
        }
        return ffmpegPath;
    }
}

      

  

原文地址:https://www.cnblogs.com/Amaris-Lin/p/9186888.html

时间: 2024-08-28 07:46:59

在java中使用ffmpeg将amr格式的语音转为mp3格式的相关文章

如何将FLAC格式转为MP3格式

FLAC是一种无损压缩格式,也就是说音频以FLAC编码压缩后不会丢失任何信息,并且将FLAC文件还原后与压缩前的文件内容相同.由于FLAC的无损压缩性质导致它所占储存空间也很大,特别对于喜欢听音乐的爱好者来说,手机上会有很多FLAC格式音乐,相对应就比较占手机内存.这个时候就很麻烦,如果把歌删了会很心疼,如果不删歌太多手机内存又不够,真的很无奈,这个时候要是能把FLAC格式转换为MP3格式保存就好了. 迅捷视频转换器http://www.xunjieshipin.com/download-con

Java中如何判断一个日期字符串是否是指定的格式

判断日期格式是否满足要求 import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date; public class Test2{public static void main(String[] args) { String date_string="201609";// 利用java中的SimpleDateFormat类,指定日期格式,注意yyyy,MM大小写// 这里的日

【转】如何将FLAC格式转为MP3格式

原文网址:http://jingyan.baidu.com/ae/3aed632e65708470108091ca.html FLAC全称为无损音频压缩编码,FLAC格式又称无损格式 不会破坏原有的音频内容,从而能还原音乐光碟的音质 音质比其他的有损压缩格式(如MP3)的音质好 但FLAC格式的音乐文件较大,不便于储存空间小的移动设备携带 且大多数人们并不会对音质有着特别的要求,MP3格式即可满足 所以可以将FLAC格式的音频文件转为MP3,节省储存空间 MediaCoder是一个非常强大的格式

java中获取当前系统时间,并与字符串相互转换格式,或者转化成秒数,天数等整数

转换成秒数 Date类有一个getTime()可以换回秒数,例如: public class DateToSecond { public static void main(String[] args) { Date date = new Date(System.currentTimeMillis()); System.out.println(date.getTime()); } } 与字符串格式相互转换 一. 获取当前系统时间和日期并格式化输出: import java.util.Date; i

C#中怎样将List<自己定义>转为Json格式 及相关函数-DataContractJsonSerializer

对C#和.net使用List<自己定义>和Json格式相互转化的方法进行总结 关于JSON的入门介绍见http://www.json.org/ ,或者百度,这里不赘述,只是通过以下的样例会有个更快捷和更直观的认识. 如Json格式[{"id":"1","name":"sara"},{"id":"2","name":"sara2"}] 自

openssl生成RSA格式,并转为pkcs8格式

原文地址:http://www.thinkingquest.net/articles/391.html?utm_source=tuicool 支付宝接口开发相关:openssl 加密工具 支付宝“手机网站支付“开发包里面有,下载地址:https://b.alipay.com/order/techService.htm 生成命令使用说明: RSA密钥生成命令  生成RSA私钥  openssl>genrsa -out rsa_private_key.pem 1024  生成RSA公钥  opens

java利用ffmpeg将amr、caf转mp3格式

最近再做一个项目,要将手机APP上的文件上传到服务器上来,包括图片.声音.视频文件.起初只有Android版,大家知道,Android的录音格式amr,在电脑上播放不出来,必须转码.因为之前只有Android版的,所以就用jave给方便的解决了.但是后来又增加了iPhone版,传上来的录音格式是caf.jave虽然支持几十种音视频格式,但是却支持不了这个caf格式.后来也尝试了lame,也是不行.网上的资料绝大部分是说在iPhone手机上转的,可是我要在服务器上转.搞了一个星期,没有一点进展.后

Java中SimpleDateFormat的简要用法

 Java中怎么才能把日期转换成想要的格式呢,或把字符串转换成一定格式的日期,如把数据库中的日期或时间转换成自己想要的格式,JAVA中提供了SimpleDateFormat类可以实现,以下是SimpleDateFormat的用法及实例: java.text 类 SimpleDateFormat java.lang.Object java.text.Format java.text.DateFormat java.text.SimpleDateFormat 所有已实现的接口: Serializ

Java中的访问控制权限

简介 Java中为什么要设计访问权限控制机制呢?主要作用有两点: (1)为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分. (2)为了让类库设计者可用更改类的内部工作方式,而不必担心会对用户造成重大影响. Java中的访问权限控制的等级,按照权限从大到小依次为: Public -> protected -> 包访问权限(没有权限修饰词)-> private. 包(package) Java中包(package)的概念和