之前在《使用 Qt 撰寫影片播放程式的一些紀錄》一文,Heresy 有大概紀錄一下使用 Qt 5.x 內建的 QMediaPlayer 來撥放影片的方法;不過當時也碰到了一些問題,所以 Heresy 後來也有試著找一些替代方案來用。
後來是發現 QtAV 這個整合了 Qt 和 FFmpeg(官網)的這個專案似乎還算不錯,所以就認真研究看看了。
QtAV 的官方網站是:http://www.qtav.org/,原始碼則是在 https://github.com/wang-bin/QtAV 或 https://sourceforge.net/projects/qtav/。
他基本上包含了 C++ 函式庫、對應的範例,以及兩個功能算是完整的播放軟體(C++ 與 QML)。
而由於他提供的預先編譯好的版本選擇有限,所以 Heresy 後來就開始研究怎麼自己編譯了。這篇基本上就是怎麼在 Windows 環境下,使用 Visual C++ 來進行建置的紀錄:
-
下載必要的檔案
-
QtAV 原始碼
這部分可以直接由官方的 GutHub 下載,網址是 https://github.com/wang-bin/QtAV。
-
第三方函式庫
-
-
使用 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 的專案了。
-
-
調整專案
雖然 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 這個專案也是必要的,不過基本上應該是不用修改設定就可以編譯了。 -
-
抽出檔案
都編譯好了之後,接下來就是把必要的檔案抽出來給其他專案用了。
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 吧。