用 Visual Studio 2019 编译 FFmpeg 简单教程
需要的東西:
●?Visual Studio 2019
??這個自行解決吧,本人用的是社區版
●?MSYS 環境,去 https://www.msys2.org/ 下載
??本人下載的是【msys2-x86_64-20210725.exe】
● yasm.exe,去?http://yasm.tortall.net/Download.html 下載
??本人下載的是【yasm-1.3.0-win64.exe】
● FFmpeg源碼,去?http://ffmpeg.org/download.html#releases?
? 就選擇?FFmpeg 4.4 "Rao" 吧
● 如果要編譯 ffplay,去?https://www.libsdl.org?
? 本人下載使用的是【SDL2-devel-2.0.14-VC.zip】
?一、配置MSYS2 環境
● 雙擊下載下來的可執行程序【msys2-x86_64-20210725.exe】,使用默認,一直點擊“下一步”直至安裝完畢。默認安裝目錄是【C:\msys64】。
● 然后,把【yasm-1.3.0-win64.exe】復制到【C:\msys64\usr\bin】下,改名為【yasm.exe】。
● 把【C:\msys64\usr\bin\】下的link.exe?改為其他名,比如【link_old.exe】,雖然不耽誤本教程所涉及的東西的結果,但改不改,隨看官喜歡了。
● 修改文件【C:\msys64\msys2_shell.cmd】,改之前先備份一下該文件。
????????把第17行前面的 rem 刪掉,修改后如圖:
????????
????????MSYS安裝完后,開始菜單上應該會創建4個快捷方式:
????????
這些快捷方式指向了同一個msys2_shell.cmd,不過參數不同。
????????C:\msys64\msys2_shell.cmd -mingw32
????????C:\msys64\msys2_shell.cmd -mingw64
????????C:\msys64\msys2_shell.cmd -ucrt64
????????C:\msys64\msys2_shell.cmd -msys?
所以用關鍵字【"MINGW32"】(有引號哦),從頭搜索文件【C:\msys64\msys2_shell.cmd】的內容,在如下位置找到:
????????
在 101 行下面插入下面內容:
?C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat
這是32位編譯環境,如果要想編譯64位的話,在104行下面,插入下面內容:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat
如圖:
????????
●?本人編譯32位的,所以,通過快捷方式【MSYS2 MinGW 32-bit】啟動 MSYS2 環境。
執行命令”cl” 就是 vc用的編譯器 cl.exe。
?●?但這個時候,沒有包:gcc、pkg-config、diffutils、make,其實就是常見編譯工具。通過執行命令安裝:
pacman -S gcc pkg-config diffutils make
這個時候,本教程需要的編譯環境,就配置好了,如有其他需求,再另行相應配置。
二、編譯ffmpeg, ffprobe
編譯環境配置好后,解壓 ffmpeg 源碼到任意目錄,然后從 msys2 環境進入該目錄,執行配置命令:
$ ./configure --enable-shared --toolchain=msvc --enable-gpl
因為本教程僅為一般目的而編譯ffmpeg,所以,配置命令就是這么簡單,各位按需修改,
--enable-shared? ? ?構建共享庫
--toolchain=msvc? ?使用vc
顯然,“使用vc”這個參數是必須的,不然一切可能就更簡單了。上述命令執行后,正常情況是等一會,看你的機器快慢了,然后輸出一堆簡報式內容。
接著,命令:
make -j4
這就是 make 了,成功后,源碼目錄下會生成 ffmpeg.exe、ffprobe.exe可執行文件,而?libavcodec、libavdevice 等子目錄下會生成 avdevice.lib、avdevice-58.dll,avcodec.lib、avcodec-58.dll 等 ffmpeg 共享庫文件。
那 ffplay.exe 呢,其實剛編譯成功后發現沒有它,我也挺驚訝的,不過馬上就釋然了,你都沒放置、指定SDL2庫,它咋能編譯出來啊?不過我沒去研究如何在這里編譯出來,因為我本來的目的是在Visual Studio 中F5 編譯啟動調試運行。本節內容至少要成功走過一遍,再繼續后面的內容。
三、建立 Visual Studio 解決方案
利用向導,建立3個空的控制臺工程。分別命名為ffmpeg, ffprobe, ffplay。
在任意目錄下建立解決方案都行,不用復制移動文件,全是通過【右鍵工程項目結點】->【添加】->【現有項】這個過程把原有源碼文件添加進新建的工程里,如圖,紅色圈內的目錄是源碼目錄,選中的那個就是VS解決方案目錄,其他的可以忽略,你可以參考這個:
?目前添加的源碼文件,都在這個目錄下,所以路徑前綴就省了:
(略...)\ffmpeg-4.4\fftools\
● ffmpeg 需要文件:
cmdutils.h? cmdutils.c? ffmpeg.c? ffmpeg.h
ffmpeg_filter.c? ffmpeg_hw.c? ffmpeg_opt.c
● ffprobe 需要文件:
cmdutils.h ?cmdutils.c? ffprobe.c
● ffplay 需要文件:
cmdutils.h ?cmdutils.c? ffplay.c
設置好附加包含目錄,附加庫目錄,附加依賴項,就可以編譯了。
我下的版本,用 Visual Studio 2019 編譯會出現若干編譯錯誤:
●?config.h(9,1): error C2001: 常量中有換行符
與文件保存編碼有關,這個文件使用腳本生成的,其在VS中查看,編碼是【Unicode (UTF-8 無簽名) - 代碼頁 65001】,其實就是沒有BOM,換成【Unicode (UTF-8 帶簽名) - 代碼頁 65001】即可。
ffmpeg_opt.c(448): error C4703: 使用了可能未初始化的本地指針變量“allow_unused”
這個顧名思義,F12定位到聲名之處,改為【char *allow_unused = NULL;】即可。還有幾處都是未初始化, 初始化為NULL即可。
cmdutils.obj : error LNK2019: 無法解析的外部符號 _avresample_version,函數 _print_all_libs_info 中引用了該符號
這個其實挺奇妙的,不知道為啥,不過這兩函數真沒啥用,在 cmdutils.c 文件的?print_all_libs_info 函數內,注釋掉第 1137 行:
//PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);四、完
源碼工程可以參考?https://download.csdn.net/download/fly4free/21739391
總結
以上是生活随笔為你收集整理的用 Visual Studio 2019 编译 FFmpeg 简单教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下usb调试工具,LINUX
- 下一篇: 每日一题(42)—— 已知一个数组tab