最近正在做一个项目, 这个项目是要把手机APP上面的文件上传至服务器, 其中涵盖图片、声音以及视频文件。一开始只有某个版本, 大家都清楚, 其录音格式为amr在电脑上无法播放出来, 必定得进行转码。是由于之前仅有那个版本, 所以就借助jave较为便利地解决了。然而后来又增添了版本, 上传上来的录音格式是caf。jave虽说支持几十种音视频格式, 可却无法支持这个caf格式。后来也尝试运用lame, 结果同样不行。大多网上资料讲的是在手机上转, 而我要在服务器上转, 搞了一星期, 毫无进展, 后来向同事请教, 他们推荐我用, 称其是强大工具, 能转几乎任何格式音视频, 格式工厂还用其内核, 我试了格式工厂, 确实能转caf格式, 终于有转机, 这让我意识到团队力量三个臭皮匠顶个诸葛亮, 有问题得和别人多交流。话回主题, 讲一讲我的操作做法, 其简便易行, 简单明晰。具体是这样操作的, 通过上传文件来实现。当一个文件成功完成上传流程后, 若此文件属于音频文件类型, 那么我会将其转换为mp3格式。重点指出的是, 无论这个音频文件原本是amr格式, 亦或是caf格式, 甚至是其他任何音频格式, 统统能够完成转换为指定mp3格式的操作。起先, 去下载.exe, 这是很容易就能搜寻到的, 能够从官方网页上进行下载。鉴于我们仅仅是将其用于转码, 所以就不去阐述它的工作原理之类的内容了。在下载完毕之后, 于程序内部直接运行这个.exe就行。转换的方法代码如下:/** * 将上传的录音转为mp3格式 * param webroot 项目的根目录 * param sourcePath 文件的相对地址 */ public static void ToMp3(String webroot, String sourcePath){ //File file new File(sourcePath); String targetPath sourcePath.mp3;//转换后文件的存储地址直接将原来的文件名后加mp3后缀名 Runtime run null; try { run Runtime.getRuntime(); long startSystem.currentTimeMillis(); Process prun.exec(webrootfiles/ffmpeg -i webrootsourcePath -acodec libmp3lame webroottargetPath);//执行ffmpeg.exe,前面是ffmpeg.exe的地址中间是需要转换的文件地址后面是转换后的文件地址。-i是转换方式意思是可编码解码mp3编码方式采用的是libmp3lame //释放进程 p.getOutputStream().close(); p.getInputStream().close(); p.getErrorStream().close(); p.waitFor(); long endSystem.currentTimeMillis(); System.out.println(sourcePath convert success, costs:(end-start)ms); //删除原来的文件 //if(file.exists()){ //file.delete(); //} } catch (Exception e) { e.printStackTrace(); }finally{ //run调用lame×××最后释放内存 run.freeMemory(); } }要是存在需要进行转换的文件, 那么直接去调用这个方法, 接着传入两个参数, 如此便行了。需要说明的是, 此处所指的是绝对地址, 也就是那种带有盘符的地址, 就如同D://这般。相对地址估计也是能够行得通的。当具体的编码为mp3的时候, 那些我都未曾设置参数, 像是码率、声道之类的, 由于只要能够听见声音就可以了, 又并非是音乐, 所以就让它自动去进行转换吧。当然了, 要是你存在要求, 也能够去设置这些参数。public static void main(String[] args) { ToMp3(E:/workspace/ReportWeb/WebRoot/,audio/REC_20150126_175835.amr); }