1:原理 调用ffmpeg 执行转换

即:先把amr 下载到服务器 调用 ffmpeg -i    转换生成MP3 文件 通过二进制流的形式
ajax点击播放异步转换并且生成流通过audio的src属性在web端播放,同时删除后台的amr和mp3文件,此功能是在后台cms 中实现,也可以独立部署转换。

注意:在本地开发时 不管是linux 系列 还是windows系列 一定要安装ffmpeg 工具 即通过控制台可以转换成功。

直接贴代码:

    public class AmrToMp3 {public static void main(String[] args){AmrToMp3.convertToMp3(args[0], args[1]);}public static boolean convertToMp3(String amrFile, String mp3File)  {Process process = null;try{File mp3 = new File(mp3File);if(mp3.exists()){mp3.delete();}process =Runtime.getRuntime().exec("ffmpeg -i " + amrFile + " " + mp3File);process.waitFor();}catch (Exception ex){}finally {process.destroy();}return false;}}
/*** amr 文件转换MP3** @param url* @param req* @return*/public static String amrSwitchToMp3(String url, HttpServletRequest req) {try {OSSObject oos = UploadImageUtils.getFile(url); //阿里存储 具体根据自己的需要if (oos == null) {return null;}InputStream fis = oos.getObjectContent();String filePath = "/";String filen = url.substring(url.lastIndexOf("/") + 1, url.length());filen = filen.replaceAll(".amr", "");String realPathDir = req.getSession().getServletContext().getRealPath(filePath);File saveFile = new File(realPathDir);if (!saveFile.exists())saveFile.mkdirs();/** 获取文件的后缀* */String suffixAmr = ".amr";String suffixMp3 = ".mp3";String srcNameEnd = filen + suffixAmr;// 构建文件名称String targetNameEnd = filen + suffixMp3;// 构建文件名称/** 拼成完整的文件保存路径加文件* */String srcName = realPathDir + srcNameEnd;String targetName = realPathDir + targetNameEnd;try {getFileFromInputStream(fis, srcName);boolean result = AmrToMp3.convertToMp3(srcName, targetName);File source = new File(srcName);if (source != null && source.exists()) source.delete();if (result) {return targetName;}} catch (Exception e) {e.printStackTrace();}} catch (Exception e) {e.printStackTrace();}return null;}/*** amr 文件转换MP3** @param target* @param req* @param resp* @return*/
public static boolean getMp3Resp(String target, HttpServletRequest req, HttpServletResponse resp) {try {File targetFile = new File(target);InputStream f = new BufferedInputStream(new FileInputStream(targetFile));byte[] buffer = new byte[f.available()];f.read(buffer);f.close();resp.addHeader("Content-Disposition", "attachment;filename="+target+".mp3");resp.addHeader("Content-Length", "" + targetFile.length());OutputStream ous = new BufferedOutputStream(resp.getOutputStream());resp.setContentType("application/octet-stream");ous.write(buffer);ous.flush();ous.close();if (targetFile != null && targetFile.exists()) targetFile.delete();return true;} catch (Exception e) {e.printStackTrace();}return false;
}/*** 从流中写出文件** @param inStream* @param imageFileStr* @throws Exception*/
public static void getFileFromInputStream(InputStream inStream, String imageFileStr) throws Exception {//new一个文件对象用来保存图片,默认保存当前工程根目录File imageFile = new File(imageFileStr);//创建输出流FileOutputStream out = new FileOutputStream(imageFile);ByteArrayOutputStream outStream = new ByteArrayOutputStream();//创建一个Buffer字符串byte[] buffer = new byte[1024];//每次读取的字符串长度,如果为-1,代表全部读取完毕int len = 0;//使用一个输入流从buffer里把数据读取出来while ((len = inStream.read(buffer)) != -1) {//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度out.write(buffer, 0, len);}//关闭输入流inStream.close();//关闭输出流out.close();}
控制层的调用:/*** 转换语音*/@RequestMapping("/amrToMp3")public@ResponseBodyObject amrToMp3(@RequestParam(value = "url", required = false) String url,HttpServletRequest req, HttpServletResponse resp) {MsgBean msg = new MsgBean();if (StringUtils.isBlank(url)) {msg.setFailure(1, "视频播放地址不存在!");return msg.returnMsg();}if (!url.contains("amr")) {msg.setFailure(1, "视频文件有问题,无法播放!");return msg.returnMsg();}String result = FileUtils.amrSwitchToMp3(url, req);if (result != null && !"".equals(result)) {msg.put("url", result);} else {msg.setFailure(1, "视频文件地址出错,无法播放!");return msg.returnMsg();}return msg.returnMsg();}/*** 播放语音*/
@RequestMapping("/playMp3")
public
@ResponseBody
Object playMp3(@RequestParam(value = "url", required = false) String url,HttpServletRequest req, HttpServletResponse resp) {if (StringUtils.isBlank(url)) {return null;}return FileUtils.getMp3Resp(url, req, resp);
}

前端js

function  amrToMp3(id,url,btn){var path = "${BasePath}/chatReport/amrToMp3?url=" + url;$.ajax({type: "POST",url: path,datatype: "json",success: function (data) {if (data.errno == 1) {alert(data.errdesc);} else {play(id,data.url,btn);}},error: function () {alert("操作出错,请联系管理员!");}});
}function  play(id,url,btn){var audio = document.getElementById('audio_'+id);if(btn.innerHTML=="播放"){audio.src="${BasePath}/chatReport/playMp3?url=" + url;}playOrPaused(audio,btn);var is_playFinish=  setInterval(function(){if(audio.ended){//   btn.innerHTML=="暂停"}//callback(audio,btn);window.clearInterval(is_playFinish);},1);}function  callback(audio,btn){// audio.play();playOrPaused(audio,btn);}function playOrPaused(id,obj){if(id.paused){id.play();obj.name="";// obj.innerHTML='暂停';return;}id.pause();obj.innerHTML='播放';}
HTML代码:
<audio controls="controls" autoplay="autoplay"  id="audio_${obj.id }"  src=""   >您的浏览器不支持 audio 标签
</audio>
<button    class="btn btn-danger btn-small"  name= "b1"  onclick="amrToMp3(${obj.id },'${obj.content.url}',this )">播放</button>

2: 线上安装ffmpeg工具 centos redhat

(一)安装编译环境
#yum install -y automake autoconf libtool gcc gcc-c++
(二)安装所需程序库的RPM包到 centos(因为centos自带的库中没有ffmpeg包,这里相当于是扩展)
#rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

如果这一步失败可以将地址“http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm ”下载到电脑,然后直接运行下面的也可以
#rpm -Uhv rpmforge-release-0.3.6-1.el5.rf.i386.rpm
共享一个RPM包下载链接
(三)安装 Install ffmpeg 等模块
yum -y install ffmpeg ffmpeg-devel
方法二、此方法有时不太好用
1.安装前准备
vi /etc/yum.repos.d/ffmpeg.repo
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
gpgcheck=0
enabled=1
2.安装ffmpeg
yum -y install ffmpeg ffmpeg-devel

注意:网上好多安装 诸如此类 参考即可 要求安装最新版本各个交叉编译比较繁琐 其实低版本即可

—————————————-华丽的分割线—————————————–

   FFmpeg在Linux下的安装在Redhat 9.0成功安装了ffmpeg,现记录如下。1、下载ffmpeg。http://download.chinaunix.net/download.php?id=5532&ResourceID=2990我是在这个网址上下载ffmpeg-0.4.9-p20051120.tar.bz2,看网上有人用的是svn下载,但是我的机子中没有svn客户端,然后就在网上搜索,下载了这个版本。如果利用svn可以下载ffmpeg最新的版本。svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg2、解压tar xvfj ffmpeg-0.4.9-p20051120.tar.bz2得到解压后的目录是ffmpeg-0.4.9-p20051120,名字太长,利用mv命令改为ffmpegmv ffmpeg-0.4.9-p20051120.tar.bz2 ffmpeg3、配置./configure --enable-shared --prefix=/usr/local/ffmpeg其中:--enable-shared 是允许其编译产生动态库,在以后的编程中要用到这个几个动态库。--prefix设置的安装目录。4、编译并安装makemake install5、安装之后在/usr/local/ffmpeg会看到有三个目录lib  动态链接库位置include 编程要用到头文件bin 执行文件所在的目录6、为了以后方便编程,我们把lib中的三个链接库libavcodec.so libavformat.so libavutil.so复制到/usr/lib下。把include目录下的ffmpeg目录复制到/usr/include下。执行bin目录下的ffplay,可以去播放音频或者视频文件。例如播放1.mp3./ffplay 1.mp3另外,bin目录下还有两个文件:ffmpeg和ffserverffmpeg是一个很好的视频和音频的格式转化工具。网上有很多它的说明文档。如果不想生成ffserver,只要在./configure的时候加--disable-ffserver即可。7、编程如果写了一个test.c文件,要包含ffmpeg的头文件,可以这样写:#include <ffmpeg/avcodec.h>编译:gcc -o test test.c -lavformat -lavcodec -lavtuil (前提是有第6步的操作)如果没有第6部的操作,则编译的时候如下:gcc -o test test.c -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib  -lavformat-lavcodec -lavtuil说明:-I是指明需要的头文件所在的文件,-L是指明动态库所在的目录,后面三个是指明需要的动态库。编译成功之后,执行的时候还是需要动态库的支持,还是要把那三个动态库文件复制到/usr/lib或者/lib中,不然执行的时候会说找不到动态库链接。还有一个方法可以解决这个问题,就是把/usr/local/ffmpeg/lib这个目录加入到/etc/ld.so.config中,然后执行ldconfig,或者重启电脑,这样执行的时候系统就可以从/usr/local/ffmpeg/lib这个目录下去找这三个动态库文件了。以上的方式是采用动态库编译ffmpeg的,如果在configure的时候不加上--enable-shared的,则采用静态链接的方式,不会生成那三个动态库。同时生成的ffplay、ffmpeg的执行文件也比较的大,因为他们不需要动态库的支持,就可以执行。但是不利于再次开发,所以我采用动态链接的方式。configure中还有很多的选项,可以通过./configure --help查看,也可以直接查看configure文件。这在配置的时候很重要。

从测试到开发掌握 ffmpeg安装 以及amr 转换MP3 并且播放相关推荐

  1. linux java amr转mp3,微信语音Linux-centos下ffmpeg安装如何amr转mp3播放

    以前微信语音只能微信浏览器里播放,而且只有3天有效期,后来找到解决办法,安装ffmpeg做格式转化,以前网上找到一篇教程,写的很详细,照着做就行,今天花了很多时间大海捞针方式搜到了: https:// ...

  2. ffmpeg window下批量转换MP3为wav

    转载链接:https://blog.csdn.net/fuchuchen/article/details/55214216 ffmpeg 在window下将MP3转换为wav文件 1)ffmpeg   ...

  3. jav音频格式转换 ffmpeg 微信录音amr转mp3

    项目背景: 之前公司开发了一个微信公众号,要求把js-sdk录音文件在web网页也能播放.众所周知,html的<audio>标签ogg,mp3,wav,也有所说苹果safari支持m4a格 ...

  4. linux java amr转mp3_部署ffmpeg及amr转mp3方法

    简介:FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序:更多介绍请自行百度 环境Centos6.7 编译器:gcc 安装步骤: 1步:安装依赖环境 yum inst ...

  5. 【测试开发】测试管理工具禅道的安装

    [测试开发]测试管理工具禅道的安装 常见的测试管理工具是干什么的? 禅道的安装与配置 安装配置成功 常见的测试管理工具是干什么的? 测试管理工具是在指在软件开发过程中,对测试需求.计划.用例和实施过程 ...

  6. 音视频开发三:FFmpeg安装与常用命令

    前言:在不同平台下安装FFmpeg 1.mac系统下安装ffmpeg. 打开terminal,运行:brew install ffmpeg 安装完后,terminal中输入:ffmpeg,出现下面提示 ...

  7. 海思开发板FFmpeg+Nginx,推流RTMP播放(优秀教程收集+实操整理)

    海思开发板FFmpeg+Nginx推流RTSP播放(优秀教程收集+实操整理) 安装FFmpeg及移植 FFmpeg编译问题收录: static declaration of 'cbrt' follow ...

  8. CentOS 7.6 FFMPEG安装指北

    文章目录 1 前言 2 工作准备 2.1 软件及工具 2.1.1 FFmpeg 2.1.2 YASM 2.1.3 辅助工具 3 安装步骤 3.1 上传安装包 3.2 安装YASM 3.3 安装FFmp ...

  9. 【Android FFMPEG 开发】音视频基础 和 FFMPEG 编译 ( 音视频基础 | MPEG-4 标准 | Android 开发环境 | FFMPEG 交叉编译 | 安卓项目导入配置 )

    本篇博客代码及资源下载 : https://download.csdn.net/download/han1202012/10382762 文章目录 一. 音视频基础 1. 音频基础 (1) 声音要素 ...

最新文章

  1. python 语料_语料访问
  2. python单例类命名_单例模式(java/python/c++)
  3. linux dd命令参数及用法详解---用指定大小的块拷贝一个文件
  4. python做一副54扑克牌发牌技巧_德州扑克讲堂:高级技巧 胜率之摊牌胜率的算法...
  5. js随机从数组中取出几个元素
  6. consul删除无效服务
  7. 创业版上市与SAP管理软件系统的关系
  8. binlog日志_mysql 重要日志文件总结
  9. C# DataTable的Distinct解决方案及表的复制
  10. android studio 混淆方法
  11. 木马免杀实践-golang
  12. 安装jdk的时候为什么会有两个jre文件
  13. 图解项目绩效考核表实例--绩效考核不用愁
  14. spring data jpa 多表UNION ALL查询按条件排序分页处理:未搜到方法,解决后记录:2018年11月13日15:22:00
  15. python爬虫12306查票
  16. requests中get请求没有referer得不到数据
  17. sklearn 随机森林(Random Forest)多分类问题
  18. Excel if函数用法
  19. C语言——报数问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
  20. [收藏] Javascript Keycode表

热门文章

  1. 交换机转发速率、吞吐量、背板带宽计算(详解)
  2. 2023年京东618预售数据免费开放(往年618热门品类数据回顾)
  3. pycharm设置默认注释
  4. 代码随想录算法训练营三十五天|860,406,452
  5. 测试床/基于“5G+工业互联网”的无忧智能工厂
  6. Unity 3D : ComputeShader 全面詳解
  7. C语言——杨辉三角的实现并输出(递归)
  8. css制作动态按钮导航栏,巧妙使用checkbox制作纯css动态导航栏
  9. Liunx CentOS-7-x86_64-DVD-2009.iso 镜像下载
  10. Android入门: 对图片 ImageView的scaleType属性的理解