ffmpeg添加到环境变量_Windows + MSVC环境编译ffmpeg
實測成功環境: WIN7 + VS2013 + FFmpeg4.3 和 WIN10 + VS2019 + FFmpeg4.3(N-98819-ge2589ac)
源碼下載
- FFmpeg源碼
依賴工具
- MSYS2
- ?YASM
下載安裝MSYS2; 下載YASM,將文件名改為yasm.exe,將它所在的目錄加入到環境變量中。
配置頭文件和庫搜索路徑
以下幾種方法任選一種
1.使用vcvarsall.bat
- 打開cmd,執行vcvarsall.bat(一般在C:Program Files (x86)Microsoft Visual Studio 12.0VC目錄下,vcvarsall.bat將會設置INCLUDE和LIB環境變量,以便cl能找到對應頭文件和.lib文文件);
- 繼續在cmd中執行msys2安裝目錄下的msys2_shell.cmd
2.在VS中打開msys2
- 在VS中選擇:Tools -> External tools... -> Add
- 在VS中啟動msys2:Tools->msys2
確保msvc編譯器cl和鏈接器link是否正常
我們使用的是微軟的編譯器cl.exe和鏈接器link.exe,然而msys2自帶有link.exe,和msvc 的link.exe重名,且前者所在目錄在環境變量中靠前,所以運行link命令時實際運行的是msys2的link.exe,這將造成鏈接出錯
解決方法
- 將<msys2安裝目錄>usrbin下的link.exe重新命名為其它名稱;
- 或者,想辦法修改PATH的順序
msys2 安裝pkg-config,diffutils,make工具(msys2沒帶這些工具,手動安裝)
pacman -S pkg-config pacman -S diffutils pacman -S make2.構建
切換至FFmpeg源碼目錄,執行
./configure --toolchain=msvc make構建成功:
編譯ffplay
雖然ffplay是默認enable的,但ffplay的編譯依賴第三方庫sdl2,所以上述步驟可能因為缺少sdl2依賴而無法編譯出ffplay.exe。
下面是解決方法 sdl2下載 下載VC版本,解壓。
1.配置sdl2對msvc可見
顯然,sdl2頭文件和庫文件必須讓編譯器可以找到, 可以把頭文件目錄添加到INCLUDE環境變量,將庫文件目錄添加到LIB環境變量 在MSYS2控制臺執行(注意目錄得使用Windows格式 C://...而非 /c/...):
export INCLUDE=$INCLUDE";<sdl2頭文件目錄>" export LIB=$LIB";<sdl2庫文件目錄>"也可以在cmd執行vcvarsall.bat后使用set命令添加
2.配置sdl2對pkg-config可見
另外,sdl2除了得對msvc可見,還要對pkg-config可見,方法如下(實測可用,但不知道有沒有更好的方法) - 新建sdl2.pc 文件,編輯如下
prefix=你的sdl2所在目錄(目錄格式/c/...而非C://...) libdir=${prefix}/lib/x86 includedir=${prefix}/includeName: sdl2 Description: sdl2 Version: 2.0.12 Libs: -L${libdir} -lsdl2prefix設置為的sdl2目錄(目錄格式/c/...而非C://...),Version設置為你的sdl2版本
- 查看PKG_CONFIG_PATH環境變量,將sdl2.pc拷貝到其中任一目錄(如<msys2安裝目錄>/usr/lib/pkgconfig)
3.啟用sdl2,編譯
最后,使用--enable-sdl2啟用sdl2
./configure --enable-sdl2 --toolchain=msvc make其他庫的使用方法應該類似
問題
1.源碼字符集不匹配的問題
msvc2019
因為msvc2019默認以utf-8編碼讀取源碼,而./configure生成的config.h包含gbk字符 解決方法: - 將config.h以gbk編碼打開(notepad++或vscode),復制全部,再以utf-8打開粘貼覆蓋; - 或者,干脆將utf-8下亂碼的字符刪除
msvc2013
msvc2013默認以gbk編碼讀取源碼,所以方法同msvc2019,不過恰好相反,要確保不出現gbk編碼無法識別的字符
2.編譯出錯,timespec未定義
timespec結構體是C11標準定義的,包含在time.h頭文件中,msvc2013可能沒有完全實現這個標準。 幸好ffmpeg只是借用了這個結構體,而沒有用到相應的函數, 所以我們手動定義一下好了:
#ifndef _MY_TIMESPEC_ #define _MY_TIMESPEC_ struct timespec{time_t tv_sec; // Seconds - >= 0long tv_nsec; // Nanoseconds - [0, 999999999]}; #endif將它拷貝到源碼中,重新make
總結
以上是生活随笔為你收集整理的ffmpeg添加到环境变量_Windows + MSVC环境编译ffmpeg的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成立一周年后,6只净值型货币基金规模骤减
- 下一篇: 2017浦发信用卡5倍积分规则