ffmpeg是一個很是強大的音視頻處理工具,官網是:http://ffmpeg.org/ 。html
因爲ffmpeg在windows上和linux系統上的執行文件不同(Windows上不須要安裝ffmpeg,只須要下載Windows版本的ffmpeg就行。linux上須要用戶本身安裝ffmpeg---> 參考連接:http://linux.it.net.cn/e/Linuxit/2014/0828/3980.html)java
最近最項目是遇到一個需求,就是將安卓端amr格式的錄音文件轉爲mp3格式,而後在網頁上播放。linux
1、 Windows系統和linux系統的處理方式windows
一、首先在Windows系統上倒好解決。方案有2個,一個是使用jave.jar工具包,另外一種是直接將下載好的Windows版本的ffmpeg解壓,而後將其中bin目錄下ffmpeg.exe文件導入到項目中(或者直接使用代碼讀取本地的ffmpeg.exe執行文件)。服務器
1.一、 使用jave.jar工具包工具
http://mfan.iteye.com/blog/2032454編碼
1.二、使用ffmpeg.exe執行文件url
1.2.一、使用本地的ffmpeg.exe執行文件,直接經過File獲取spa
1.2.二、將ffmpeg.exe執行文件導入到項目中,經過 URL url = Thread.currentThread().getContextClassLoader().getResource("ffmpeg/windows/"); 來獲取.net
1.三、linux服務器上使用ffmpeg將amr轉爲mp3
1.3.一、首先要在linux服務器上安裝ffmpeg工具,安裝方式見上方
2、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; } }