FFmpeg<第一篇>:環(huán)境配置

1唤殴、官網(wǎng)地址

http://ffmpeg.org/download.html

2潦蝇、linux下載ffmpeg

下載:
wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2

解壓:
tar xvf ffmpeg-snapshot.tar.bz2

3癣疟、FFmpeg ./configure編譯參數(shù)匯總

解壓 ffmpeg-snapshot.tar.bz2 之后摸袁,在根目錄下有配置文件:configure悼潭,執(zhí)行該文件可以生成Makefile庇忌,configure文件中記錄了configure的編譯參數(shù)。

【1】Help options 幫助選項

--help  打印顯示幫助信息
--quiet 禁止顯示信息輸出
--list-decoders 顯示所有可用的解碼器
--list-encoders 顯示所有可用的編碼器
--list-hwaccels 顯示所有可用的硬件加速器
--list-demuxers 顯示所有可用的解復(fù)用器
--list-muxers   顯示所有可用的復(fù)用器
--list-parsers  顯示所有可用的解析器
--list-protocols    顯示所有可用的協(xié)議
--list-bsfs 顯示所有可用的比特流過濾器
--list-indevs   顯示所有可用的輸入設(shè)備
--list-outdevs  顯示所有可用的輸出設(shè)備
--list-filters  顯示所有可用的過濾器

【2】 Standard options 標(biāo)準(zhǔn)選項

--logfile=FILE  記錄測試并輸出到 指定文件FILE 舰褪,默認(rèn)為ffbuild/config.log
--disable-logging   不記錄配置調(diào)試信息
--fatal-warnings    如果生成任何配置警告皆疹,則失敗
--prefix=PREFIX 安裝在指定路徑PREFIX,默認(rèn)為/usr/local
--bindir=DIR    在指定路徑DIR 中安裝二進(jìn)制文件抵知,默認(rèn)為PREFIX/bin
--datadir=DIR   在指定路徑DIR中安裝數(shù)據(jù)文件墙基,默認(rèn)為PREFIX/share/ffmpeg
--docdir=DIR    在指定路徑DIR中安裝文檔,默認(rèn)為PREFIX/share/doc/ffmpeg
--libdir=DIR    在指定路徑安裝庫刷喜,默認(rèn)為PREFIX/lib
--shlibdir=DIR  在指定路徑安裝共享庫残制,默認(rèn)為LIBDIR,即PREFIX/lib
--incdir=DIR    在指定路徑安裝包含文件掖疮,默認(rèn)為PREFIX/include
--mandir=DIR    在指定路徑安裝手冊頁初茶,默認(rèn)為PREFIX/share/man
--pkgconfigdir=DIR  在指定路徑安裝pkg-config 文件,默認(rèn)為LIBDIR/pkgconfig
--enable-rpath  使用rpath允許在不屬于動態(tài)鏈接器搜索路徑的路徑中安裝庫鏈接程序時使用rpath(小心使用)
--install-name-dir=DIR  Darwin 已安裝目標(biāo)的目錄名稱

【3】Licensing options 證書選項

--enable-gpl    允許使用GPL代碼浊闪,編譯的庫和二進(jìn)制文件處于GPL許可下恼布,默認(rèn)為否
--enable-version3   升級(L)GPL到版本3,默認(rèn)為否
--enable-nonfree    允許使用非自由代碼搁宾,并且二進(jìn)制文件將不可再分發(fā)折汞,默認(rèn)為否

【4】Configuration options 配置選項

--disable-static    不構(gòu)建靜態(tài)庫,默認(rèn)為否
--enable-shared 構(gòu)建共享動態(tài)庫盖腿,默認(rèn)為否
--enable-small  優(yōu)化大小而不是速度
--disable-runtime-cpudetect 禁用在運(yùn)行時檢測 CPU 功能(較小的二進(jìn)制文件)
--enable-gray   啟用全灰度支持(較慢的顏色)
--disable-swscale-alpha 在 swscale 中禁用 alpha 通道支持
--disable-all   禁用構(gòu)建組件爽待、庫和程序
--disable-autodetect    禁用自動檢測到的外部庫,默認(rèn)為否

【5】Program options 程序選項

--disable-programs  不構(gòu)建命令行程序
--disable-ffmpeg    禁用 ffmpeg 構(gòu)建
--disable-ffplay    禁用 ffplay 構(gòu)建
--disable-ffprobe   禁用 ffprobe 構(gòu)建

【6】Documentation options 文檔選項

--disable-doc   不構(gòu)建文檔
--disable-htmlpages 不構(gòu)建 HTML 文檔頁面
--disable-manpages  不構(gòu)建手冊文檔頁面
--disable-podpages  不構(gòu)建 POD 文檔頁面
--disable-txtpages  不構(gòu)建文本文檔頁面

【7】Component options 組件選項

--disable-avdevice  禁用 libavdevice 構(gòu)建
--disable-avcodec   禁用 libavcodec 構(gòu)建
--disable-avformat  禁用 libavformat 構(gòu)建
--disable-swresample    禁用 libswresample 構(gòu)建
--disable-swscale   禁用 libswscale 構(gòu)建
--disable-postproc  禁用 libpostproc 構(gòu)建
--disable-avfilter  禁用 libavfilter 構(gòu)建
--enable-avresample 啟用 libavresample 構(gòu)建(已棄用)翩腐,默認(rèn)為否
--disable-pthreads  禁用 pthreads [自動檢測]
--disable-w32threads    禁用 Win32 線程 [自動檢測]
--disable-os2threads    禁用 OS/2 線程 [自動檢測]
--disable-network   禁用網(wǎng)絡(luò)支持 鸟款,默認(rèn)為否
--disable-dct   禁用 DCT 代碼
--disable-dwt   禁用 DWT 代碼
--disable-error-resilience  禁用錯誤恢復(fù)代碼
--disable-lsp   禁用 LSP 代碼
--disable-lzo   禁用 LZO 解碼器代碼
--disable-mdct  禁用 MDCT 代碼
--disable-rdft  禁用 RDFT 代碼
--disable-fft   禁用 FFT 代碼
--disable-faan  禁用浮點 AAN (I)DCT 代碼
--disable-pixelutils    在 libavutil 中禁用像素工具

【8】Individual component options 獨(dú)立組件選項

--disable-everything    禁用下面列出的所有組件
--disable-encoder=NAME  禁用指定NAME的編碼器
--enable-encoder=NAME   啟用指定NAME的編碼器
--disable-encoders  禁用所有編碼器
--disable-decoder=NAME  禁用指定NAME的解碼器
--enable-decoder=NAME   啟用指定NAME的解碼器
--disable-decoders  禁用所有解碼器
--disable-hwaccel=NAME  禁用指定NAME的硬件
--enable-hwaccel=NAME   啟用指定NAME的硬件
--disable-hwaccels  禁用所有 hwaccels
--disable-muxer=NAME    禁用指定NAME的復(fù)用器
--enable-muxer=NAME 啟用指定NAME的復(fù)用器
--disable-muxers    禁用所有復(fù)用器
--disable-demuxer=NAME  禁用指定NAME的解復(fù)用器
--enable-demuxer=NAME   啟用指定NAME的解復(fù)用器
--disable-demuxers  禁用所有解復(fù)用器
--enable-parser=NAME    啟用指定NAME的解析器
--disable-parser=NAME   禁用指定NAME的解析器
--disable-parsers   禁用所有解析器
--enable-bsf=NAME   啟用指定NAME的比特流過濾器
--disable-bsf=NAME  禁用指定NAME的比特流過濾器
--disable-bsfs  禁用所有比特流過濾器
--enable-protocol=NAME  啟用指定NAME協(xié)議
--disable-protocol=NAME 禁用指定NAME協(xié)議
--disable-protocols 禁用所有協(xié)議
--enable-indev=NAME 啟用指定NAME的輸入設(shè)備
--disable-indev=NAME    禁用指定NAME的輸入設(shè)備
--disable-indevs    禁用輸入設(shè)備
--enable-outdev=NAME    啟用指定NAME的輸出設(shè)備
--disable-outdev=NAME   禁用指定NAME的輸出設(shè)備
--disable-outdevs   禁用輸出設(shè)備
--disable-devices   禁用所有設(shè)備
--enable-filter=NAME    啟用指定NAME的過濾器名稱
--disable-filter=NAME   禁用指定NAME的過濾器名稱
--disable-filters   禁用所有過濾器

【9】External library support 擴(kuò)展庫支持

使用以下任何選項將允許 FFmpeg 鏈接到相應(yīng)的外部庫。
如果滿足所有其他依賴項并且未明確禁用它們茂卦,則依賴于該庫的所有組件都將啟用何什。
例如,--enable-libopus 將啟用與 libopus 的鏈接并允許構(gòu)建 libopus 編碼器等龙,
除非使用 --disable-encoder=libopus 明確禁用它处渣。

--disable-alsa  禁用 ALSA 支持 [自動檢測]
--disable-appkit    禁用 Apple AppKit 框架 [自動檢測]
--disable-avfoundation  禁用 Apple AVFoundation 框架 [自動檢測]
--enable-avisynth   啟用讀取 AviSynth 腳本文件 [否]
--disable-bzlib 禁用 bzlib [自動檢測]
--disable-coreimage 禁用 Apple CoreImage 框架 [自動檢測]
--enable-chromaprint    使用 chromaprint 啟用音頻指紋識別伶贰,默認(rèn)為否
--enable-frei0r 啟用 frei0r 視頻過濾 ,默認(rèn)為否
--enable-gcrypt 啟用 gcrypt霍比,需要 rtmp(t)e 支持幕袱,如果未使用 openssl、librtmp 或 gmp則默認(rèn)為否
--enable-gmp    啟用 gmp悠瞬,需要 rtmp(t)e 支持们豌,如果未使用 openssl 或 librtmp則默認(rèn)為否
--enable-gnutls 啟用 gnutls,需要 https 支持浅妆,如果未使用 openssl望迎、libtls 或 mbedtls則默認(rèn)為否
--disable-iconv 禁用 iconv [自動檢測]
--enable-jni    啟用 JNI 支持,默認(rèn)為否
--enable-ladspa 啟用 LADSPA 音頻過濾凌外,默認(rèn)為否
--enable-libaom 通過 libaom 啟用 AV1 視頻編碼/解碼辩尊,默認(rèn)為否
--enable-libaribb24 通過 libaribb24 啟用 ARIB 文本和字幕解碼,默認(rèn)為否
--enable-libass 啟用 libass 字幕渲染康辑,需要字幕摄欲,默認(rèn)為否
--enable-libbluray  使用 libbluray 啟用藍(lán)光閱讀,默認(rèn)為否
--enable-libbs2b    啟用 bs2b DSP 庫疮薇,默認(rèn)為否
--enable-libcaca    使用 libcaca 啟用文本顯示胸墙,默認(rèn)為否
--enable-libcelt    通過 libcelt 啟用 CELT 解碼,默認(rèn)為否
--enable-libcdio    啟用使用 libcdio 抓取音頻 CD按咒,默認(rèn)為否
--enable-libcodec2  使用 libcodec2 啟用 codec2 編碼/解碼迟隅,默認(rèn)為否
--enable-libdav1d   通過 libdav1d 啟用 AV1 解碼,默認(rèn)為否
--enable-libdavs2   通過 libdavs2 啟用 AVS2 解碼励七,默認(rèn)為否
--enable-libdc1394  使用 libdc1394和libraw1394啟用IIDC-1394 抓取
--enable-libfdk-aac 通過 libfdk-aac 啟用 AAC 解碼/編碼智袭,默認(rèn)為否
--enable-libflite   通過 libflite 啟用 flite(語音合成)支持,默認(rèn)為否
--enable-libfontconfig  啟用 libfontconfig掠抬,對 drawtext 過濾器有用吼野,默認(rèn)為否
--enable-libfreetype    啟用 libfreetype,drawtext 過濾器需要两波,默認(rèn)為否
--enable-libfribidi 啟用 libfribidi箫锤,改進(jìn) drawtext 過濾器,默認(rèn)為否
--enable-libglslang 啟用 GLSL->SPIRV 編譯通過 libglslang雨女,默認(rèn)為否
--enable-libgme 通過 libgme 啟用游戲音樂 Emu,默認(rèn)為否
--enable-libgsm 通過 libgsm 啟用 GSM 解碼/編碼阳准,默認(rèn)為否
--enable-libiec61883    通過 libiec61883 啟用 iec61883氛堕,默認(rèn)為否
--enable-libilbc    通過 libilbc 啟用 iLBC 解碼/編碼,默認(rèn)為否
--enable-libjack    啟用 JACK 音頻聲音服務(wù)器野蝇,默認(rèn)為否
--enable-libklvanc  啟用內(nèi)核實驗室 VANC 處理讼稚,默認(rèn)為否
--enable-libkvazaar 通過 libkvazaar 啟用 HEVC 編碼括儒,默認(rèn)為否
--enable-liblensfun 啟用 lensfun 鏡頭校正,默認(rèn)為否
--enable-libmodplug 通過 libmodplug 啟用 ModPlug锐想,默認(rèn)為否
--enable-libmp3lame 通過 libmp3lame 啟用 MP3 編碼帮寻,默認(rèn)為否
--enable-libopencore-amrnb  通過 libopencore-amrnb 啟用 AMR-NB 解碼/編碼,默認(rèn)為否
--enable-libopencore-amrwb  通過 libopencore-amrwb 啟用 AMR-WB 解碼赠摇,默認(rèn)為否
--enable-libopencv  通過 libopencv 啟用視頻過濾固逗,默認(rèn)為否
--enable-libopenh264    通過 OpenH264 啟用 H.264 編碼,默認(rèn)為否
--enable-libopenjpeg    通過 OpenJPEG 啟用 JPEG 2000 解碼/編碼藕帜,默認(rèn)為否
--enable-libopenmpt 啟用通過 libopenmpt 解碼跟蹤的文件烫罩,默認(rèn)為否
--enable-libopenvino    啟用 OpenVINO 作為 DNN 模塊后端,默認(rèn)為否
--enable-libopus    通過 libopus 啟用 Opus 解碼/編碼洽故,默認(rèn)為否
--enable-libpulse   通過 libpulse 啟用 Pulseaudio 輸入贝攒,默認(rèn)為否
--enable-librabbitmq    啟用 RabbitMQ 庫,默認(rèn)為否
--enable-librav1e   通過 rav1e 啟用 AV1 編碼时甚,默認(rèn)為否
--enable-librist    通過 librist 啟用 RIST隘弊,默認(rèn)為否
--enable-librsvg    通過 librsvg 啟用 SVG 光柵化,默認(rèn)為否
--enable-librubberband  啟用橡皮筋過濾器所需的橡皮筋荒适,默認(rèn)為否
--enable-librtmp    通過 librtmp 啟用 RTMP[E] 支持梨熙,默認(rèn)為否
--enable-libshine   通過 libshine 啟用定點 MP3 編碼,默認(rèn)為否
--enable-libsmbclient   通過 libsmbclient 啟用 Samba 協(xié)議吻贿,默認(rèn)為否
--enable-libsnappy  啟用 Snappy 壓縮串结,需要 hap 編碼,默認(rèn)為否
--enable-libsoxr    啟用libsoxr 重采樣舅列,默認(rèn)為否
--enable-libspeex   通過 libspeex 啟用 Speex 解碼/編碼肌割,默認(rèn)為否
--enable-libsrt 通過 libsrt 啟用 Haivision SRT 協(xié)議,默認(rèn)為否
--enable-libssh 通過 libssh 啟用 SFTP 協(xié)議帐要,默認(rèn)為否
--enable-libsvtav1  通過 SVT 啟用 AV1 編碼把敞,默認(rèn)為否
--enable-libtensorflow  啟用TensorFlow作為基于DNN的過濾器的DNN模塊后端,默認(rèn)為否
--enable-libtesseract   啟用 Tesseract榨惠,ocr 過濾器需要奋早,默認(rèn)為否
--enable-libtheora  通過 libtheora 啟用 Theora 編碼,默認(rèn)為否
--enable-libtls 如果未使用openssl赠橙、gnutls或mbedtls耽装,則啟用https支持所需的LibreSSL,默認(rèn)為否
--enable-libtwolame 通過 libttwolame 啟用 MP2 編碼期揪,默認(rèn)為否
--enable-libuavs3d  通過 libuavs3d 啟用 AVS3 解碼掉奄,默認(rèn)為否
--enable-libv4l2    啟用 libv4l2/v4l-utils,默認(rèn)為否
--enable-libvidstab 使用 vid.stab 啟用視頻穩(wěn)定凤薛,默認(rèn)為否
--enable-libvmaf    通過 libvmaf 啟用 vmaf 過濾器姓建,默認(rèn)為否
--enable-libvo-amrwbenc 通過 libvo-amrwbenc 啟用 AMR-WB 編碼诞仓,默認(rèn)為否
--enable-libvorbis  通過 libvorbis 啟用 Vorbis 編碼/解碼,默認(rèn)為否
--enable-libvpx 通過 libvpx 啟用 VP8 和 VP9 解碼/編碼速兔,默認(rèn)為否
--enable-libwebp    通過 libwebp 啟用 WebP 編碼墅拭,默認(rèn)為否
--enable-libx264    通過 x264 啟用 H.264 編碼,默認(rèn)為否
--enable-libx265    通過 x265 啟用 HEVC 編碼涣狗,默認(rèn)為否
--enable-libxavs    通過 xavs 啟用 AVS 編碼谍婉,默認(rèn)為否
--enable-libxavs2   通過 xavs2 啟用 AVS2 編碼,默認(rèn)為否
--enable-libxcb 使用 XCB 啟用 X11 抓取 [自動檢測]
--enable-libxcb-shm 啟用 X11 抓取 shm 通信 [自動檢測]
--enable-libxcb-xfixes  啟用 X11 抓取鼠標(biāo)渲染 [自動檢測]
--enable-libxcb-shape   啟用 X11 抓取形狀渲染 [自動檢測]
--enable-libxvid    通過 xvidcore 啟用 Xvid 編碼屑柔,存在原生 MPEG-4/Xvid 編碼器屡萤,默認(rèn)為否
--enable-libxml2    使用 C 庫 libxml2 啟用 XML 解析,默認(rèn)為否
--enable-libzimg    啟用 z.lib掸宛,zscale 過濾器需要死陆,默認(rèn)為否
--enable-libzmq 啟用通過 libzmq 傳遞消息,默認(rèn)為否
--enable-libzvbi    通過 libzvbi 啟用圖文電視支持唧瘾,默認(rèn)為否
--enable-lv2    啟用 LV2 音頻過濾措译,默認(rèn)為否
--disable-lzma  禁用 lzma [自動檢測]
--enable-decklink   啟用 Blackmagic DeckLink I/O 支持,默認(rèn)為否
--enable-mbedtls    如果未使用openssl饰序、gnutls或libtls领虹,則啟用https支持所需的mbedTLS,默認(rèn)為否
--enable-mediacodec 啟用 Android MediaCodec 支持求豫,默認(rèn)為否
--enable-mediafoundation    通過 MediaFoundation 啟用編碼
--enable-libmysofa  啟用 libmysofa塌衰,需要 soflizer 過濾器,默認(rèn)為否
--enable-openal 啟用 OpenAL 1.1 捕獲支持蝠嘉,默認(rèn)為否
--enable-opencl 啟用 OpenCL 處理最疆,默認(rèn)為否
--enable-opengl 啟用 OpenGL 渲染,默認(rèn)為否
--enable-openssl    如果未使用gnutls蚤告、libtls 或 mbedtls努酸,則啟用https支持所需的openssl,默認(rèn)為否
--enable-pocketsphinx   啟用 PocketSphinx杜恰,asr 過濾器需要获诈,默認(rèn)為否
--disable-sndio 禁用 sndio 支持 [自動檢測]
--disable-schannel  禁用 SChannel SSP,需要 TLS 支持[自動檢測]
--disable-sdl2  禁用 sdl2 [自動檢測]
--disable-securetransport   禁用安全傳輸心褐,需要 TLS 支持
--enable-vapoursynth    啟用 VapourSynth 解復(fù)用器舔涎,默認(rèn)為否
--enable-vulkan 啟用 Vulkan 代碼,默認(rèn)為否
--disable-xlib  禁用 xlib [自動檢測]
--disable-zlib  禁用 zlib [自動檢測]

以下庫提供各種硬件加速功能:

--disable-amf   禁用 AMF 視頻編碼代碼 [自動檢測]
--disable-audiotoolbox  禁用 Apple AudioToolbox 代碼 [自動檢測]
--enable-cuda-nvcc  啟用 Nvidia CUDA 編譯器逗爹,默認(rèn)為否
--disable-cuda-llvm 使用 clang亡嫌, 禁用 CUDA 編譯[自動檢測]
--disable-cuvid 禁用 Nvidia CUVID 支持 [自動檢測]
--disable-d3d11va   禁用 Microsoft Direct3D 11 視頻加速代碼 [自動檢測]
--disable-dxva2 禁用 Microsoft DirectX 9 視頻加速代碼 [自動檢測]
--disable-ffnvcodec 禁用動態(tài)鏈接的 Nvidia 代碼 [自動檢測]
--enable-libdrm 啟用 DRM 代碼 (Linux),默認(rèn)為否
--enable-libmfx 通過 libmfx 啟用英特爾 MediaSDK(AKA 快速同步視頻)代碼,默認(rèn)為否
--enable-libnpp 啟用基于 Nvidia Performance Primitives 的代碼昼伴,默認(rèn)為否
--enable-mmal   通過 MMAL 啟用 Broadcom 多媒體抽象層 (Raspberry Pi) ,默認(rèn)為否
--disable-nvdec 禁用 Nvidia 視頻解碼加速(通過 hwaccel)[自動檢測]
--disable-nvenc 禁用 Nvidia 視頻編碼代碼 [自動檢測]
--enable-omx    啟用 OpenMAX IL 代碼镣屹,默認(rèn)為否
--enable-omx-rpi    為 Raspberry Pi 啟用 OpenMAX IL 代碼 圃郊,默認(rèn)為否
--enable-rkmpp  啟用瑞芯微媒體處理平臺代碼 ,默認(rèn)為否
--disable-v4l2-m2m  禁用 V4L2 mem2mem 代碼 [自動檢測]
--disable-vaapi 禁用視頻加速 API(主要是 Unix/Intel)代碼 [自動檢測]
--disable-vdpau 禁用適用于 Unix 代碼的 Nvidia Video Decode 和 Presentation API [自動檢測]
--disable-videotoolbox  禁用 VideoToolbox 代碼 [自動檢測]

【10】Toolchain options 工具鏈選項

--arch=ARCH 選擇架構(gòu)
--cpu=CPU   選擇所需的最小CPU(影響指令選擇女蜈,可能會在較舊的 CPU 上崩潰)
--cross-prefix=PREFIX   編譯工具使用 PREFIX
--progs-suffix=SUFFIX   程序名后綴
--enable-cross-compile  使能交叉編譯器
--sysroot=PATH  交叉構(gòu)建樹的根
--sysinclude=PATH   交叉構(gòu)建系統(tǒng)頭文件的位置
--target-os=OS  編譯器目標(biāo) OS
--target-exec=CMD   目標(biāo)上運(yùn)行可執(zhí)行文件的命令
--target-path=DIR   在目標(biāo)上查看構(gòu)建目錄的路徑
--target-samples=DIR    目標(biāo)樣本目錄的路徑
--tempprefix=PATH   強(qiáng)制固定目錄/前綴而不是 mktemp 進(jìn)行檢查
--toolchain=NAME    根據(jù) NAME 設(shè)置工具默認(rèn)值
--nm=NM 使用 nm 工具 NM [nm -g]
--ar=AR 使用存檔工具 AR [ar]
--as=AS 使用匯編器 AS
--ln_s=LN_S 使用符號鏈接工具 LN_S [ln -s -f]
--strip=STRIP   使用剝離工具STRIP [strip]
--windres=WINDRES   使用windows資源編譯器WINDRES [windres]
--x86asmexe=EXE 使用 nasm 兼容的匯編程序 EXE [nasm]
--cc=CC 使用 C 編譯器 CC [gcc]
--cxx=CXX   使用 C 編譯器 CXX [g++]
--objcc=OCC 使用 ObjC 編譯器 OCC [gcc]
--dep-cc=DEPCC  使用依賴生成器 DEPCC [gcc]
--nvcc=NVCC 使用 Nvidia CUDA 編譯器 NVCC 或 clang
--ld=LD 使用鏈接器 LD
--pkg-config=PKGCONFIG  使用 pkg-config 工具 PKGCONFIG [pkg-config]
--pkg-config-flags=FLAGS    將附加標(biāo)志傳遞給 pkgconf
--ranlib=RANLIB 使用ranlib RANLIB
--doxygen=DOXYGEN   使用 DOXYGEN 生成 API doc [doxygen]
--host-cc=HOSTCC    使用主機(jī) C 編譯器 HOSTCC
--host-cflags=HCFLAGS   在為主機(jī)編譯時使用 HCFLAGS
--host-cppflags=HCPPFLAGS   在為主機(jī)編譯時使用 HCPPFLAGS
--host-ld=HOSTLD    使用主機(jī)鏈接器 HOSTLD
--host-ldflags=HLDFLAGS 鏈接主機(jī)時使用 HLDFLAGS
--host-extralibs=HLIBS  鏈接主機(jī)時使用庫 HLIBS
--host-os=OS    編譯器主機(jī)操作系統(tǒng)
--extra-cflags=ECFLAGS  將 ECFLAGS 添加到 CFLAGS
--extra-cxxflags=ECFLAGS    將 ECFLAGS 添加到 CXXFLAGS
--extra-objcflags=FLAGS 將 FLAGS 添加到 OBJCFLAGS
--extra-ldflags=ELDFLAGS    將 ELDFLAGS 添加到 LDFLAGS
--extra-ldexeflags=ELDFLAGS 將 ELDFLAGS 添加到 LDEXEFLAGS
--extra-ldsoflags=ELDFLAGS  將 ELDFLAGS 添加到 LDSOFLAGS
--extra-libs=ELIBS  添加 ELIBS
--extra-version=STRING  版本字符串后綴
--optflags=OPTFLAGS 覆蓋優(yōu)化相關(guān)的編譯器標(biāo)志
--nvccflags=NVCCFLAGS   覆蓋 nvcc 標(biāo)志
--build-suffix=SUFFIX   庫名后綴
--enable-pic    構(gòu)建與位置無關(guān)的代碼
--enable-thumb  編譯 Thumb 指令集
--enable-l  使用鏈接時優(yōu)化
--env=“ENV=override”    覆蓋環(huán)境變量

【11】Advanced options 高級選項

--malloc-prefix=PREFIX  前綴 malloc 和帶有 PREFIX 的相關(guān)名稱
--custom-allocator=NAME 使用支持的自定義分配器
--disable-symver    禁用符號版本控制
--enable-hardcoded-tables   使用硬編碼表而不是運(yùn)行時生成
--disable-safe-bitstream-reader 在位讀取器中禁用緩沖區(qū)邊界檢查(更快持舆,但可能會崩潰)
--sws-max-filter-size=N swscale 使用的最大過濾器大小 ,默認(rèn)為256

【12】Optimization options 優(yōu)化選項

--disable-asm   禁用所有程序集優(yōu)化
--disable-altivec   禁用 AltiVec 優(yōu)化
--disable-vsx   禁用 VSX 優(yōu)化
--disable-power8    禁用 POWER8 優(yōu)化
--disable-amd3dnow  禁用 3DNow伪窖!優(yōu)化
--disable-amd3dnowext   禁用 3DNow逸寓!擴(kuò)展優(yōu)化
--disable-mmx   禁用 MMX 優(yōu)化
--disable-mmxext    禁用 MMXEXT 優(yōu)化
--disable-sse   禁用 SSE 優(yōu)化
--disable-sse2  禁用 SSE2 優(yōu)化
--disable-sse3  禁用 SSE3 優(yōu)化
--disable-ssse3 禁用 SSSE3 優(yōu)化
--disable-sse4  禁用 SSE4 優(yōu)化
--disable-sse42 禁用 SSE4.2 優(yōu)化
--disable-avx   禁用 AVX 優(yōu)化
--disable-xop   禁用 XOP 優(yōu)化
--disable-fma3  禁用 FMA3 優(yōu)化
--disable-fma4  禁用 FMA4 優(yōu)化
--disable-avx2  禁用 AVX2 優(yōu)化
--disable-avx512    禁用 AVX-512 優(yōu)化
--disable-aesni 禁用 AESNI 優(yōu)化
--disable-armv5te   禁用 armv5te 優(yōu)化
--disable-armv6 禁用 armv6 優(yōu)化
--disable-armv6t2   禁用 armv6t2 優(yōu)化
--disable-vfp   禁用 VFP 優(yōu)化
--disable-neon  禁用 NEON 優(yōu)化
--disable-inline-asm    禁用內(nèi)聯(lián)匯編
--disable-x86asm    禁用獨(dú)立 x86 程序集
--disable-mipsdsp   禁用 MIPS DSP ASE R1 優(yōu)化
--disable-mipsdspr2 禁用 MIPS DSP ASE R2 優(yōu)化
--disable-msa   禁用 MSA 優(yōu)化
--disable-msa2  禁用 MSA2 優(yōu)化
--disable-mipsfpu   禁用浮點 MIPS 優(yōu)化
--disable-mmi   禁用龍芯 SIMD 優(yōu)化
--disable-fast-unaligned    考慮未對齊訪問緩慢

【13】開發(fā)人員選項

--disable-debug 禁用調(diào)試符號
--enable-debug=LEVEL    設(shè)置調(diào)試級別
--disable-optimizations 禁用編譯器優(yōu)化
--enable-extra-warnings 啟用更多編譯器警告
--disable-stripping 禁用剝離可執(zhí)行文件和共享庫
--assert-level=level    0(默認(rèn)),1或2覆山,斷言測試的數(shù)量竹伸,2 會導(dǎo)致運(yùn)行時變慢
--enable-memory-poisoning   用任意數(shù)據(jù)填充堆未初始化的分配空間
--valgrind=VALGRIND 通過 valgrind 運(yùn)行“make fate”測試以檢測內(nèi)存泄漏和錯誤,使用指定的 valgrind 二進(jìn)制文件簇宽。不能與 --target-exec 結(jié)合使用
--enable-ftrapv 陷阱算術(shù)溢出
--samples=FATE  測試樣本的路徑位置
--enable-neon-clobber-test  檢查 NEON 寄存器的破壞(應(yīng)該是僅用于調(diào)試目的)
--enable-xmm-clobber-test   檢查 XMM 寄存器的破壞(僅限 Win64勋篓;應(yīng)僅用于調(diào)試目的)
--enable-random 隨機(jī)啟用/禁用組件
--enable-random=LIST    隨機(jī)啟用/禁用特定組件,LIST 是一個逗號分隔的列表 NAME[:PROB] 條目魏割,其中 NAME 是一個組件(group) 和 PROB 相關(guān)的概率 名稱(默認(rèn) 0.5)譬嚣。
--random-seed=VALUE --enable/disable-random 的種子值
--disable-valgrind-backtrace    在 Valgrind 下不打印回溯(僅適用于 --disable-optimizations 構(gòu)建)
--enable-ossfuzz    啟用構(gòu)建模糊器工具
--libfuzzer=PATH    libfuzzer 的路徑
--ignore-tests=TESTS    被忽略的測試
--enable-linux-perf 啟用 Linux 性能監(jiān)視器 API
--disable-large-tests   禁用使用大量內(nèi)存的測試

4、ffmpeg shell腳本

#!/bin/bash

NDK_ROOT=/home/zhouyunchong/Android/Sdk/ndk/17.2.4988734
CPU=arm-linux-androideabi
TOOLCHAIN=$NDK_ROOT/toolchains/$CPU-4.9/prebuilt/linux-x86_64
# 打開一個NDK項目钞它,找到build.ninja文件拜银,可以找到FLAGS
# FLAGS="-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security  -std=c++11 -fno-limit-debug-info  -fPIC"
FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fPIC"
INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include"
PREFIX=./android/armeabi-v7a

# 執(zhí)行 configure 生成Makefile
# prefix             安裝路徑默認(rèn)為/usr/local
# --enable-small      優(yōu)化大小
# --disable-programs  不構(gòu)建可執(zhí)行文件
# --disable-avdevice  禁用 libavdevice 構(gòu)建
# --disable-encoders  禁用所有編碼器
# --disable-muxers    禁用所有混合器
# --disable-filters    禁用所有過濾器
# --enable-cross-compile  開啟交叉編譯器
# --cross-prefix  指定交叉編譯的編譯鏈
# --disable-shared 關(guān)閉動態(tài)庫
# --enable-static  開啟靜態(tài)庫
# -isystem         編譯時查找頭文件的路徑 
# --sysroot        指定頭文件和庫文件目錄
# --extra-cflags   將 ECFLAGS 添加到 CFLAGS(傳給gcc編譯器的參數(shù))
# --arch          選擇架構(gòu)
# --target-os        編譯器目標(biāo) OS android、linux
# --disable-x86asm 生成編譯相關(guān)的配置
./configure --disable-x86asm
./configure \
prefix=$PREFIX \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/$CPU- \
--disable-shared \
--enable-static \
--sysroot=$NDK_ROOT/platforms/android-21/arch-arm \
--extra-cflags="$FLAGS $INCLUDES" \
--extra-cflags="-isysroot $NDK_ROOT/sysroot/" \
--arch=arm \
--target-os=android \

make clean

make install

以上腳本只能生成在Android端使用的靜態(tài)庫遭垛。

當(dāng)然尼桶,修改下指定參數(shù)可以生成動態(tài)庫或者可執(zhí)行文件。

以上腳本的環(huán)境和條件:
【1】linux(ubuntu)系統(tǒng)
【2】ffmpeg版本:最新的release版本即可(當(dāng)前最高版本是FFmpeg 5.1.2 "Riemann")耻卡,官網(wǎng):http://ffmpeg.org/
【3】NDK版本疯汁,需要 < 19,19及19以上的版本已經(jīng)去除了gcc和g++卵酪,所以不適用以上腳本
【4】腳本需要額外添加 ./configure --disable-x86asm
【5】prefix 前面不能添加 --
【6】當(dāng)前ffmpeg支持clang編譯幌蚊,需要在configure中將cc_default="clang"改成cc_default="gcc"

5、將編譯出來的靜態(tài)庫在cmake項目中使用

新建一個cmake項目

MainActivity.java

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Example of a call to a native method
        binding.sampleText.text = stringFromJNI()
    }

    /**
     * A native method that is implemented by the 'myplayer' native library,
     * which is packaged with this application.
     */
    private external fun stringFromJNI(): String

    companion object {
        // Used to load the 'myplayer' library on application startup.
        init {
            System.loadLibrary("myplayer")
        }
    }
}

native-lib.cpp

#include <jni.h>
#include <string>

extern "C"{
#include <libavcodec/avcodec.h>
}

extern "C" JNIEXPORT jstring JNICALL
Java_com_android_myplayer_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(av_version_info());
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.18.1)

add_library(
        myplayer
        SHARED
        native-lib.cpp)

include_directories("ffmpeg-include")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")
message("${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")

target_link_libraries(
        myplayer
        avcodec
        avfilter
        avformat
        avutil
        swresample
        swscale
        log)

build.gradle部分配置:

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.android.xxxx"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a'
            }
        }
        ndk { // "armeabi-v7a", "arm64-v8a"
            abiFilters 'armeabi-v7a'
        }
    }

    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.18.1'
        }
    }

}

將ffmpeg交叉編譯出來的頭文件和靜態(tài)庫放入項目中:

image.png

[本章完...]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溃卡,一起剝皮案震驚了整個濱河市溢豆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘸羡,老刑警劉巖漩仙,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡队他,警方通過查閱死者的電腦和手機(jī)卷仑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麸折,“玉大人锡凝,你說我怎么就攤上這事」柑洌” “怎么了窜锯?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芭析。 經(jīng)常有香客問我锚扎,道長,這世上最難降的妖魔是什么馁启? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任驾孔,我火速辦了婚禮,結(jié)果婚禮上进统,老公的妹妹穿的比我還像新娘助币。我一直安慰自己,他們只是感情好螟碎,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布眉菱。 她就那樣靜靜地躺著,像睡著了一般掉分。 火紅的嫁衣襯著肌膚如雪俭缓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天酥郭,我揣著相機(jī)與錄音华坦,去河邊找鬼。 笑死不从,一個胖子當(dāng)著我的面吹牛惜姐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椿息,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歹袁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寝优?” 一聲冷哼從身側(cè)響起条舔,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乏矾,沒想到半個月后孟抗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迁杨,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年凄硼,在試婚紗的時候發(fā)現(xiàn)自己被綠了铅协。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摊沉,死狀恐怖警医,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坯钦,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布侈玄,位于F島的核電站婉刀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏序仙。R本人自食惡果不足惜突颊,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望潘悼。 院中可真熱鬧律秃,春花似錦、人聲如沸治唤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宾添。三九已至船惨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缕陕,已是汗流浹背粱锐。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留扛邑,地道東北人怜浅。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蔬崩,于是被迫代替她去往敵國和親恶座。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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