Mac終端FFmpeg手動(dòng),自動(dòng)編譯

背景

移動(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, 最后使用makemake 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"
    

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

參考文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒙畴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子呜象,更是在濱河造成了極大的恐慌膳凝,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恭陡,死亡現(xiàn)場(chǎng)離奇詭異蹬音,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)休玩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門著淆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拴疤,你說(shuō)我怎么就攤上這事永部。” “怎么了呐矾?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵苔埋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蜒犯,道長(zhǎng)组橄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任罚随,我火速辦了婚禮玉工,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淘菩。我一直安慰自己遵班,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布潮改。 她就那樣靜靜地躺著费奸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪进陡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天微服,我揣著相機(jī)與錄音趾疚,去河邊找鬼缨历。 笑死,一個(gè)胖子當(dāng)著我的面吹牛糙麦,可吹牛的內(nèi)容都是我干的辛孵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赡磅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼魄缚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起焚廊,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冶匹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后咆瘟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚼隘,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年袒餐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了飞蛹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灸眼,死狀恐怖卧檐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焰宣,我是刑警寧澤霉囚,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站宛徊,受9級(jí)特大地震影響迅矛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镰吵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一扔亥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苞氮,春花似錦湾揽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至贷帮,卻和暖如春戚揭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撵枢。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工民晒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留精居,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓潜必,卻偏偏與公主長(zhǎng)得像靴姿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磁滚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容