背景
移動(dòng)端學(xué)習(xí)音視頻開(kāi)發(fā),FFmpeg可以說(shuō)是必學(xué)的框架,FFmpeg在linux平臺(tái)下開(kāi)發(fā)禽额,但它同樣也可以在其他操作系統(tǒng)環(huán)境中編譯運(yùn)行毫胜,包括Windows负蚊、Mac OS X等袍辞。FFmpeg是一套可以用來(lái)記錄贸宏、轉(zhuǎn)換數(shù)字音頻造寝、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序吭练,它包括了目前領(lǐng)先的音/視頻編碼庫(kù)libavcodec匹舞。
FFmpeg有非常強(qiáng)大的功能,包括視頻采集功能线脚、視頻格式轉(zhuǎn)換、視頻抓圖叫榕、給視頻加水印等浑侥。同時(shí)還支持以RTP方式將視頻流傳送給支持RTSP的流媒體服務(wù)器,支持直播應(yīng)用晰绎。
適用場(chǎng)景
本文講述Mac終端自動(dòng),手動(dòng)編譯FFmpeg庫(kù),對(duì)于Mac終端而言,最終生成二進(jìn)制文件(ex: ffmpeg,ffplay...)
安裝方式
可以通過(guò)如下三種方式安裝ffmpeg
- 終端安裝 (借助homebrew): 此方式ffmpeg會(huì)保持自動(dòng)更新.
- 下載ffmpeg靜態(tài)庫(kù): 即不用手動(dòng)編譯,我們只需要直接運(yùn)行下載得到的二進(jìn)制文件即可.靜態(tài)生成的一個(gè)缺點(diǎn)是必須手動(dòng)執(zhí)行更新寓落。此外, 它們可能不包含所需的所有編碼器或篩選器。
- 手動(dòng)編譯: 下載源碼, 然后使用所需的標(biāo)志(可以指定開(kāi)啟需要的功能)運(yùn)行
./configure
, 最后使用make
或make install
荞下。但是, 必須手動(dòng)設(shè)置配置選項(xiàng), 并且您需要自己安裝第三方庫(kù)伶选。
如何選擇
- 如果僅僅是想使用命令行的ffmepg, 建議用第一種方式或第二種方式.
- 如果需要在Mac OS項(xiàng)目中使用ffmpeg, 以及修改一些ffmpeg中的源碼以適應(yīng)項(xiàng)目,使用第三種方式.
具體步驟
1. 使用終端安裝FFmpeg
1.1. 借助Homebrew
安裝FFmpeg
- 安裝
Homebrew
Homebrew
是命令行中的軟件包安裝器.絕大多數(shù)知名軟件包或插件都可以用它來(lái)安裝. 如果你還沒(méi)有安裝,直接用下面的命令可以安裝
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
-
安裝
FFmpeg
- 通用版本
brew install ffmpeg
- 最新版本, 并提供最少的配置 (和庫(kù)依賴關(guān)系) 選項(xiàng)。
brew install ffmpeg --HEAD
擴(kuò)展安裝
還可以自定義安裝公式,如下,可根據(jù)自己需求自行擴(kuò)展,可能會(huì)失敗,因?yàn)樾枰恍┮蕾嚨谌綆?kù)
brew install ffmpeg --with-fdk-aac --with-tools --with-ffplay --with-freetype --with-libass --with-libvorbis --with-opus --with-libvpx --with-x265
1.2. 安裝第三方庫(kù)中的ffmpeg
v 2.0版本之后,Homebrew
不再為其核心公式提供選項(xiàng)尖昏。想要使用其他庫(kù) (包括非免費(fèi)庫(kù)) 構(gòu)建 ffmpeg 的用戶需要使用來(lái)自第三方存儲(chǔ)庫(kù)的ffmpeg仰税。這些庫(kù)不是由Homebrew
維護(hù)的。
例如:
brew tap varenc/ffmpeg
brew install varenc/ffmpeg/ffmpeg
1.3. 更新
更新需要根據(jù)上面安裝步驟中是使用通用版本還是最新版本
- 通用版本
brew update && brew upgrade ffmpeg
- 最新版本
brew upgrade --fetch-HEAD ffmpeg
注意: 如果你已經(jīng)使用
brew install ffmpeg
安裝了ffmpeg,可以使用brew uninstall ffmpeg
卸載
2. 手動(dòng)編譯
2.2. 編譯環(huán)境 - Xcode
手動(dòng)編譯Mac上必須安裝Xcode,然后安裝命令行工具
- 界面安裝:
Preferences > Downloads > Components
- 命令行安裝:
xcode-select --install
2.1. 安裝依賴庫(kù)
2.1.1. 自動(dòng)安裝依賴庫(kù)
$ brew install automake fdk-aac git lame libass libtool libvorbis libvpx \
opus sdl shtool texi2html theora wget x264 x265 xvid nasm
2.1.2. 手動(dòng)安裝依賴庫(kù)
FFmpeg的編譯依賴于Pkg-config
抽诉,而它又依賴于GLib
,而GLib
又依賴于gettext
,所以必須先安裝并編譯相關(guān)依賴陨簇。
- Pkg-config & GLib & gettext
-
gettext: 在庫(kù)中編輯文件
stpncpy.c
,并且在#ifndef weak_alias
之前添加#undef stpncpy
.
LIBFFI_CFLAGS=-I/usr/include/ffi LIBFFI_LIBS=-lffi ./configure;make && sudo make install
- glib: Linux平臺(tái)下最常用的C語(yǔ)言函數(shù)庫(kù),它具有很好的可移植性和實(shí)用性迹淌。
- Pkg-config : 維護(hù)了一個(gè)保存各個(gè)代碼庫(kù)的路徑的數(shù)據(jù)庫(kù)河绽。當(dāng)然這個(gè)”數(shù)據(jù)庫(kù)” 非常的簡(jiǎn)單己单,其實(shí)就是一個(gè)特殊的目錄,這個(gè)目錄中有一系列的以 “.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"
-
gettext: 在庫(kù)中編輯文件
Mac OS X Lion擁有自己的
stpncpy
函數(shù)它跟gettext
重復(fù)產(chǎn)生沖突纹笼。
- Nasm
Nasm是x264所需的匯編程序。最新版本可在nasm.us上獲得苟跪。
- 附加的庫(kù)
- 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已經(jīng)安裝了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源代碼∠髋兀可以通過(guò)Generic compilation guide查閱詳細(xì)的編譯步驟.
運(yùn)行./configure --help
牍疏,可以了解可用的選項(xiàng)。
- 下載
$ 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
- 最簡(jiǎn)編譯
$ ./configure && make
- 安裝
sudo make install
至此,FFmpeg安裝成功.
注意: 以上過(guò)程如果報(bào)錯(cuò),需要另行解決,因?yàn)閒fmpeg版本及其依賴庫(kù)的版本在不斷升級(jí),所以可能會(huì)產(chǎn)生一些無(wú)法預(yù)料的問(wèn)題,可根據(jù)提示另行解決.
3. 手動(dòng)編譯詳解
3.1. 原因
ffmpeg庫(kù)的可以有很多種來(lái)源,如官方自動(dòng)編譯好的庫(kù)或是網(wǎng)上個(gè)人或第三方軟件中自帶的編譯好的庫(kù).但這些庫(kù)有以下一些缺點(diǎn)
- 老版本的二進(jìn)制包已過(guò)時(shí),其中包含嚴(yán)重錯(cuò)誤或缺少必需的功能拨齐,這些功能在新版本中才修復(fù)鳞陨。
- 不能自定義編譯,例如獲取特定于平臺(tái)的優(yōu)化或鏈接二進(jìn)制包中不支持的特定庫(kù)。
- 不能更改源碼,例如需要通過(guò)更改源碼以讓ffmpeg實(shí)現(xiàn)定制化的需求.
3.2. 步驟
- 配置腳本 (編輯腳本文件./configure)
- 編譯 (make)
- 安裝 (make install)
1>. 配置: 允許創(chuàng)建編譯步驟所需的必要文件瞻惋,并通過(guò)源包通常提供的配置腳本完成厦滤。在配置期間,可以定義安裝前綴和已啟用的組件歼狼。
2>. 編譯: 編譯通常包括在配置步驟完成后運(yùn)行make掏导。在此階段,將生成所需的庫(kù)和二進(jìn)制文件羽峰。
3> 安裝: 安裝將在配置步驟中指定的路徑中安裝二進(jìn)制文件和庫(kù)趟咆。請(qǐng)注意,由于您可以使用編譯路徑中編譯的二進(jìn)制文件梅屉,因此不需要執(zhí)行此步驟值纱。
./configure
make
make install
注意: 編譯源目錄中的文件,并將庫(kù)安裝在/ usr / local中坯汤。第三步可能需要超級(jí)用戶權(quán)限(因此可能需要由sudo make install替換)虐唠,因?yàn)槠胀ㄓ脩魺o(wú)法修改/ usr / local。
3.3. 安裝路徑
配置步驟通常允許用戶指定所謂的安裝前綴惰聂,并且通常通過(guò)配置選項(xiàng)configure --prefix = PREFIX指定疆偿,其中PREFIX通常默認(rèn)為/ usr / local。前綴指定安裝所有組件的公共目錄搓幌。
安裝中通常涉及以下目錄:
- PREFIX/bin: 包含生成的二進(jìn)制文件 (e.g. ffmpeg, ffplay, ffprobe etc. in the case of FFmpeg)
- PREFIX/include: 包含生成庫(kù)的頭文件 (e.g. libavutil/avstring.h, libavcodec/avcodec.h, libavformat/avformat.h etc. in case of FFmpeg)
- PREFIX/lib:包含生成的庫(kù) (e.g. libavutil, libavcodec, libavformat etc. in the case of FFmpeg)
- PREFIX/share: 包含各種與系統(tǒng)無(wú)關(guān)的組件;特別是文檔文件和示例
一般建議使用默認(rèn)路徑,但如果數(shù)量使用像/ opt / PROJECT /這樣的前綴杆故,項(xiàng)目將安裝在專用目錄中,要從系統(tǒng)中刪除鼻种,只需刪除/ opt / PREFIX路徑即可反番。但是此類安裝將需要編輯所有環(huán)境變量以指向自定義路徑。
3.4. 環(huán)境變量
環(huán)境中定義的幾個(gè)變量會(huì)影響您的軟件包安裝。特別是罢缸,根據(jù)您的安裝前綴篙贸,您可能需要更新其中一些變量,以確保系統(tǒng)工具可以找到已安裝的組件枫疆【舸ǎ可以通過(guò)命令env
顯示環(huán)境變量列表。
以下是受影響變量的列表:
- PATH: 定義變量簡(jiǎn)化路徑,系統(tǒng)查找二進(jìn)制文件的路徑息楔。例如寝贡,如果在/ usr / local /中安裝軟件包,則應(yīng)更新PATH值依,使其包含/ usr / local / bin圃泡。這可以通過(guò)命令export PATH = / usr / local / bin:$ PATH來(lái)完成。
- LD_LIBRARY_PATH: 系統(tǒng)查找?guī)斓穆窂皆赶铡@缙睦绻? usr / local /中安裝軟件包,則應(yīng)更新LD_LIBRARY_PATH辆亏,使其包含/ usr / local / lib风秤。這可以通過(guò)命令export LD_LIBRARY_PATH = / usr / local / lib:$ LD_LIBRARY_PATH來(lái)完成。有時(shí)不推薦使用此變量扮叨,而是使用ldconfig缤弦。
- CFLAGS: 包含C編譯器使用的標(biāo)志,通常包括預(yù)處理指令彻磁,如-IPREFIX / include或編譯標(biāo)志碍沐。自定義CFLAGS通常由源包構(gòu)建系統(tǒng)作為源包編譯器標(biāo)志的前綴≈则眩或者抢韭,許多構(gòu)建系統(tǒng)允許指定配置選項(xiàng)-extra-cflags。
- LDFLAGS: 這些是鏈接器使用的指令恍箭,通常包括鏈接指令,如查找自定義路徑中安裝的庫(kù)所需的-LPREFIX / lib瞧省。自定義LDFLAGS通常由源包構(gòu)建系統(tǒng)作為源包鏈接器標(biāo)志的前綴扯夭。或者鞍匾,許多構(gòu)建系統(tǒng)允許指定configure選項(xiàng)-extra-ldflags交洗。
- PKG_CONFIG_PATH: pkg-config使用的路徑,用于檢測(cè)許多編譯系統(tǒng)使用的pkg-config文件橡淑,以檢測(cè)特定庫(kù)使用的自定義CFLAGS / LDFLAGS构拳。
如果您在非標(biāo)準(zhǔn)路徑中安裝了軟件包,則需要更新這些環(huán)境庫(kù),以便系統(tǒng)工具能夠檢測(cè)軟件包組件置森。在為依賴于其他已安裝的庫(kù)/標(biāo)頭/工具的包運(yùn)行配置腳本時(shí),一定要這樣做斗埂。
簡(jiǎn)要使用說(shuō)明
- 常用庫(kù)
庫(kù)名 | 用途 |
---|---|
ffmpeg | 一個(gè)命令行工具,用來(lái)對(duì)視頻文件轉(zhuǎn)換格式凫海,也支持對(duì)電視卡即時(shí)編碼 |
ffserver | 一個(gè)HTTP多媒體即時(shí)廣播流服務(wù)器呛凶,支持時(shí)光平移 |
ffplay | 一個(gè)簡(jiǎn)單的播放器,基于SDL與FFmpeg庫(kù) |
libavcodec | 包含全部FFmpeg音頻/視頻編解碼庫(kù) |
libavformat | 包含demuxers和muxer庫(kù) |
libavutil | 包含一些工具庫(kù) |
libpostproc | 對(duì)于視頻做前處理的庫(kù) |
libavutil | 包含一些工具庫(kù) |
libswscale | libswscale |
- 主要參數(shù)
參數(shù)名 | 意義 |
---|---|
-i | 設(shè)置輸入檔名行贪。 |
-f | 設(shè)置輸出格式漾稀。 |
-y | 若輸出文件已存在時(shí)則覆蓋文件。 |
-fs | 超過(guò)指定的文件大小時(shí)則結(jié)束轉(zhuǎn)換建瘫。 |
-ss | 從指定時(shí)間開(kāi)始轉(zhuǎn)換崭捍。 |
-t | 從-ss時(shí)間開(kāi)始轉(zhuǎn)換(如-ss 00:00:01.00 -t 00:00:10.00即從00:00:01.00開(kāi)始到00:00:11.00)。 |
-title | 設(shè)置標(biāo)題啰脚。 |
-timestamp | 設(shè)置時(shí)間戳殷蛇。 |
-vsync | 增減Frame使影音同步。 |
視頻參數(shù)名 | 意義 |
---|---|
b:v | 設(shè)置視頻流量拣播,默認(rèn)為200Kbit/秒晾咪。(單位請(qǐng)引用下方注意事項(xiàng)) |
r | 設(shè)置幀率值,默認(rèn)為25贮配。 |
s | 設(shè)置畫面的寬與高谍倦。 |
aspect | 設(shè)置畫面的比例。 |
vn | 不處理視頻泪勒,于僅針對(duì)聲音做處理時(shí)使用昼蛀。 |
vcodec( -c:v ) | 設(shè)置視頻視頻編解碼器,未設(shè)置時(shí)則使用與輸入文件相同之編解碼器圆存。 |
聲音參數(shù)名 | 意義 |
---|---|
b:a | 設(shè)置每Channel(最近的SVN版為所有Channel的總合)的流量叼旋。(單位請(qǐng)引用下方注意事項(xiàng)) |
ar | 設(shè)置采樣率。 |
ac | 設(shè)置聲音的Channel數(shù)沦辙。 |
acodec ( -c:a ) | 設(shè)置聲音編解碼器夫植,未設(shè)置時(shí)與視頻相同,使用與輸入文件相同之編解碼器油讯。 |
an | 不處理聲音详民,于僅針對(duì)視頻做處理時(shí)使用。 |
vol | 設(shè)置音量大小陌兑,256為標(biāo)準(zhǔn)音量沈跨。(要設(shè)置成兩倍音量時(shí)則輸入512,依此類推兔综。) |
- ffprobe
一個(gè)編碼后的文件是否正確就用以下命令饿凛,如果格式錯(cuò)誤的話會(huì)輸出一堆Error狞玛。
$ ffprobe -show_frames /xx.h265
$ ffprobe -print_format json -show_format -show_streams -i /xx.h265
- ffmpeg
查看文件基本信息
$ ffmpeg -i /xx.h265
- ffplay
ffplay逐幀播放視頻與顯示視頻幀序號(hào)
目前使用這個(gè)功能檢查部分畫面不正確視頻的原因。macOS下使用ffplay涧窒,按下s鍵可單幀播放視頻心肪,配合一個(gè)顯示文字的視頻濾鏡即可顯示當(dāng)前畫面的幀序號(hào),命令示例如下所示杀狡。
$ ffplay -vf "drawtext=fontfile=/Library/Fonts/Arial.ttf:text=%{n}:box=1:x=(w-tw)/2:y=h-(2*lh)" xx.mp4