由於最近有個專案需要在Server Slide用Java(Servlet)接收使用者上傳mp4檔案,然後將mp4的影音分離,轉成mp3檔再進行其他處理
不過Java的強項不是處理影音檔案,處理影音的工具好像大部分都是用C再寫的,寫C也不是我的專長,所以找找有沒有免費的工具可以用,畢竟不要重新造輪子,才發現這個功能強大又免費的工具 — FFmepg
介紹一下FFMEPG
FFmpeg的全名是Fast Forward MPEG(Moving Picture Experts Group),是一個用C語言所撰寫的開源多媒體處理框架,可以用來將影音解碼、編碼、編碼轉換、混合、抽取、串流、過濾等功能,而且幾乎支援從古至今的任何影音格式
身為一個開源框架,FFmpeg具備了很高的可攜性與移植性,能在 Linux, Mac OS X, Microsoft Windows, the BSDs, Solaris等等多種不同的作業系統上安裝並使用
另外FFmpeg還擁有藉由高度的擴充性,能夠和其他免費的第三方library結合使用,開發者能夠選擇要啟用哪一些函式庫,建立符合自己需求的FFmpeg
這個項目最初是由Fabrice Bellard發起的,而現在是由Michael Niedermayer在進行維護。許多FFmpeg的開發者同時也是MPlayer項目的成員,FFmpeg在MPlayer項目中是被設計為伺服器版本進行開發。
FFmpeg模組介紹
FFmpeg是一個架構彈性且擴充性強的框架,由許多工具、函式庫與模組所組成,主要的模組有以下幾種:
Tools:
- ffmpeg 是一個命令列工具,用來對視訊檔案轉換格式,也支援對電視卡即時編碼
- ffserver 是一個 HTTP 多媒體即時廣播串流伺服器,支援時光平移
- ffplay 是一個簡單的播放器,基於 SDL 與 FFmpeg 函式庫
Library:
- libavcodec 包含了全部 FFmpeg 音訊/視訊 編解碼函式庫
- libavformat 包含 demuxers 和 muxer 函式庫&音訊與視訊格式轉換函式庫
- libavutil 包含一些工具函式庫
- libpostproc 對於視訊做前處理的函式庫
- libswscale 對於影像作縮放的函式庫
專利格式轉換
由於一些版權問題,ffmpeg應用上預設不開放某些具有專利的格式的轉換,要回復這些功能,請參考HOWTO: Easily enable MP3, MPEG4, AAC, and other restricted encoding in FFmpeg
下載FFmpeg
官網的Download頁面就有提供尚未打包(build)的原始碼下載,而如果像是作者一樣只需要使用FFmpeg內建的功能,也沒有要再更改FFmpeg的原始碼,可以直接下載已經打包好的檔案節省時間
Download Source Code
Download Build File
官方有另外提供MacOS & Windiows的build好的版本
Windows的話要注意只支援Win7以上的版本
MacOS的系統版本也必須高於10.10.才能使用
都附圖了,順便講解一下Version & Linking選項所代表的的意義好了
Version :
- 20171128–86cead5
這個選項代表的是FFmpeg開發中的版本(不穩定版),其中20171128表示最新的開發版本是在該時間釋出的,而86cead5指的是git的版控commit hash id - 3.4
這代表最新的FFmpeg穩定版是3.4版
Linking
- Static
打包好(build)的版本,下載後在bin資料夾內只會有包好的執行檔(.exe),不會有.dll或是.dylib等等的檔案
- Shared
這也是打包好的版本,但是不同的是在bin資料夾下會將.dll或是.dylib檔案另外存放,而執行檔(.exe)會依賴於這些檔案來執行。簡單來說有需要的話可以替換成你自己需要的.dll或是.dylib檔案
- Dev
很明顯的這是給開發人員的版本,裏面包含了許多C的原始碼與Header檔案,數量有點多所以就不截圖了
FFmpeg Windows安裝教學
下載完就開始安裝啦,由於作者在開發時是使用Windows平台,也沒有要改程式碼,所以下載的是3.4-win64-static版本的FFmpeg,安裝的方式可以參考這個影片
或是你不想設定系統環境變數也可以,記得在CMD內執行ffmpeg時前面要加上絕對路徑就好
FFmpeg基本指令
這邊講得真的很基本,因為我只要mp4轉mp3檔案…所以我使用的指令只有一條,想多學一些的可以看最下面Reference中的連結
指令格式:
ffmpeg -i 要被轉檔的檔案與檔案路徑 要轉成的檔案與檔案路徑
ffmpeg -i path/filename.mp4 path/filename.mp3Ex.ffmpeg -i C:\Users\Bei\test.mp4 C:\Users\Bei\test.mp3
這邊的 -i 指的是輸入的檔案名稱,後面是路徑+檔名.副檔名
透過Java使用CMD執行FFmpeg進行轉檔
Github上有開放的原始碼,原理基本上就是用Java去開一個CMD執行FFmpeg的指令
public static void main(String[] args) {
try {
String line;
String mp4File = "C:\\Users\\TundeMichael\\School.mp4";
String mp3File = "C:\\Users\\TundeMichael\\School.mp3";
//ffmpeg -i input.mp4 output.avi as it's on www.ffmpeg.org
String cmd = "ffmpeg -i " + mp4File + " " + mp3File;
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(
new InputStreamReader(p.getErrorStream()));
while ((line = in.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
System.out.println("Video converted successfully!");
in.close();
}
catch (IOException | InterruptedException e) {
LOG.log(Level.SEVERE, null, e);
}
}
THE END~打完收工
Reference
About FFmpeg
FFmpeg 免費開源、功能強大的影音處理框架
Download FFmpeg (64-bit)
How to install FFmpeg on Windows 10(youtube film)
ffmpeg常用指令介紹
ffmpeg常用轉檔參數
FFMPEG — Source Code 學習心得
Java如何轉換MP4到MP3
FFMPEG-mp4_to_mp3_converter