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 中安裝二進制文件,默認(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代碼,編譯的庫和二進制文件處于GPL許可下,默認(rèn)為否
--enable-version3   升級(L)GPL到版本3,默認(rèn)為否
--enable-nonfree    允許使用非自由代碼,并且二進制文件將不可再分發(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 禁用在運行時檢測 CPU 功能(較小的二進制文件)
--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 獨立組件選項

--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 擴展庫支持

使用以下任何選項將允許 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,改進 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)上運行可執(zhí)行文件的命令
--target-path=DIR   在目標(biāo)上查看構(gòu)建目錄的路徑
--target-samples=DIR    目標(biāo)樣本目錄的路徑
--tempprefix=PATH   強制固定目錄/前綴而不是 mktemp 進行檢查
--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    使用主機 C 編譯器 HOSTCC
--host-cflags=HCFLAGS   在為主機編譯時使用 HCFLAGS
--host-cppflags=HCPPFLAGS   在為主機編譯時使用 HCPPFLAGS
--host-ld=HOSTLD    使用主機鏈接器 HOSTLD
--host-ldflags=HLDFLAGS 鏈接主機時使用 HLDFLAGS
--host-extralibs=HLIBS  鏈接主機時使用庫 HLIBS
--host-os=OS    編譯器主機操作系統(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   使用硬編碼表而不是運行時生成
--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!擴展優(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    禁用獨立 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)致運行時變慢
--enable-memory-poisoning   用任意數(shù)據(jù)填充堆未初始化的分配空間
--valgrind=VALGRIND 通過 valgrind 運行“make fate”測試以檢測內(nèi)存泄漏和錯誤,使用指定的 valgrind 二進制文件。不能與 --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 隨機啟用/禁用組件
--enable-random=LIST    隨機啟用/禁用特定組件,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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容