自行使用 VisualStudio 建置 QtAV

| | 0 Comments| 09:04
Categories:

之前在《使用 Qt 撰寫影片播放程式的一些紀錄》一文,Heresy 有大概紀錄一下使用 Qt 5.x 內建的 QMediaPlayer 來撥放影片的方法;不過當時也碰到了一些問題,所以 Heresy 後來也有試著找一些替代方案來用。

後來是發現 QtAV 這個整合了 Qt 和 FFmpeg(官網)的這個專案似乎還算不錯,所以就認真研究看看了。

QtAV 的官方網站是:http://www.qtav.org/,原始碼則是在 https://github.com/wang-bin/QtAVhttps://sourceforge.net/projects/qtav/

他基本上包含了 C++ 函式庫、對應的範例,以及兩個功能算是完整的播放軟體(C++ 與 QML)。

而由於他提供的預先編譯好的版本選擇有限,所以 Heresy 後來就開始研究怎麼自己編譯了。這篇基本上就是怎麼在 Windows 環境下,使用 Visual C++ 來進行建置的紀錄:

  1. 下載必要的檔案

    1. QtAV 原始碼

      這部分可以直接由官方的 GutHub 下載,網址是 https://github.com/wang-bin/QtAV

    2. 第三方函式庫

      由於 QtAV 除了有用到 Qt 外,還有另外用到以 FFmpeg 為主的第三方函式庫,所以這邊也都要先準備好。

      Qt 的部分基本上就是到 Qt 官方網站(連結)下載就可以了(下載頁面)。

      至於其他函式庫的部分,如果不想自己搞的話,則可以直接下載 QtAV 提供的建置好的版本,檔案在 SourceForge 上(連結);以 Windows 開發來說,應該是下載「QtAV-depends-windows-x86+x64.7z」這個檔案(連結)就可以了。

      如果真的有心的話,也可以考慮自己從頭開始編譯,不過應該會很麻煩…

  2. 使用 CMake 產生 Visual Studio 方案

    由於 QtAV 並沒有原生提供 Visual Studio 的專案,所以如果想用 Visual C++ 來建置的話,一個選擇是使用 Qt 的 Project、另一個則是使用他提供的 CMakefile;而 Heresy 這邊是選擇使用 CMake 系統。

    要使用 CMake(官網)的話,要先下載他的執行檔,然後透過他來建立專案。不過如果是 Visual Studio 2017 的話,其實也已經有內建 CMake 的功能了,可以直接使用他「開啟資料夾」的功能來建立專案(參考)。

    而要使用 CMake 產生 Visual Studio 的專案時,還要做一些設定,讓 CMake 知道目前系統有那些東西、在哪裡。

    • 加入「CMAKE_PREFIX_PATH」,把他的值設定成 Qt 的 Cmake 路徑,如此 CMake 才能找到 Qt 相關檔案的路徑。

      例如「D:Qt5.9msvc2015_64libcmake」就是 Qt 5.9 的 VC2015 x64 版的 CMake 相關檔案所在位置。

    • 加入 HAVE_AVCODEC、HAVE_AVDEVICE、HAVE_AVFILTER、HAVE_AVFORMAT、HAVE_AVRESAMPLE、HAVE_AVUTIL、HAVE_SWRESAMPLE、HAVE_SWSCALE 這些定義(值給 1 就可以了),告訴 CMake 系統中有這些函式庫(前面下載的「QtAV-depends-x」提供的)。

    如此一來,CMake 應該就可以正確產生出 Visual Studio 的專案了。

  3. 調整專案

    雖然 QAV 的專案已經產生出來了,不過在 Heresy 至邊還是不能直接編譯的,需要再另外做一些修改。

    而這邊基本上都是修改 QtAV 這個專案。

    • 加入第三方函式庫的路徑。

      「QtAV-depends-windows-x86+x64.7z」這個檔案解壓縮之後,裡面會有四個資料夾,分別是:bin、include、lib、share。而在 Visual C++ 裡面的 QtAV 這個專案裡面,加入 include 和 lib 的路徑設定,讓 VC 知道到哪找到對應的檔案。

      其中,要 link 那些檔案因為有寫在程式裡面,所以不用特別加進去。

    • 把 QtAV 資料夾中的「srcdirectxSurfaceInteropD3D9GL.cpp」這個檔案加到 QtAV 專案中,否則在編譯完後會出現找不到 QtAV::d3d9::CreateInteropGL 參考的錯誤。

    • 在 QtAV 專案中,加入預先定義「CAPI_LINK_EGL」,並額外連結 Qt 提供的 libEGL.lib。

      在 Heresy 這邊不這樣設定的話,編譯時會出現一堆 C4430 的錯誤。

      不過基本上這邊這個方法只能算是 Heresy 自己找到的 workaround,不確定是否有其他更好的方法。

    • 刪除 QtAV 目錄下的「contribdxsdk」這個資料夾。

      因為這邊 QtAV 提供的版本比 Windows 10 的舊,如果不刪掉的話,編譯完會導致編譯時用的 header 和執行階段的 DLL 版本不合,結果程式執行時有問題的狀況(這邊是 XAudio2 的部分會當掉)。

    理論上,這樣 QtAV 這個專案就可以正確編譯了。

    而除了 QtAV 外,QtAVWidgets 這個專案也是必要的,不過基本上應該是不用修改設定就可以編譯了。

  4. 抽出檔案

    都編譯好了之後,接下來就是把必要的檔案抽出來給其他專案用了。

    Header 檔的部分,檔案是在「srcQtAV」「widgetsQtAVWidgets」這兩個資料夾;基本上只要把這兩個資料夾複製出來就可以了。

    Lib 檔的話,則是只需要 QtAV.lib、QtAVWidgets.lib 這兩個檔案;Dll 檔則是 QtAV.dll、QtAVWidgets.dll 這兩個檔案。這邊的檔名和官方提供預先編譯好的不一樣,不過應該是不影響。另外要注意的是,debug 和 release 版應該無法混用。

    而實際執行的時候,還需要第三方函式庫的 Dll 檔;而只要使用「QtAV-depends-windows-x86+x64.7z」這個壓縮檔裡面「bin」資料夾裡面的檔案就可以了。

大致上就是這樣了。基本上,Heresy 只能說目前是調到可以編譯、可以用,但是到底是不是正確的方法,就不敢保證了~

之後再來認真試試看把 QMediaPlayer 改成 QtAV 吧。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *