寫在前面
如果對FFmpeg有需要更多了解的請訂閱我的專題:音視頻專輯
本文對 ffmpeg 進(jìn)行裁剪采用的是配置所需的接口,不需要的不配置,而不是采用修 改源代碼的方式。
4.1 configure 參數(shù)
4.1.1 通用選項(xiàng)
在 linux 下進(jìn)入終端, 找到 ffmpeg 解壓位置, 輸入如下命令:
root@web ffmpeg]# ./configure –help
得到 configure 的基本選項(xiàng)參數(shù), 其并沒有中文解釋 。
| 選項(xiàng) | 解釋 |
|---|---|
| --help | 顯示此幫助信息 |
| --log[=FILE|yes|no] | 記錄測試并輸出到 config.err 文件 |
| --prefix=PREFIX | 安裝程序到指定目錄(默認(rèn)/usr/local) |
| --libdir=DIR | 安裝庫到指定目錄(默認(rèn) prefix/lib) |
| --shlibdir=DIR | 指定共享庫路徑(默認(rèn) prefix/lib) |
| --incdir=DIR | 指定 includes 路徑(默認(rèn) prefix/include/ffmpeg) |
| --mandir=DIR | 指定 man page 路徑(默認(rèn) prefix/man) |
| --enable-mp3lame | 啟用 mp3 編碼 libmp3lame(默認(rèn)關(guān)閉) |
| --enable-libogg | 啟用 ogg 支持 libogg(默認(rèn)關(guān)閉) |
| --enable-vorbis | 啟用 Vorbis 支持 libvorbis(默認(rèn)關(guān)閉) |
| --enable-faad | 啟用 faad 支持 libfaad(默認(rèn)關(guān)閉) |
| --enable-faadbin | 啟用 faad 運(yùn)行時(shí)鏈接支持(默認(rèn)關(guān)閉) |
| --enable-faac | 啟用 faac 支持 libfaac(默認(rèn)關(guān)閉) |
| --enable-libgsm | 啟用 GSM 支持 libgsm(默認(rèn)關(guān)閉) |
| --enable-xvid | 啟用 xvid 支持 xvidcore(默認(rèn)關(guān)閉) |
| --enable-x264 | 啟 用 H.264 編 碼 ( 默 認(rèn) 關(guān) 閉 ) |
| --enable-mingw32 | 啟用 MinGW 本地/交叉 win 環(huán)境編譯 |
| --enable-mingwce | 啟用 MinGW 本地/交叉 winCE 環(huán)境編譯 |
| --enable-a52 | 啟用 A52 支持(默認(rèn)關(guān)閉) |
| --enable-a52bin | 啟用運(yùn)行時(shí)打開 liba52.so.0(默認(rèn)關(guān)閉) |
| --enable-dts | 啟用 DTS 支持(默認(rèn)關(guān)閉) |
| --enable-pp | 啟用后加工支持(默認(rèn)關(guān)閉) |
| --enable-static | 構(gòu)建靜態(tài)庫(默認(rèn)啟用) |
| --disable-static | 禁止構(gòu)建靜態(tài)庫(默認(rèn)關(guān)閉) |
| --enable-share | 構(gòu)建共享庫(默認(rèn)關(guān)閉) |
| --disable-shared | 禁止構(gòu)建共享庫(默認(rèn)啟用) |
| --enable-amr_nb | 啟用 amr_nb float 音頻編解碼器 |
| --enable-amr_nb-fixed | 啟用 fixed amr_nb codec |
| --enable-amr_wb | 啟用 amr_wb float 音頻編解碼器 |
| --enable-amr_if2 | 啟用 amr_wb IF2 音頻編解碼器 |
| --enable-sunmlib | 啟用 Sun medialib(默認(rèn)關(guān)閉) |
| --enable-pthreads | 啟用 pthreads(多線程)(默認(rèn)關(guān)閉) |
| --enable-dc1394 | 啟用 libdc1394、libraw1394 抓取 IIDC-1394(默認(rèn)關(guān)閉) |
| --enable-swscaler | 啟用計(jì)數(shù)器支持?(默認(rèn)關(guān)閉) |
| --enable-avisynth | 允許讀取 AVISynth 腳本本件(默認(rèn)關(guān)閉) |
| --enable-gpl | 允許使用 GPL(默認(rèn)關(guān)閉) |
| *************************** | ******************************************* |
| Advanced options (experts only) | 高級選項(xiàng)參數(shù)(供專業(yè)人員使用) |
| --source-path=PATH | 源碼的路徑(當(dāng)前為/root/flv/ffmpeg) |
| --cross-prefix=PREFIX | 為編譯工具指定路徑 |
| --cross-compile | 假定使用了交叉編譯 |
| --cc=CC | 指定使用何種 C 編譯器(默認(rèn) gcc) |
| --make=MAKE | 使用特定的 make |
| --extra-cflags=ECFLAGS | 添加 ECFLAGS 到 CFLAGS |
| --extra-ldflags=ELDFLAGS | 添加 ELDFLAGS 到 LDFLAGS(默認(rèn)-Wl,--as-needed) |
| --extra-libs=ELIBS | 添加 ELIBS |
| --build-suffix=SUFFIX | 為專用程序添加后綴 |
| --arch=ARCH | 選擇機(jī)器架構(gòu)(默認(rèn) x86) |
| --cpu=CPU | 選用最低的 cpu(影響指令的選擇, 可以在老 CPU 上出錯(cuò)) |
| --powerpc-perf-enable | 啟用 PPC 上面的性能報(bào)告(需要啟用 PMC) |
| --disable-mmx | 禁用 MMX |
| --disable-armv5te | 禁用 armv5te |
| --disable-iwmmxt | 禁用 iwmmxt |
| --disable-altivec | 禁用 AltiVec |
| --disable-audio-oss | 禁用 OSS 音頻支持(默認(rèn)啟用) |
| --disable-audio-beos | 禁用 BeOS 音頻支持(默認(rèn)啟用) |
| --disable-v4l | 禁用 video4linux 提?。J(rèn)啟用) |
| --disable-v4l2 | 禁用 video4linux2 提?。J(rèn)啟用) |
| --disable-bktr | 禁 用 bktr 視 頻 提 取 ( 默 認(rèn) 啟 用 ) |
| --disable-dv1394 | 禁用 DV1394 提?。J(rèn)啟用) |
| --disable-network | 禁用網(wǎng)絡(luò)支持(默認(rèn)支持) |
| --disable-ipv6 | 禁用 ipv6 支持(默認(rèn)支持) |
| --disable-zlib | 禁用 zlib(默認(rèn)支持) |
| --disable-simple_idct | 禁用 simple IDCT 例程(默認(rèn)啟用) |
| --disable-vhook | 禁用 video hooking 支持 |
| --enable-gprof | enable profiling with gprof [no] |
| --disable-debug | 禁用調(diào)試符號 |
| --disable-opts | 禁用編譯器最優(yōu)化 |
| --disable-mpegaudio-hp | 啟用更快的解碼 MPEG 音頻(但精確度較低)( 默認(rèn)禁用) |
| --disable-protocols | 禁用 I/O 協(xié)議支持(默認(rèn)啟用) |
| --disable-ffserver | 禁用生成 ffserver |
| --disable-ffplay | 禁用生成 ffplay |
| --enable-small | 啟用優(yōu)化文件尺寸大小(犧牲速度) |
| --enable-memalign-hack | 啟用模擬內(nèi)存排列,由內(nèi)存調(diào)試器干涉? |
| --disable-strip | 禁用剝離可執(zhí)行程序和共享庫 |
| --disable-encoder=NAME | 禁用 XX 編碼器 |
| --enable-encoder=NAME | 啟用 XX 編碼器 |
| --disable-decoder=NAME | 禁用 XX 解碼器 |
| --enable-decoder=NAME | 啟用 XX 解碼器 |
| --disable-encoders | 禁用所有編碼器 |
| --disable-decoders | 禁用所有解碼器 |
| --disable-muxer=NAME | 禁用 XX 混音器 |
| --enable-muxer=NAME | 啟用 XX 混音器 |
| --disable-muxers | 禁用所有混音器 |
| --disable-demuxer=NAME | 禁用 XX 解軌器 |
| --enable-demuxer=NAME | 啟用 XX 解軌器 |
| --disable-demuxers | 禁用所有解軌器 |
| --enable-parser=NAME | 啟用 XX 剖析器 |
| --disable-parser=NAME | 禁用 XX 剖析器 |
| --disable-parsers | 禁用所有剖析器 |
4.1.2 基本選項(xiàng)介紹
以下為配置 ffmpeg 的基本選項(xiàng), 其含義如下:
--cache-file=FILE
configure 會(huì)在你的系統(tǒng)上測試存在的特性(或者 bug!)。 為了加速隨后進(jìn)行的配置, 測試的結(jié)果會(huì)存儲(chǔ)在一個(gè) cache file 里。當(dāng) configure 到每個(gè)子樹里都有 configure 腳本的 復(fù)雜的源碼樹時(shí), 一個(gè)很好的 cache file 的存在會(huì)有很大幫助。
--help
輸出幫助信息。 即使是有經(jīng)驗(yàn)的用戶也偶爾需要使用使用--help 選項(xiàng), 因?yàn)橐粋€(gè)復(fù) 雜的項(xiàng)目會(huì)包含附加的選項(xiàng)。 例如, GCC 包里的 configure 腳本就包含了允許你控制是 否生成和在 GCC 中使用 GNU 匯編器的選項(xiàng)。
--no-create
configure 中的一個(gè)主要函數(shù)會(huì)制作輸出文件。 此選項(xiàng)阻止 configure 生成這個(gè)文件。 你可以認(rèn)為這是一種演習(xí)(dry run), 盡管緩存(cache)仍然被改寫了。
--quiet
--silent
當(dāng) configure 進(jìn)行他的測試時(shí),會(huì)輸出簡要的信息來告訴用戶正在作什么。這樣做是 因?yàn)?configure 可能會(huì)比較慢, 沒有這種輸出的話用戶將會(huì)被扔在一旁疑惑正在發(fā)生什 么。使用這兩個(gè)選項(xiàng)中的任何一個(gè)都會(huì)把你扔到一旁。(譯注:這兩句話比較有意思,原 文是這樣的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!)
--version
打印用來產(chǎn)生'configure'腳本的 Autoconf 的版本號。
--prefix=PEWFIX
--prefix 是最常用的選項(xiàng)。制作出的 Makefile 會(huì)查看隨此選項(xiàng)傳遞的參數(shù),當(dāng)一個(gè)包 在安裝時(shí)可以徹底的重新安置他的結(jié)構(gòu)獨(dú)立部分。 舉一個(gè)例子, 當(dāng)安裝一個(gè)包, 例如說 Emacs, 下面的命令將會(huì)使 Emacs Lisp file 被安裝到" /opt/gnu/share" :
$ ./configure --prefix=/opt/gnu
--exec-prefix=EPREFIX
與--prefix 選項(xiàng)類似,但是他是用來設(shè)置結(jié)構(gòu)倚賴的文件的安裝位置。編譯好的 emacs 二進(jìn)制文件就是這樣一個(gè)問件。 如果沒有設(shè)置這個(gè)選項(xiàng)的話, 默認(rèn)使用的選項(xiàng)值將被設(shè) 為和--prefix 選項(xiàng)值一樣。
--bindir=DIR
指定二進(jìn)制文件的安裝位置。這里的二進(jìn)制文件定義為可以被用戶直接執(zhí)行的程序。
--sbindir=DIR
指定超級二進(jìn)制文件的安裝位置。 這是一些通常只能由超級用戶執(zhí)行的程序。
--libexecdir=DIR
指定可執(zhí)行支持文件的安裝位置。 與二進(jìn)制文件相反, 這些文件從來不直接由用戶執(zhí)行, 但是可以被上面提到的二進(jìn)制文件所執(zhí)行。
--datadir=DIR
指定通用數(shù)據(jù)文件的安裝位置。
--sysconfdir=DIR
指定在單個(gè)機(jī)器上使用的只讀數(shù)據(jù)的安裝位置。
--sharedstatedir=DIR
指定可以在多個(gè)機(jī)器上共享的可寫數(shù)據(jù)的安裝位置。
--localstatedir=DIR
指定只能單機(jī)使用的可寫數(shù)據(jù)的安裝位置。
--libdir=DIR
指定庫文件的安裝位置。
--includedir=DIR
指定 C 頭文件的安裝位置。 其他語言如 C++的頭文件也可以使用此選項(xiàng)。
--oldincludedir=DIR
指定為除 GCC 外編譯器安裝的 C 頭文件的安裝位置。
--infodir=DIR
指定 Info 格式文檔的安裝位置。 Info 是被 GNU 工程所使用的文檔格式。
--mandir=DIR
指定手冊頁的安裝位置。
--srcdir=DIR
這個(gè)選項(xiàng)對安裝沒有作用。他會(huì)告訴 configure 源碼的位置。一般來說不用指定此選 項(xiàng), 因?yàn)?configure 腳本一般和源碼文件在同一個(gè)目錄下。
--program-prefix=PREFIX
指定將被加到所安裝程序的名字上的前綴。例如,使用--program-prefix=g 來 configure 一個(gè)名為 tar 的程序?qū)?huì)使安裝的程序被命名為 gtar。 當(dāng)和其他的安裝選項(xiàng)一起使用時(shí), 這個(gè)選項(xiàng)只有當(dāng)他被 Makefile.in 文件使用時(shí)才會(huì)工作。
--program-suffix=SUFFIX
指定將被加到所安裝程序的名字上的后綴。
--program-transform-name=PROGRAM
這里的 PROGRAM 是一個(gè) sed 腳本。 當(dāng)一個(gè)程序被安裝時(shí), 他的名字將經(jīng)過 sed -e PROGRAM 來產(chǎn)生安裝的名字。
--build=BUILD
指定軟件包安裝的系統(tǒng)平臺。 如果沒有指定, 默認(rèn)值將是--host 選項(xiàng)的值。
--host=HOST
指定軟件運(yùn)行的系統(tǒng)平臺。 如果沒有指定, 將會(huì)運(yùn)行 config.guess 來檢測。
--target=GARGET'
指定軟件面向(target to)的系統(tǒng)平臺。 這主要在程序語言工具如編譯器和匯編器上下 文中起作用。 如果沒有指定, 默認(rèn)將使用--host 選項(xiàng)的值。
--disable-FEATURE
一些軟件包可以選擇這個(gè)選項(xiàng)來提供為大型選項(xiàng)的編譯時(shí)配置, 例如使用 Kerberos認(rèn)證系統(tǒng)或者一個(gè)實(shí)驗(yàn)性的編譯器最優(yōu)配置。 如果默認(rèn)是提供這些特性, 可以使用 --disable-FEATURE 來禁用它, 這里 FEATURE 是特性的名字。 例如:
$ ./configure --disable-gui
-enable-FEATURE[=ARG]
相反的,一些軟件包可能提供了一些默認(rèn)被禁止的特性,可以使用--enable-FEATURE 來起用它。這里 FEATURE 是特性的名字。一個(gè)特性可能會(huì)接受一個(gè)可選的參數(shù)。例如:
$ ./configure --enable-buffers=128
--enable-FEATURE=no 與上面提到的--disable-FEATURE 是同義的。
--with-PACKAGE[=ARG]
在自由軟件社區(qū)里,有使用已有軟件包和庫的優(yōu)秀傳統(tǒng)。當(dāng)用 configure 來配置一個(gè) 源碼樹時(shí), 可以提供其他已經(jīng)安裝的軟件包的信息。 例如, 倚賴于 Tcl 和 Tk 的 BLT 器 件工具包。 要配置 BLT, 可能需要給 configure 提供一些關(guān)于我們把 Tcl 和 Tk 裝的何處 的信息:
$ ./configure --with-tcl=/usr/local --with-tk=/usr/local
--with-PACKAGE=no 與下面將提到的--without-PACKAGE 是同義的。
--without-PACKAGE
有時(shí)候你可能不想讓你的軟件包與系統(tǒng)已有的軟件包交互。 例如, 你可能不想讓你 的新編譯器使用 GNU ld。 通過使用這個(gè)選項(xiàng)可以做到這一點(diǎn):
$ ./configure --without-gnu-ld
--x-includes=DIR
這個(gè)選項(xiàng)是--with-PACKAGE 選項(xiàng)的一個(gè)特例。 在 Autoconf 最初被開發(fā)出來時(shí), 流 行使用 configure 來作為 Imake 的一個(gè)變通方法來制作運(yùn)行于 X 的軟件。 --x-includes 選 項(xiàng)提供了向 configure 腳本指明包含 X11 頭文件的目錄的方法。
--x-libraries=DIR
類似的, --x-libraries 選項(xiàng)提供了向 configure 腳本指明包含 X11 庫的目錄的方法。
4.2 FFmpeg 裁剪優(yōu)化實(shí)例
對 ffmpeg 的裁剪優(yōu)化主要是對 ffplay 的裁剪優(yōu)化,我們制定的需求是能播放測試文 件(視頻為 mpeg4 編碼、音頻為 mp2 編碼, 且為 AVI 復(fù)用), 根據(jù)需求, 找到相應(yīng)的選 項(xiàng), 或禁用或啟用, 最后的命令如下:
./configure --disable-yasm --disable-parsers --disable-decoders --disable-encoders --enable-decoder=mpeg4 --disable-muxers --disable-demuxers --enable-demuxer=avi --enable-decoder=mp2 --disable-protocols --enable-protocol=file --disable-filters --disable-bsfs
其中針對需求, --disable-parsers 為禁用所有解析器, --disable-decoders 為禁用所有解碼 器,--disable-encoders 為禁用所有編碼器,--enable-decoder=mpeg4 為啟用 mpeg4 的編碼 器 , --disable-muxers 為 禁 用 所 有 復(fù) 用 , --disable-demuxers 為 禁 用 所 有 解 復(fù) 用 , --enable-demuxer=avi 為 啟 用 AVI 復(fù) 用 , --enable-decoder=mp2 為 啟 用 mp2 編 碼 , --disable-protocols 為 禁 用 所 有 協(xié) 議 , --enable-protocol=file 為 啟 用 文 件 協(xié) 議 , --disable-filters 為禁用所有過濾器,--disable-bsfs 為禁用所有碼流過濾器。通過以上配置 之后, 編譯, 安裝, 就生成了我們要求的 ffplay, 其大小為 1.8M(1864012 字節(jié))。
此次是在 linux 環(huán)境下進(jìn)行的,在以后的配置中,如果需要其他的什么編碼器或什么 的, 按照選項(xiàng)要求進(jìn)行配置即可。
4.3 裁剪優(yōu)化前后文件比較
前面已經(jīng)提到本次裁剪優(yōu)化的內(nèi)容。 經(jīng)過裁剪優(yōu)化之后, 對其文件夾進(jìn)行比較, 主 要有 3 個(gè)地方不同, 分別是 config.fate、config.h 和 config.mak。 在 config.fate 中, 其記 錄的是配置命令, 由于前后兩次配置命令不同, 故相應(yīng)內(nèi)容也不同, 如圖 4-1 所示。 在 config.h 中, 其主要是根據(jù)配置命令來改變相應(yīng)預(yù)定義的值, 達(dá)到裁剪優(yōu)化之效果如圖 4-2 所示。 在 config.mak 中, 改變的也是配置命令中需要改變的選項(xiàng), 如圖 4-3 所示。



寫在后面
如果對FFmpeg有需要更多了解的請訂閱我的專題:音視頻專輯