Mac下 FFmpeg原始碼編譯
安裝
可以通過如下三種方式安裝ffmpeg
-
終端安裝 (藉助homebrew): 此方式ffmpeg會保持自動更新.
-
下載ffmpeg靜態庫: 即不用手動編譯,我們只需要直接執行下載得到的二進位制檔案即可.靜態生成的一個缺點是必須手動執行更新。此外, 它們可能不包含所需的所有編碼器或篩選器。
-
手動編譯: 下載原始碼, 然後使用所需的標誌(可以指定開啟需要的功能)執行./configure, 最後使用make或make install。但是, 必須手動設定配置選項, 並且您需要自己安裝第三方庫。
如何選擇
如果僅僅是想使用命令列的ffmepg, 建議用第一種方式或第二種方式.
如果需要在Mac OS專案中使用ffmpeg, 以及修改一些ffmpeg中的原始碼以適應專案,使用第三種方式.
1. 使用終端安裝FFmpeg
- 安裝Homebrew
Homebrew是命令列中的軟體包安裝器.絕大多數知名軟體包或外掛都可以用它來安裝. 如果你還沒有安裝,直接用下面的命令可以安裝
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
複製程式碼
- 安裝FFmpeg
-
通用版本安裝,只需命令列輸入:
brew install ffmpeg
-
最新版本安裝, 並提供最少的配置 (和庫依賴關係) 選項,命令列輸入:
brew install ffmpeg --HEAD
-
擴充套件安裝,可以自定義安裝公式,如下,可根據自己需求自行擴充套件,可能會失敗,因為需要一些依賴第三方庫:
brew install ffmpeg --with-fdk-aac --with-tools --with-ffplay --with-freetype --with-libass --with-libvorbis --with-opus --with-libvpx --with-x265
複製程式碼
- 安裝第三方庫中的ffmpeg
v 2.0版本之後,Homebrew不再為其核心公式提供選項。想要使用其他庫 (包括非免費庫) 構建 ffmpeg 的使用者需要使用來自第三方儲存庫的ffmpeg。這些庫不是由Homebrew維護的。
brew tap varenc/ffmpeg
brew install varenc/ffmpeg/ffmpeg
複製程式碼
- 更新
-
通用版本更新,只需終端輸入:
brew update && brew upgrade ffmpeg
-
如最新版本,終端輸入:
brew upgrade --fetch-HEAD ffmpeg
-
如果你已經使用brew install ffmpeg安裝了ffmpeg,可以使用 brew uninstall ffmpeg 解除安裝
2. 手動編譯
2.1 編譯環境 - Xcode
手動編譯Mac上必須安裝Xcode,然後安裝命令列工具
-
介面安裝: Preferences > Downloads > Components
-
命令列安裝:
xcode-select --install
2.2 安裝依賴庫
- 自動安裝依賴庫,只需命令列輸入:
$ brew install automake fdk-aac git lame libass libtool libvorbis libvpx \
opus sdl shtool texi2html theora wget x264 x265 xvid nasm
複製程式碼
- 手動安裝依賴庫
FFmpeg的編譯依賴於Pkg-config,而它又依賴於GLib,而GLib又依賴於gettext,所以必須先安裝並編譯相關依賴。
- Pkg-config & GLib & gettext
- gettext: 在庫中編輯檔案stpncpy.c,並且在#ifndef weak_alias之前新增#undef stpncpy.
LIBFFI_CFLAGS=-I/usr/include/ffi LIBFFI_LIBS=-lffi ./configure;make && sudo make install
複製程式碼
-
glib: Linux平臺下最常用的C語言函式庫,它具有很好的可移植性和實用性。
-
Pkg-config : 維護了一個儲存各個程式碼庫的路徑的資料庫。當然這個”資料庫” 非常的簡單,其實就是一個特殊的目錄,這個目錄中有一系列的以 “.pc” 為字尾的檔案。
GLIB_CFLAGS="-I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include" GLIB_LIBS="-lglib-2.0 -lgio-2.0" ./configure --with-pc-path="/usr/X11/lib/pkgconfig:/usr/X11/share/pkgconfig:/usr/lib/pkgconfig:/usr/local/lib/pkgconfig"
複製程式碼
Mac OS X Lion擁有自己的stpncpy函式它跟gettext重複產生衝突。
- Nasm
Nasm是x264所需的彙編程式。最新版本可在nasm.us上獲得。
- 其他附加的庫
-
x264: --enable-gpl --enable-libx264
-
fdk-aac: --enable-libfdk-aac
-
libvpx: --enable-libvpx
-
libvorbis: --enable-libvorbis
-
libopus:
-
LAME:--enable-libmp3lame
-
libass:--enable-libass
2.3 安裝Freetype
macOS已經安裝了freetype(較老的版本可能需要在安裝期間選擇X11),但不是在典型的位置
在freetype的./configure
檔案中加入如下指令:
CFLAGS=`freetype-config --cflags`
LDFLAGS=`freetype-config --libs` PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/lib/pkgconfig:/opt/X11/lib/pkgconfig
複製程式碼
2.4 編譯
做完以上所有依賴操作後,就可以連結下載FFmpeg原始碼。可以通過Generic compilation guide查閱詳細的編譯步驟.執行./configure --help
,可以瞭解可用的選項。
- 下載
$ git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
$ cd ffmpeg
複製程式碼
- 編譯
- 完整編譯:
$ ./configure --prefix=/usr/local --enable-gpl --enable-nonfree --enable-libass \
--enable-libfdk-aac --enable-libfreetype --enable-libmp3lame \
--enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libopus --enable-libxvid \
--samples=fate-suite/
make
複製程式碼
- 最簡編譯:
$ ./configure && make
複製程式碼
- 安裝
sudo make install
複製程式碼
2.5 手動編譯步驟
-
配置指令碼 (編輯指令碼檔案./configure)
-
編譯 (make)
-
安裝 (make install)
1>. 配置: 允許建立編譯步驟所需的必要檔案,並通過源包通常提供的配置指令碼完成。在配置期間,可以定義安裝字首和已啟用的元件。
2>. 編譯: 編譯通常包括在配置步驟完成後執行make。在此階段,將生成所需的庫和二進位制檔案。
3> 安裝: 安裝將在配置步驟中指定的路徑中安裝二進位制檔案和庫。請注意,由於您可以使用編譯路徑中編譯的二進位制檔案,因此不需要執行此步驟。
./configure
make
make install
複製程式碼
注意: 編譯源目錄中的檔案,並將庫安裝在/ usr / local中。第三步可能需要超級使用者許可權(因此可能需要由sudo make install替換),因為普通使用者無法修改/ usr / local。
2.6 安裝路徑配置
配置步驟通常允許使用者指定所謂的安裝字首,並且通常通過配置選項configure --prefix = PREFIX指定,其中PREFIX通常預設為/ usr / local。字首指定安裝所有元件的公共目錄。
安裝中通常涉及以下目錄:
-
PREFIX/bin: 包含生成的二進位制檔案 (e.g. ffmpeg, ffplay, ffprobe etc. in the case of FFmpeg)
-
PREFIX/include: 包含生成庫的標頭檔案 (e.g. libavutil/avstring.h, libavcodec/avcodec.h, libavformat/avformat.h etc. in case of FFmpeg)
-
PREFIX/lib:包含生成的庫 (e.g. libavutil, libavcodec, libavformat etc. in the case of FFmpeg)
-
PREFIX/share: 包含各種與系統無關的元件;特別是文件檔案和示例
一般建議使用預設路徑,但如果數量使用像/ opt / PROJECT /這樣的字首,專案將安裝在專用目錄中,要從系統中刪除,只需刪除/ opt / PREFIX路徑即可。但是此類安裝將需要編輯所有環境變數以指向自定義路徑。
2.7 環境變數配置
環境中定義的幾個變數會影響您的軟體包安裝。特別是,根據您的安裝字首,您可能需要更新其中一些變數,以確保系統工具可以找到已安裝的元件。可以通過命令env顯示環境變數列表。
以下是受影響變數的列表:
-
PATH: 定義變數簡化路徑,系統查詢二進位制檔案的路徑。例如,如果在/ usr / local /中安裝軟體包,則應更新PATH,使其包含/ usr / local / bin。這可以通過命令export PATH = / usr / local / bin:$ PATH來完成。
-
LD_LIBRARY_PATH: 系統查詢庫的路徑。例如,如果在/ usr / local /中安裝軟體包,則應更新LD_LIBRARY_PATH,使其包含/ usr / local / lib。這可以通過命令export LD_LIBRARY_PATH = / usr / local / lib:$ LD_LIBRARY_PATH來完成。有時不推薦使用此變數,而是使用ldconfig。
-
CFLAGS: 包含C編譯器使用的標誌,通常包括預處理指令,如-IPREFIX / include或編譯標誌。自定義CFLAGS通常由源包構建系統作為源包編譯器標誌的字首。或者,許多構建系統允許指定配置選項-extra-cflags。
-
LDFLAGS: 這些是連結器使用的指令,通常包括連結指令,如查詢自定義路徑中安裝的庫所需的-LPREFIX / lib。自定義LDFLAGS通常由源包構建系統作為源包連結器標誌的字首。或者,許多構建系統允許指定configure選項-extra-ldflags。
-
PKG_CONFIG_PATH: pkg-config使用的路徑,用於檢測許多編譯系統使用的pkg-config檔案,以檢測特定庫使用的自定義CFLAGS / LDFLAGS。
如果您在非標準路徑中安裝了軟體包,則需要更新這些環境庫,以便系統工具能夠檢測軟體包元件。在為依賴於其他已安裝的庫/標頭/工具的包執行配置指令碼時,一定要這樣做。
3. FFmpeg相關引數簡介
- 常用庫
| 庫名 | 用途 |
| :--: | :--: |
ffmpeg | 一個命令列工具,用來對視訊檔案轉換格式,也支援對電視卡即時編碼
ffserver | 一個HTTP多媒體即時廣播流伺服器,支援時光平移
ffplay|一個簡單的播放器,基於SDL與FFmpeg庫
libavcodec | 包含全部FFmpeg音訊/視訊編解碼庫
libavformat| 包含demuxers和muxer庫
libavutil | 包含一些工具庫
libpostproc | 對於視訊做前處理的庫
libavutil | 包含一些工具庫
libswscale | libswscale
- 主要引數
| 引數名 | 意義 |
| :--: | :--: |
-i | 設定輸入檔名。
-f | 設定輸出格式。
-y | 若輸出檔案已存在時則覆蓋檔案。
-fs | 超過指定的檔案大小時則結束轉換。
-ss | 從指定時間開始轉換。
-t | 從-ss時間開始轉換(如-ss 00:00:01.00 -t 00:00:10.00即從00:00:01.00開始到00:00:11.00)。
-title | 設定標題。
-timestamp | 設定時間戳。
-vsync | 增減Frame使影音同步。
| 視訊引數名 | 意義 |
| :--: | :--: |
b:v | 設定視訊流量,預設為200Kbit/秒。(單位請引用下方注意事項)
r| 設定幀率值,預設為25。
s | 設定畫面的寬與高。
aspect | 設定畫面的比例。
vn | 不處理視訊,於僅針對聲音做處理時使用。
vcodec( -c:v )| 設定視訊視訊編解碼器,未設定時則使用與輸入檔案相同之編解碼器。
| 聲音引數名 | 意義 |
| :--: | :--: |
b:a | 設定每Channel(最近的SVN版為所有Channel的總合)的流量。(單位請引用下方注意事項)
ar| 設定取樣率。
ac| 設定聲音的Channel數。
acodec ( -c:a ) | 設定聲音編解碼器,未設定時與視訊相同,使用與輸入檔案相同之編解碼器。
an | 不處理聲音,於僅針對視訊做處理時使用。
vol | 設定音量大小,256為標準音量。(要設定成兩倍音量時則輸入512,依此類推。)
- 檢視 FFmpeg官方文件
- 檢視h265的資料的基本資訊
ffmpeg -i /Users/tomxiang/Desktop/h265/test_tomxiang.h265
複製程式碼
- 用libx265轉mp4.
ffmpeg -i /Users/tomxiang/Desktop/test_tomxiang.h265 -c:v libx265 /Users/tomxiang/xxtest/test265.mp4
複製程式碼
- ffplay逐幀播放視訊與顯示視訊幀序號
macOS下使用ffplay,按下s鍵可單幀播放視訊,配合一個顯示文字的視訊濾鏡即可顯示當前畫面的幀序號,命令示例如下所示:
ffplay -vf "drawtext=fontfile=/Library/Fonts/Arial.ttf:text=%{n}:box=1:x=(w-tw)/2:y=h-(2*lh)" sample.mp4
複製程式碼
window下 FFmpeg原始碼編譯
1. 編譯環境配置
準備工作,先把下面四個軟體下載下來。
2) SDL 注意:在此環境下2.0.3版本的原始碼編譯會有問題,不推薦。
3)yasm
4)FFmpeg
1.1 安裝WinGW編譯環境
-
MinGW(Minimalist GNU for Windows):輔助編譯Windows程式的工具鏈。通過minGW installation manager來安裝。
-
MSYS(Minimal SYStem):是一個小型的GNU環境,包括基本的bash,make等等。它也可以通過minGW installation manager進行安裝。
-
開啟minGW installation manager,按照下圖進行勾選:
點選Installation->Apply Changes 進行安裝基本包。
1.2 安裝yasm
-
yasm是彙編編譯器,因為ffmpeg中為了提高效率用到了彙編指令,比如MMX和SSE。因此需要安裝這個工具。
-
如果沒有安裝yasm或nasm,在編譯的時候會遇到這樣的錯誤“nasm/yasm not found or too old.”
-
下載 yasm ,並將可執行行檔案重新命名為yasm.exe複製到
%MINGW_PATH%/bin
目錄下。其中MINGW_PATH是MINGW的安裝目錄。 -
把yasm原始碼包解壓到F:\Work\ffmpeg-2.4\yasm1.2.0目錄。進入yasm目錄,分別執行命令:
./configure --prefix=/usr/local/yasm
make
make install
複製程式碼
- 通過下面命令匯入yasm環境變數
export PATH="$PATH:/usr/local/yasm/bin"
複製程式碼
1.3 安裝pkg-config
pkg-config是一個輔助的配置、連結工具,可以方便的支援gcc自動配置。
建議參考:pkg-config for mingw 安裝及配置
注意配置好環境變數,PKG_CONFIG_PATH(pkg-config預設的庫依賴項查詢目錄)。
也可以把pkg-config.exe放到%MINGW_PATH%/bin
下。
1.4 下載安裝SDL
由於編譯ffplay需要SDL,所以需要先安裝SDL。
- SDL安裝方式1:
- 把SDL原始碼解壓縮到F:\Work\ffmpeg-2.4\SDL-1.2.15目錄。進入SDL目錄,分別執行
./configure --prefix=/usr/local/SDL
make
make install
複製程式碼
完成SDL的安裝。
-
SDL編譯完成之後,生成的bin檔案、include檔案、lib檔案存放在
C:\msys\1.0\local\SDL
目錄下。 -
通過下面命令匯入SDL環境變數.
export PATH="$PATH:/usr/local/SDL/bin:/usr/local/SDL/include:/usr/local/SDL/lib"
複製程式碼
如果沒有設定環境變數,在執行ffmpeg configure
時,SDL support項顯示為no.(注:mingw預設根目錄對應與windows下的C:\msys\1.0\目錄,可以通過echo $PATH檢視當前的系統路徑)
- SDL安裝方式2:
-
下載SDL2,解壓之後,把include/sdl、lib、bin目錄下的檔案拷貝到
%MINGW_PAH%/msys/1.0
的對應目錄下。 -
把l
ib/pkg-config/sdl2.pc
中prefix=/opt/local/x86_64-w64-mingw32
的prefix的路徑修改為%MINGW_PAH%/msys/1.0
,還有幾處prefix指定為/opt/local/x86_64-w64-mingw32
的地方也需要修改一下,可以全域性搜尋替換一下(沒有找到更好的方法)。
說明:
當編譯引數加上--enable-sdl時如果沒有找到匹配的sdl會報錯提示,如果不加這個引數,沒有報錯提示。
遇到問題可以檢視config.log中測試sdl部分的日誌,檢查是否存在sdl版本或者指定的庫的位置有問題。我就遇到了prefix指定的sdl位置不對,導致指定的編譯的標頭檔案位置不對導致找不到標頭檔案的問題。
1.5
2. 編譯FFmpeg
- 把ffmpeg原始碼(ffmpeg-2.4.tar.bz2)解壓到F:\Work\ffmpeg-2.4\ffmpeg-2.4,進入ffmpeg程式碼目錄, 分別執行下面命令:
# 進入FFmpeg原始碼目錄
cd FFmpeg
# 配置編譯引數
./configure --prefix=../buildout --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl
# 編譯
make
make install
複製程式碼
-
完成之後檢查FFmpeg編譯目錄下的config.h檔案,找到HAVE_SDL、CONFIG_SDL巨集,如果都是1,表示SDL配置成功。
-
可能存在的問題:
- 執行make時遇到下面的錯誤ffbuild/common.mak:174 missing separator. Stop
解決方法:
執行git config --global core.autocrlf false
然後執行下面的命令刪除ffmpeg程式碼,並重新獲取一下即可
- 執行ffplay.exe的時候提示找不到SDL2.dll
解決方法:
把下載的sdl中的bin目錄下的SDL2.dll拷貝到ffplay.exe所在的目錄。
linux下 FFmpeg原始碼編譯
IOS下 FFmpeg原始碼編譯
IOS 編碼簡介
iOS上編解碼分為兩種,硬編解碼和軟編解碼,可以參考下表:
| 型別 | 工具 | 硬體支援 | 後臺 | 思路 | 備註 |
| :--: | :--: | :--: | :--: | :--: | :--: |
硬編解碼| VideoToolBox | 非CPU或者專用處理器 | 編碼(iOS>=10.0),解碼不支援 | VideoVTToolBox | - |
|硬編解碼| AVAssetWriter| 非CPU或者專用處理器 | 支援編碼| 需要將視訊寫入本地檔案,然後通過實時監聽檔案內容的改變,讀取檔案並處理封包 | - |
| 軟編解碼 | FFmpeg | CPU| 支援| - | - |
IOS 編譯FFmpeg
- IOS 可以通過如下兩種方式安裝ffmpeg:
-
下載iOS版本ffmpeg靜態庫: 即不用手動編譯,我們只需要下載得到標頭檔案及.a庫檔案.
-
手動編譯: 下載原始碼, 可以在更改一些flag或原始碼後再編譯指令碼,較為靈活.
如果僅僅是想簡單直接使用ffmeg可以下載一個穩定版本的靜態庫, 建議用第一種方式.
如果需要在iOS專案中自定義使用ffmpeg, 以及修改一些ffmpeg中的原始碼以適應專案,使用第二種方式.
- IOS 編譯所需的資源可以從這個百度雲下載:IOS編譯FFmpeg所需資源下載
提取碼: 5400
百度雲 連結:pan.baidu.com/s/1xeHNgHHG… 密碼:5400
1. 下載 gas-preprocessor
此檔案是編譯FFmpeg必備的指令碼檔案,使用如下命令將其拷貝進bin下
cp -f /xxx/gas-preprocessor.pl /usr/local/bin/
複製程式碼
2. 安裝 yasm
下載yasm
yasm是一個完全重寫的NASM彙編並且支援x86和AMD64指令集.
brew install yasm
複製程式碼
3. 下載 x264-iOS編譯指令碼及原始碼
下載 x264-iOS編譯指令碼 及 原始碼
- 下載x264編譯指令碼解壓後如下
- 然後下載最新版原始碼解壓後如下
- 將原始碼資料夾改名為x264並放至編譯指令碼資料夾(x264-ios-master)下
修改後如圖:
因為編譯指令碼中指定檔案目錄為x264,所以需要改名,也可以改編譯指令碼
最好手動強制設定下GCC位置,否則可能會報錯,然後執行命令:
cd 到你的x264-ios-master資料夾下,然後執行命令:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
./build-x264.sh
複製程式碼
- 執行完成之後可以看到生成了x264-iOS資料夾
- 可能存在的編譯報錯:
No working C compiler found
: 新版mac直接編譯會報錯,原因是gcc一些必要工具找不到.可能是xcode位置換了的原因,因為我們主要使用真機除錯,所以我們在編譯指令碼中只保留arm64即可,如下修改後,可以直接編譯通過. 不過像模擬器這樣的設定是無法使用x264的,因為我們相當於僅編譯了真機所需的庫.
ARCHS="arm64 x86_64 i386 armv7 armv7s"
改為如下
ARCHS="arm64"
複製程式碼
4. 下載FFmpeg-iOS編譯指令碼及原始碼
注意: 在這裡可以僅下載FFmpeg-iOS編譯指令碼,不用下載原始碼,執行指令碼會自動下載原始碼,如果不想每次自動下載,可以手動下載原始碼,稍微修改下FFmpeg編譯指令碼即可.這裡不做過多說明.
- 修改指令碼(build-ffmpeg.sh檔案)內容
- x264編譯好的資料夾必須在當前目錄並且命名為fat-x264,所以我們第3步編譯後生成的x264-iOS資料夾改名成fat-264,放在FFmpeg-iOS-build-script這個資料夾中。目錄結構如下:
- 修改如下內容:
CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET -fembed-bitcode"
修改為
CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET"
複製程式碼
在build-ffmpeg.sh中找到104行,修改為CFLAGS="$CFLAGS -mios-version-min=$DEPLOYMENT_TARGET"
如下圖:
- 因為我們在上一步中僅僅編譯arm64的x264,所以這裡我們也僅僅編譯arm64的FFmpeg.稍微修改指令碼檔案即可.
ARCHS="arm64 armv7 x86_64 i386"
修改為
ARCHS="arm64"
複製程式碼
在build-ffmpeg.sh中找到37行:ARCHS="arm64 armv7 x86_64 i386"
修改為:ARCHS="arm64"
。如下圖所示:
- 如果要使用avutil.h相關功能,需要更改指令碼
FFmpeg框架中的一個結構體命名為"AVMediaType"與蘋果自帶框架產生衝突,所以,我們必須修改編譯指令碼,使用"FFmpegAVMediaType"帶替換"AVMediaType".這裡需要在指令碼檔案中新增如下命令列,即將AVMediaType
替換為FFmpegAVMediaType
. 注意: $SOURCE為ffmpeg的根目錄.
grep -rl AVMediaType ./$SOURCE | xargs sed -i .bak s@AVMediaType@FFmpegAVMediaType@g
複製程式碼
- 編譯指令碼檔案
./build-ffmpeg.sh
複製程式碼
執行指令碼後,會先下載原始碼:
5. Xcode編譯
- Xcode新建iOS專案
新建一個iOS工程,然後將ViewController.m
重新命名為 ViewController.mm
,因為 FFmpeg中涉及C,C++混編,所以需要做此操作.
-
將FFmpeg編譯好的標頭檔案與庫拉進專案中,並在主控制器測試程式碼,此時會有一大堆錯誤丟擲,下面逐個解決.
-
新增依賴庫
- 在Build Setting中禁止Bitcode
- 在Build Setting中設定標頭檔案與庫的位置
這裡特別要注意,因為在大多數專案中以及FFmpeg自身原始碼中,都是以以下格式來匯入的標頭檔案