移動端學習音視頻開發,FFmpeg能夠說是必學的框架,FFmpeg在linux平臺下開發,但它一樣也能夠在其餘操做系統環境中編譯運行,包括Windows、Mac OS X等。FFmpeg是一套能夠用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序,它包括了目前領先的音/視頻編碼庫libavcodec。html
FFmpeg有很是強大的功能,包括視頻採集功能、視頻格式轉換、視頻抓圖、給視頻加水印等。同時還支持以RTP方式將視頻流傳送給支持RTSP的流媒體服務器,支持直播應用。linux
本文講述Mac終端自動,手動編譯FFmpeg庫,對於Mac終端而言,最終生成二進制文件(ex: ffmpeg,ffplay...)git
能夠經過以下三種方式安裝ffmpeggithub
./configure
, 最後使用make
或make install
。可是, 必須手動設置配置選項, 而且您須要本身安裝第三方庫。如何選擇數據庫
Homebrew
安裝FFmpeg
Homebrew
Homebrew
是命令行中的軟件包安裝器.絕大多數知名軟件包或插件均可以用它來安裝. 若是你尚未安裝,直接用下面的命令能夠安裝編程
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
json
安裝FFmpeg
xcode
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
複製代碼
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
卸載
手動編譯Mac上必須安裝Xcode,而後安裝命令行工具
Preferences > Downloads > Components
xcode-select --install
$ 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
,因此必須先安裝並編譯相關依賴。
stpncpy.c
,而且在#ifndef weak_alias
以前添加#undef stpncpy
.LIBFFI_CFLAGS=-I/usr/include/ffi LIBFFI_LIBS=-lffi ./configure;make && sudo make install
複製代碼
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是x264所需的彙編程序。最新版本可在nasm.us上得到。
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
複製代碼
作完以上全部依賴操做後,就能夠連接下載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版本及其依賴庫的版本在不斷升級,因此可能會產生一些沒法預料的問題,可根據提示另行解決.
ffmpeg庫的能夠有不少種來源,如官方自動編譯好的庫或是網上我的或第三方軟件中自帶的編譯好的庫.但這些庫有如下一些缺點
1>. 配置: 容許建立編譯步驟所需的必要文件,並經過源包一般提供的配置腳本完成。在配置期間,能夠定義安裝前綴和已啓用的組件。
2>. 編譯: 編譯一般包括在配置步驟完成後運行make。在此階段,將生成所需的庫和二進制文件。
3> 安裝: 安裝將在配置步驟中指定的路徑中安裝二進制文件和庫。請注意,因爲您可使用編譯路徑中編譯的二進制文件,所以不須要執行此步驟。
./configure
make
make install
複製代碼
注意: 編譯源目錄中的文件,並將庫安裝在/ usr / local中。第三步可能須要超級用戶權限(所以可能須要由sudo make install替換),由於普通用戶沒法修改/ usr / local。
配置步驟一般容許用戶指定所謂的安裝前綴,而且一般經過配置選項configure --prefix = PREFIX指定,其中PREFIX一般默認爲/ usr / local。前綴指定安裝全部組件的公共目錄。
安裝中一般涉及如下目錄:
通常建議使用默認路徑,但若是數量使用像/ opt / PROJECT /這樣的前綴,項目將安裝在專用目錄中,要從系統中刪除,只需刪除/ opt / PREFIX路徑便可。可是此類安裝將須要編輯全部環境變量以指向自定義路徑。
環境中定義的幾個變量會影響您的軟件包安裝。特別是,根據您的安裝前綴,您可能須要更新其中一些變量,以確保系統工具能夠找到已安裝的組件。能夠經過命令env
顯示環境變量列表。
如下是受影響變量的列表:
若是您在非標準路徑中安裝了軟件包,則須要更新這些環境庫,以便系統工具可以檢測軟件包組件。在爲依賴於其餘已安裝的庫/標頭/工具的包運行配置腳本時,必定要這樣作。
庫名 | 用途 |
---|---|
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,依此類推。) |
一個編碼後的文件是否正確就用如下命令,若是格式錯誤的話會輸出一堆Error。
$ ffprobe -show_frames /xx.h265
$ ffprobe -print_format json -show_format -show_streams -i /xx.h265
複製代碼
查看文件基本信息
$ ffmpeg -i /xx.h265
複製代碼
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
複製代碼