Mac終端FFmpeg手動,自動編譯

背景

移動端學習音視頻開發,FFmpeg能夠說是必學的框架,FFmpeg在linux平臺下開發,但它一樣也能夠在其餘操做系統環境中編譯運行,包括Windows、Mac OS X等。FFmpeg是一套能夠用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序,它包括了目前領先的音/視頻編碼庫libavcodec。html

FFmpeg有很是強大的功能,包括視頻採集功能、視頻格式轉換、視頻抓圖、給視頻加水印等。同時還支持以RTP方式將視頻流傳送給支持RTSP的流媒體服務器,支持直播應用。linux

適用場景

本文講述Mac終端自動,手動編譯FFmpeg庫,對於Mac終端而言,最終生成二進制文件(ex: ffmpeg,ffplay...)git

安裝方式

能夠經過以下三種方式安裝ffmpeggithub

  • 終端安裝 (藉助homebrew): 此方式ffmpeg會保持自動更新.
  • 下載ffmpeg靜態庫: 即不用手動編譯,咱們只須要直接運行下載獲得的二進制文件便可.靜態生成的一個缺點是必須手動執行更新。此外, 它們可能不包含所需的全部編碼器或篩選器。
  • 手動編譯: 下載源碼, 而後使用所需的標誌(能夠指定開啓須要的功能)運行./configure, 最後使用makemake install。可是, 必須手動設置配置選項, 而且您須要本身安裝第三方庫。

如何選擇數據庫

  • 若是僅僅是想使用命令行的ffmepg, 建議用第一種方式或第二種方式.
  • 若是須要在Mac OS項目中使用ffmpeg, 以及修改一些ffmpeg中的源碼以適應項目,使用第三種方式.

具體步驟

1. 使用終端安裝FFmpeg

1.1. 藉助Homebrew安裝FFmpeg

  • 安裝Homebrew

Homebrew是命令行中的軟件包安裝器.絕大多數知名軟件包或插件均可以用它來安裝. 若是你尚未安裝,直接用下面的命令能夠安裝編程

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"json

  • 安裝FFmpegxcode

    • 通用版本
    brew install ffmpeg
    複製代碼
    • 最新版本, 並提供最少的配置 (和庫依賴關係) 選項。
    brew install ffmpeg --HEAD
    複製代碼
  • 擴展安裝ruby

還能夠自定義安裝公式,以下,可根據本身需求自行擴展,可能會失敗,由於須要一些依賴第三方庫bash

brew install ffmpeg --with-fdk-aac --with-tools --with-ffplay --with-freetype --with-libass --with-libvorbis --with-opus --with-libvpx --with-x265
複製代碼

1.2. 安裝第三方庫中的ffmpeg

v 2.0版本以後,Homebrew再也不爲其核心公式提供選項。想要使用其餘庫 (包括非免費庫) 構建 ffmpeg 的用戶須要使用來自第三方存儲庫的ffmpeg。這些庫不是由Homebrew維護的。

例如:

brew tap varenc/ffmpeg
brew install varenc/ffmpeg/ffmpeg
複製代碼

1.3. 更新

更新須要根據上面安裝步驟中是使用通用版本仍是最新版本

  • 通用版本
brew update && brew upgrade ffmpeg
複製代碼
  • 最新版本
brew upgrade --fetch-HEAD ffmpeg
複製代碼

注意: 若是你已經使用brew install ffmpeg安裝了ffmpeg,可使用 brew uninstall ffmpeg 卸載

2. 手動編譯

2.2. 編譯環境 - Xcode

手動編譯Mac上必須安裝Xcode,而後安裝命令行工具

  • 界面安裝: Preferences > Downloads > Components
  • 命令行安裝: xcode-select --install

2.1. 安裝依賴庫

2.1.1. 自動安裝依賴庫
$ brew install automake fdk-aac git lame libass libtool libvorbis libvpx \
opus sdl shtool texi2html theora wget x264 x265 xvid nasm
複製代碼
2.1.2. 手動安裝依賴庫

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
複製代碼

至此,FFmpeg安裝成功.

注意: 以上過程若是報錯,須要另行解決,由於ffmpeg版本及其依賴庫的版本在不斷升級,因此可能會產生一些沒法預料的問題,可根據提示另行解決.

3. 手動編譯詳解

3.1. 緣由

ffmpeg庫的能夠有不少種來源,如官方自動編譯好的庫或是網上我的或第三方軟件中自帶的編譯好的庫.但這些庫有如下一些缺點

  • 老版本的二進制包已過期,其中包含嚴重錯誤或缺乏必需的功能,這些功能在新版本中才修復。
  • 不能自定義編譯,例如獲取特定於平臺的優化或連接二進制包中不支持的特定庫。
  • 不能更改源碼,例如須要經過更改源碼以讓ffmpeg實現定製化的需求.

3.2. 步驟

  • 配置腳本 (編輯腳本文件./configure)
  • 編譯 (make)
  • 安裝 (make install)

1>. 配置: 容許建立編譯步驟所需的必要文件,並經過源包一般提供的配置腳本完成。在配置期間,能夠定義安裝前綴和已啓用的組件。

2>. 編譯: 編譯一般包括在配置步驟完成後運行make。在此階段,將生成所需的庫和二進制文件。

3> 安裝: 安裝將在配置步驟中指定的路徑中安裝二進制文件和庫。請注意,因爲您可使用編譯路徑中編譯的二進制文件,所以不須要執行此步驟。

./configure
make
make install
複製代碼

注意: 編譯源目錄中的文件,並將庫安裝在/ usr / local中。第三步可能須要超級用戶權限(所以可能須要由sudo make install替換),由於普通用戶沒法修改/ usr / local。

3.3. 安裝路徑

配置步驟一般容許用戶指定所謂的安裝前綴,而且一般經過配置選項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路徑便可。可是此類安裝將須要編輯全部環境變量以指向自定義路徑。

3.4. 環境變量

環境中定義的幾個變量會影響您的軟件包安裝。特別是,根據您的安裝前綴,您可能須要更新其中一些變量,以確保系統工具能夠找到已安裝的組件。能夠經過命令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。

若是您在非標準路徑中安裝了軟件包,則須要更新這些環境庫,以便系統工具可以檢測軟件包組件。在爲依賴於其餘已安裝的庫/標頭/工具的包運行配置腳本時,必定要這樣作。

簡要使用說明

  • 經常使用庫
庫名 用途
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,依此類推。)
  • ffprobe

一個編碼後的文件是否正確就用如下命令,若是格式錯誤的話會輸出一堆Error。

$ ffprobe -show_frames /xx.h265

$ ffprobe -print_format json -show_format -show_streams -i /xx.h265

複製代碼
  • ffmpeg

查看文件基本信息

$ ffmpeg -i /xx.h265

複製代碼
  • ffplay

ffplay逐幀播放視頻與顯示視頻幀序號

目前使用這個功能檢查部分畫面不正確視頻的緣由。macOS下使用ffplay,按下s鍵可單幀播放視頻,配合一個顯示文字的視頻濾鏡便可顯示當前畫面的幀序號,命令示例以下所示。

$ ffplay -vf "drawtext=fontfile=/Library/Fonts/Arial.ttf:text=%{n}:box=1:x=(w-tw)/2:y=h-(2*lh)" xx.mp4
複製代碼

參考文檔

相關文章
相關標籤/搜索