天天看點

「秒懂音視訊開發」編譯FFmpeg

本文來詳細講解一下:如何在Mac、Windows環境下成功編譯FFmpeg。

1.目标

這裡先提前說明一下,最後希望達到的效果:

  • 編譯出ffmpeg、ffprobe、ffplay三個指令行工具
  • 隻産生動态庫,不産生靜态庫
  • 将fdk-aac、x264、x265內建到FFmpeg中
  • x264、x265會在以後講解的視訊子產品中用到

2.下載下傳源碼

下載下傳源碼ffmpeg-4.3.2.tar.xz,然後解壓。

3.Mac編譯

3.1依賴項

  • brew install yasm

ffmpeg的編譯過程依賴yasm

若未安裝yasm會出現錯誤:nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.

  • brew install sdl2

ffplay依賴于sdl2

如果缺少sdl2,就無法編譯出ffplay

  • brew install fdk-aac

不然會出現錯誤:ERROR: libfdk_aac not found

  • brew install x264

不然會出現錯誤:ERROR: libx264 not found

  • brew install x265

不然會出現錯誤:ERROR: libx265 not found

其實x264、x265、sdl2都在曾經執行brew install ffmpeg的時候安裝過了。

  • 可以通過brew list的結果檢視是否安裝過

brew list | grep fdk

brew list | grep x26

brew list | grep -E 'fdk|x26'

  • 如果已經安裝過,可以不用再執行brew install

3.2configure

首先進入源碼目錄。

然後執行源碼目錄下的configure腳本,設定一些編譯參數,做一些編譯前的準備工作。

「秒懂音視訊開發」編譯FFmpeg
  • --prefix

用以指定編譯好的FFmpeg安裝到哪個目錄

一般放到/usr/local/ffmpeg中即可

  • --enable-shared

生成動态庫

  • --disable-static

不生成靜态庫

  • --enable-libfdk-aac

将fdk-aac内置到FFmpeg中

  • --enable-libx264

将x264内置到FFmpeg中

  • --enable-libx265

将x265内置到FFmpeg中

  • --enable-gpl

x264、x265要求開啟GPL License

  • --enable-nonfree

fdk-aac與GPL不相容,需要通過開啟nonfree進行配置

你可以通過configure --help指令檢視每一個配置項的作用。

「秒懂音視訊開發」編譯FFmpeg

3.3編譯

接下來開始解析源代碼目錄中的Makefile檔案,進行編譯。-j8表示允許同時執行8個編譯任務。

「秒懂音視訊開發」編譯FFmpeg

對于經常在類Unix系統下接觸C/C++開發的小夥伴來說,Makefile必然是不陌生的。這裡給不了解Makefile的小夥伴簡單科普一下:

  • Makefile描述了整個項目的編譯和連結等規則

比如哪些檔案需要編譯?哪些檔案不需要編譯?哪些檔案需要先編譯?哪些檔案需要後編譯?等等

  • Makefile可以使項目的編譯變得自動化,不需要每次都手動輸入一堆源檔案和參數

比如原來需要這麼寫:gcc test1.c test2.c test3.c -o test

3.4安裝

将編譯好的庫安裝到指定的位置:/usr/local/ffmpeg。

「秒懂音視訊開發」編譯FFmpeg

安裝完畢後,/usr/local/ffmpeg的目錄結構如下所示。

「秒懂音視訊開發」編譯FFmpeg

3.5配置PATH

為了讓bin目錄中的ffmpeg、ffprobe、ffplay在任意位置都能夠使用,需要先将bin目錄配置到環境變量PATH中。

「秒懂音視訊開發」編譯FFmpeg

如果你用的是bash,而不是zsh,隻需要将上面的.zprofile換成.bash_profile。

3.6驗證

接下來,在指令行上進行驗證。

「秒懂音視訊開發」編譯FFmpeg

此時,你完全可以通過brew uninstall ffmpeg解除安裝以前安裝的FFmpeg。

4.Windows編譯

configure、Makefile這一套工具是用在類Unix系統上的(Linux、Mac等),預設無法直接用在Windows上。

這裡介紹其中一種可行的解決方案:

  • 使用MSYS2軟體在Windows上模拟出Linux環境
  • 結合使用MinGW對FFmpeg進行編譯

4.1下載下傳安裝MSYS2

進入MSYS2官網下載下傳安裝包(我這邊下載下傳的是:msys2-x86_64-20210228.exe),然後進行安裝。

安裝完畢後打開指令行工具mingw64.exe。

4.2安裝依賴

pacman(Package Manager)是一個包管理工具。

  • pacman -Sl:搜尋有哪些包可以安裝
  • pacman -S:安裝
  • pacman -R:解除安裝
「秒懂音視訊開發」編譯FFmpeg

接下來,安裝各種依賴包。

「秒懂音視訊開發」編譯FFmpeg

關于軟體包相關的預設路徑:

  • 下載下傳目錄:%MSYS2_HOME%/var/cache/pacman/pkg
  • 安裝目錄:%MSYS2_HOME%/mingw64
  • %MSYS2_HOME%是指MSYS2的安裝目錄

4.3configure

我的源碼是放在F:/Dev/ffmpeg-4.3.1,輸入cd /f/dev/ffmpeg-4.3.1即可進入源碼目錄。然後執行configure。

「秒懂音視訊開發」編譯FFmpeg

4.4編譯、安裝

FFmpeg最終會被安裝到%MSYS2_HOME%/usr/local/ffmpeg目錄中。

「秒懂音視訊開發」編譯FFmpeg

FFmpeg的安裝目錄

4.5bin

此時bin目錄中的ffmpeg、ffprobe、ffplay還是沒法使用的,因為缺少相關的dll,需要從%MSYS2_HOME%/mingw64/bin中拷貝,或者将%MSYS2_HOME%/mingw64/bin配置到環境變量Path中。

需要拷貝的dll有:libwinpthread-1、SDL2、zlib1.dll、liblzma-5、libbz2-1、libiconv-2、libgcc_s_seh-1、libstdc++-6、libx265、libx264-159、libfdk-aac-2。

「秒懂音視訊開發」編譯FFmpeg

FFmpeg的bin目錄

4.6Path

最後建議将%FFMPEG_HOME%/bin目錄配置到環境變量Path中。

在指令行輸入ffmpeg -version,一切大功告成!

「秒懂音視訊開發」編譯FFmpeg

繼續閱讀