【UWP】FFmpeg庫的編譯


本文是關於windows8.1/windows10通用應用下編譯ffmpeg的一些需要注意的地方,針對最新的msys2而寫,都是我在實際操作中遇到的,但是網上沒有提到的。如果大家遇到什么問題或是在之前的MINGW中可以編譯,但在最新的msys2里遇到了問題,或許可以從本文中獲取一點參考。

uwp應用中,如果我們想要實現系統原生支持之外的媒體格式的解碼(如:flv,ape等),需要使用FFmpeg庫的支持。在Windows環境中,微軟寫好了一個專門用於編譯、調試FFmpeg的項目,也提供了三種語言的使用范例。但是,很多人經常卡在編譯ffmpeg這個最基礎的步驟上,原因五花八門,但最常見的問題則是cl編譯器無法工作。

這個問題,有很多可能的原因,網上也有很多解決方案,以下根據我遇到的情況,只針對。“cl is unable to create an executable file.”的問題補充、糾正幾點(網絡上的眾多解決方案其實有一些於事無補,還會增加大量不必要的操作):

①cl.exe編譯器自身的問題:

使用命令提示符打開Visual Studio的VC編譯器的目錄(eg:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin),有幾個文件夾需要注意:

·amd64

·amd64_arm

·amd64_x86

·arm

·x86_amd64

·x86_arm

顯而易見,這幾個文件夾提供的是對應(跨)平台的編譯工具。我們需要編譯什么平台的ffmpeg庫,最好在之前打開相應文件夾里的link.exe,看能否正常打開;使用命令提示符打開cl.exe,檢查是否有正常的提示信息打印在控制台里。如果cl.exe無法打開,很可能是缺失動態鏈接庫的原因。在……\Microsoft Visual Studio 14.0\Common7\IDE目錄下,將msobj140.dll,mspdb140.dll,mspdbcore.dll和mspdbsrv.exe四個文件覆蓋到……\Microsoft Visual Studio 14.0\VC\bin目錄下。完成后,雙擊cl.exe,提示符瞬間彈出即為正常。

 

②VS庫沒有被msys正確鏈接:

網絡上其他的編譯ffmpeg的教程幾乎都提到:如果不用vs提供的命令提示符打開msys2,也可以通過為msys2添加環境變量的方式來完成編譯。事實上,這一方法有很多漏洞,可行性很低,如果之前就遇到了cl相關的問題,那么通過手動添加環境變量的方式看似正確,實則會讓人走入彎路。

1.通過export命令直接添加

這個方法可能是最常用的,比如:export PATH=$PATH:"/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_arm"。隨后執行echo $PATH,可以看到環境變量添加成功。但是,在編譯時,ffmpeg里的configure配置無法讀取到后來手動添加的路徑。說白了,這個方法是徒勞的。

2.直接修改默認環境變量

這個方法直接修改msys目錄下/etc/profile文件,為其添加:

unset VS

VS=“路徑”

隨后在MINGW的三個case語句里的PATH后面追加${VS}。這個方法可行,但是還是很容易出錯,原因解釋:

msys2在執行鏈接到VS的交叉編譯時,需要引入的環境變量不止……Microsoft Visual Studio 14.0/VC/bin/<平台>一個。(事實上,perl等的編譯也需要vs的介入。)環境變量缺一不可。

所以,最穩妥的解決方法是:使用vs自帶的命令提示符(注意平台的對應)來打開msys2。

如果這之后觀察環境變量,發現還是msys2默認的那幾個,就根據平台打開對應的ini配置文件,將MSYS2_PATH_TYPE=inherit一句的注釋取掉(刪掉前面的“#”)。

執行 echo $PATH 指令,可以看到相比之前多出了很多vs的lib和include目錄,接下來再執行which指令確認cl(推薦使用文件的完全名稱(如:cl.exe)進行which指令查詢。)、link.exe(注意是在vs的目錄下,msys目錄下的文件需要臨時重命名)、armasm.exe(針對arm平台的編譯所需)是否就位(至於cpp.exe等包含於msys的文件,如果缺失,請檢查gcc,perl等庫的安裝),完畢后,將目錄cd至ffmpeg所在目錄,然后執行BuildFFmpegInterop.bat [系統] [平台] 即可。

一點補充:

Ⅰ.關於ffmpeg庫,推薦從github上直接下載zip包,只有14.6mb。如果使用git指令獲取的話,你可能會得到一個300m+的包,其實我們真正用到的只有解壓出來的那幾十m而已。

Ⅱ.微軟提供的批處理已經寫入了允許交叉編譯的指令,同時編譯出的庫允許為商店應用所用,不需要我們添加額外的 -store 參數。另外,關於dx11的相關庫的編譯是默認關閉的。

 

希望本文能為想在自己應用中引入多格式媒體支持,卻又在編譯ffmpeg庫遇到問題時的各位提供幫助。


免責聲明!

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



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