被amr和caf折磨疯?用ffmpeg一键转码,别让格式问题卡死你服务器
发布时间:2026/8/27 10:56:34 作者:尧图编辑部 阅读量:1,286

最近正在做一个项目, 这个项目是要把手机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); }