FFmpeg在VS2017下的編譯


今天無意中在gayhub發現個牛逼工程,全VS工程編譯FFMPEG庫,包括依賴庫全是VS生成的,無需Mingw等Linux環境。

簡單記錄下過程,以防將來重裝系統等情況,備忘。

https://github.com/ShiftMediaProject/FFmpeg

git clone 此項目,運行SMP\project_get_dependencies.bat 下載。

不過我之前並不知道這個自動下載依賴,我直接clone了這個人的所有項目......

查看SMP\readme.txt,可知,除了相關庫外,還需要單獨下載一些他沒有帶的內容。

你需要建一個目錄,包含這些單獨的頭文件。

比如叫__FFMPEG_Need,建立一個include目錄,再在其下建立4個目錄

AMF

ffnvcodec

gl

KHR

在gl目錄中放入以下2個文件

https://www.khronos.org/registry/OpenGL/api/GL/glext.h

https://www.khronos.org/registry/OpenGL/api/GL/wglext.h

KHR放入

https://www.khronos.org/registry/EGL/api/KHR/khrplatform.h

然后clone這個項目

https://github.com/FFmpeg/nv-codec-headers

把這個項目include下的內容,直接放到我們當前include目錄即可,也就是復制那個ffnvcodec目錄

最后clone AMF

https://github.com/GPUOpen-LibrariesAndSDKs/AMF

amf/public/include

內容放到你的AMF目錄下,也就是把

components

core

復制到AMF目錄下

至此,include目錄准備完畢,等會編譯工程,把這個目錄加入所有工程include路徑即可,你可以選擇加入VS全局include目錄里。

========================================

接下來下載YASM和NASM

http://yasm.tortall.net/Download.html

 YASM只需下載exe即可,32還是64位隨意,我只需要32位,

http://www.tortall.net/projects/yasm/releases/yasm-1.3.0-win32.exe

下好后改名yasm.exe

建個目錄,比如

E:\Yasm

把yasm.exe放入

新建環境變量YASMPATH,寫入路徑地址

注意路徑最后要有反斜杠\結尾

然后下載NASM

https://www.nasm.us/pub/nasm/releasebuilds/2.14/

要下載安裝器,不知道為什么,我下載zip好像失敗了,所以只能用exe安裝版本。

https://www.nasm.us/pub/nasm/releasebuilds/2.14/win32/nasm-2.14-installer-x86.exe

把nasm安裝一下,比如

E:\nasm-2.14

之后同上,新建環境變量NASMPATH,加入路徑

 

因為我是單獨clone的所有工程,所以

https://github.com/ShiftMediaProject/VSYASM

https://github.com/ShiftMediaProject/VSNASM

在這2個工程里,把每個工程的

.props
.targets
.xml

類型配置文件,1個工程有3個文件,總共6個文件,復制到類似下面的目錄中,也就是你VS2017的配置目錄,VS默認只有masm的配置

D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\BuildCustomizations

然后打開SMP\ffmpeg_deps.sln工程,如果提示更新一些VS組件就都選是更新。

如果工程全都可以打開,不缺少工程的話,那么配置就OK了。如果有加載不了的項目,分2種情況

1.如果是少工程就補全工程。

其他工程都與ffmpeg同級。

ffmpeg

libass

這樣同級目錄

2.如果工程文件目錄都正常存在,但是還是加載不了,可能就是YASM和NASM配置有問題,但是現在應該都配置好了,我是先有問題,才后裝的NASM。

最后,你應該得到一個可以打開

FFmpeg\SMP\ffmpeg_deps.sln

之后,所有工程都可以加載上的,沒有Load Fail的Solution

 

試着編譯,如果顯示Windows SDK不正常,修改一下所有工程使用的SDK即可,默認似乎是Win8 SDK,我重裝VS2017似乎只有Win10 SDK,沒有Win8,所以改成Win10 SDK才能編譯。

繼續,如果編譯libav之類的庫,一定會提示缺少頭文件,因為最開始單獨下載的那些include頭文件沒有放進VS全局目錄,加入即可。

比如

E:\PProjects\GitDownloads\__FFMPEG_Need\include

然后再次編譯,直接編譯debug即可,因為主要是學習原理,而非測試運行效率。

如果全都編譯通過沒有錯誤,就可以再打開

FFmpeg\SMP\ffmpeg.sln

把ffplay之類的也編譯了,對我來說ffplay才是重點,因為這是播放器應用實例,我個人能在網上找到播放視頻最實用的例子了。

展開ffplay工程,ffplay.c文件,如果直接編譯這個ffplay,生成的ffplay.exe播放視頻會提示音頻初始化失敗而播放不出聲音,似乎是因為dsound初始化失敗了。

根據之前2次編譯ffplay的經驗,在文件頭加入window頭

#include <Windows.h>

搜索SDL_OpenAudioDevice

在這行前加入

CoInitialize(NULL);

再編譯即可修復音頻問題。

我的FFMPEG工程目錄在

E:\PProjects\GitDownloads\FFmpeg

那么生成的文件在

E:\PProjects\msvc\bin\x86\ffplay.exe

這個msvc目錄似乎是自動生成的

 

還不算完,現在要測試一個帶字幕的視頻文件,並且用ffplay播放字幕。

一般的命令,比如ffplay mv.mkv是不會播放視頻的字幕的。

想播放字幕,正確的用法是

ffplay -vf subtitles=mv.mkv mv.mkv

外掛字幕同理

ffplay -vf subtitles=mv.ass mv.mkv

這樣才行

 

至此結束,可以開始斷點跟蹤代碼走向了,最叼的是全VS工程,完全可控的代碼,讓你有心情查看每一個庫的實現,而不是像屎一樣的那種一堆源碼,自動編譯完就能用的那種垃圾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM