WINDOWS 下編譯 ffmpeg 源碼總結

WINDOWS 下編譯 ffmpeg 源碼,有兩種方式:VC、GCC

VC 編譯:
  https://github.com/ShiftMediaProject/FFVS-Project-Generator.git
  優點:省時省力。動態庫、靜態庫、X86、X64都支持。
  缺點:
         A. 需要 VC 運行庫的支持。作者也不打算脫離 VC 運行庫。
         B. 沒有 GCC 編譯出來的 FFMPEG 效率高。
            我將一個H265 視頻,轉換爲 H264,GCC 編譯的 FFMPEG.EXE 是 VC 編譯的 FFMPEG.EXE 的 4 倍多。
            作者也說有可能是 GCC 有 VC 不支持的語法,造成的。
            
  看來要想效果好,只有用 MSYS2 編譯了。

GCC 編譯:
  一:自己動手,豐衣足食
     WINDOWS 下 GCC 編譯當然用 MSYS2 。因爲用 MSYS2 編譯 FFMPEG 比較容易。如果不需要第三方庫的支持:
     ./configure
     或者
     ./configure --enable-gpl --enable-version3 --enable-nonfree
     或者 (靜態庫編譯)
     ./configure --enable-gpl --enable-version3 --enable-nonfree --disable-shared --enable-static
     或者 (動態庫編譯)
     ./configure --enable-gpl --enable-version3 --enable-nonfree --disable-static --enable-shared
    
     這樣就可以了。默認是編譯的是動態庫。
     因爲有開源協議的規定,有的開源源碼只能被編譯成動態庫。
     所以你經常看到某些開源代碼的動態庫,但沒有靜態庫,就是這個原因。
     我們自己動手編譯,動態庫、靜態庫隨自己意。
     FFMPEG 本身也沒有嚴格遵守源碼協議。
     
     一步一步添加第三方庫的支持。
     MSYS2 可以安裝很多第三方庫,也不用自己編譯了,省了很多時間。
     比如在 MSYS2 中安裝 openh264 庫(openh264 就有協議要求,只能被編譯成動態庫):
     pacman -S --noconfirm mingw-w64-i686-openh264 mingw-w64-x86_64-openh264 
     前一個是 X86 位的,後一個是 X64 位的。
     
     逐步添加第三方庫的支持
     ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-amf
     ......
     這是 WINDOWS 下 FFMPEG 支持的所有第三方庫
     ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-amf --enable-bzlib --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-iconv --enable-lzma --enable-nvenc --enable-zlib --enable-sdl2 --enable-ffnvcodec --enable-nvdec --enable-cuda-llvm --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libdav1d --disable-debug --enable-fontconfig --enable-libass --enable-libbluray --enable-libfreetype --enable-libmfx --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libwavpack --enable-libwebp --enable-libxml2 --enable-libzimg --enable-libshine --enable-avisynth --enable-libxvid --enable-libaom --enable-libopenmpt --enable-chromaprint --enable-decklink --enable-frei0r --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libfdk-aac --enable-libflite --enable-libfribidi --enable-libgme --enable-libgsm --enable-libilbc --enable-libkvazaar --enable-libmodplug --enable-librtmp --enable-librubberband --enable-libssh --enable-libtesseract --enable-libxavs --enable-libzmq --enable-libzvbi --enable-openal --enable-libcodec2 --enable-libsrt --enable-ladspa --enable-opencl --enable-opengl --enable-libopenh264 --enable-openssl 
     
     優點:自己編譯,按自己定製。
     缺點:費時費力,勞心勞神。
     
  二:跨平臺編譯
  https://github.com/rdp/ffmpeg-windows-build-helpers.git
  這是在 linux 下編譯,得到 WINDOWS 下的 FFMPEG。
  兩種方式:
    一種是安裝 linux 虛擬機,如:Ubuntu,在 Ubuntu 中用 GCC 編譯。
    一種是在 windows10 中,linux 子系統中,用 GCC 編譯。
    
    優點:省力,自動下載,自動編譯,動態庫、靜態庫、X86、X64都支持;
    缺點:耗時。要下載東東太多,比較耗時。好的翻牆工具必不可少。否則網絡就能折騰死你;
    
  三:自動編譯
     https://github.com/m-ab-s/media-autobuild_suite.git
     用的也是 MSYS2(GCC) 編譯。參考的也是上面的跨平臺編譯。
     自動下載所有工具(包括MSYS2)、源碼、編譯一步到位。
     優點:省力,自動下載,自動編譯,動態庫、靜態庫、X86、X64都支持;
     缺點:耗時。要下載東東太多,比較耗時。好的翻牆工具必不可少。否則網絡就能折騰死你;
   
無論哪一種編譯,中間文件都在40G以上。大硬盤必不可少。固態硬盤最好。

msys2(GCC) 靜態編譯時,因爲 msys2 優先會查詢 .dll.a 文件,如果存在,會進行動態鏈接。
所以如果有靜態庫的情況下,可以將 .dll.a 文件刪除或重命名爲 .dll.a.bak。
讓 msys2 找不到動態庫,只能用靜態庫鏈接了(mingw64\lib 目錄和 mingw32\lib 目錄)。

libgcc_s_dw2-1.dll、libgomp-1.dll 等 GCC 系統的 dll ,可以將 
mingw32\lib\gcc\i686-w64-mingw32\9.2.0

mingw64\lib\gcc\x86_64-w64-mingw32\9.2.0
目錄下的 .dll.a 重命名爲 .dll.a.bak,就可以了。

libwinpthread-1.dll.a  在 目錄 mingw64\x86_64-w64-mingw32\lib 下(x64),和 mingw32\i686-w64-mingw32\lib 下(x86)。

(前提你編譯的靜態庫中,不能調用了這些 GCC 系統 Dll 中的函數,必須是靜態調用)

 

推薦用第三種方式編譯。解決了網絡問題,就沒有什麼問題了。
編譯一次2-3個小時。動態庫、靜態庫、X86、X64一起編譯,那就要10個小時了。
睡一覺,早晨起牀就編譯好了。豈不妙哉。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章