FFmepg — 開源且功能強大的影音處理框架

林罡北
7 min readNov 30, 2017

--

FFmpeg & logo

由於最近有個專案需要在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.才能使用

下載FFmpeg Build檔案

都附圖了,順便講解一下Version & Linking選項所代表的的意義好了

Version :

  • 20171128–86cead5
    這個選項代表的是FFmpeg開發中的版本(不穩定版),其中20171128表示最新的開發版本是在該時間釋出的,而86cead5指的是git的版控commit hash id
  • 3.4
    這代表最新的FFmpeg穩定版是3.4版

Linking

  • Static
    打包好(build)的版本,下載後在bin資料夾內只會有包好的執行檔(.exe),不會有.dll或是.dylib等等的檔案
ffmpeg-3.4-win64-static\bin folder
  • Shared
    這也是打包好的版本,但是不同的是在bin資料夾下會將.dll或是.dylib檔案另外存放,而執行檔(.exe)會依賴於這些檔案來執行。簡單來說有需要的話可以替換成你自己需要的.dll或是.dylib檔案
ffmpeg-3.4-win64-shared\bin folder
  • 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.mp3
Ex.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

--

--

林罡北
林罡北

Written by 林罡北

Founder of TroublesLab, F2E & Web/App Developer

No responses yet