背景及准備工作
一點歷史
古有魏蜀吳三分天下,今有 Mplayer、MPC、VLC 三分天下。這個世界觀太龐大,忍不住先講一點多媒體播放器的歷史。實際上目前市面上的開源播放器主要基於三種技術棧:
Mplayer/MPV
發家於 Linux 平台的播放器,基於 FFmpeg 進行解碼。我們的研究對象 Mpv 實際上是 Mplayer 的一個衍生分支。基於 OpenGL pipeline 的渲染方案使得自定義配置非常靈活,例如 upscale 算法就有近十種可選,在我看來僅次於 madVR。Mpv 內部實現了支持各種平台的 video output 模塊,比如在 Linux 上使用 GPU/OpenGL 或者 X11,在 Windows 上使用 GPU/OpenGL 或者 GPU/D3D11。
VLC
VideoLAN 組織開發的視頻播放器,具體什么技術棧我沒研究過,不過由於 libVLC 調用十分方便,一眾套殼播放器和 UWP 下的播放器底層都是調用的 VLC。VLC 傾向於成為一個開箱即用的簡便播放器,諸如 upscale 之類的特性沒有很好的擴展性。
MPC
Windows 系統下的播放器鼻祖。MPC 使用 FFmpeg 進行解碼,同時支持 DXVA 等技術,使用 Windows DirectShow 進行渲染。DirectShow 這個接口已經非常古早了,早在 Windows 7 的時候微軟就已經欽定了他的替代者——Media Foundation。只是微軟宅心仁厚,直到現在還一直支持着對古老技術方案的前向兼容。
當然 DirectShow 方案存活了這么久,在這上面做的文章也是最多的。著名的渲染器 madVR 也是基於這套方案。基於 MPC,后來衍生出了 MPC-HC 和 MPC-BE 兩個播放器。如果你想用 madVR,搭配 MPC-HC 可能是兼容性最好的組合了。
總結一下,MPC 技術棧真的非常老了,VLC 不夠 Geek,MPV 戰未來。
准備工作
為了能夠順利的閱讀源碼,以及編譯我們自己的 Mpv,一些環境是必不可少的。閱讀源碼我使用的是 Visual Studio,當然 VSCode 也行,只要能自動把聲明定義索引到就行。
Mpv 的編譯需要在 Linux 下進行,使用交叉編譯環境編譯到 Windows 下來使用。編譯可以參考這篇文章,兩種方法我都試過,mxe 環境比較適合靜態鏈接;不需要靜態鏈接的話,在 Windows 下使用 MSYS2 就足夠了。動態鏈接的 mpv 編譯出來以后會依賴數十個動態鏈接庫,個人覺得僅適合嘗鮮使用。
不想編譯也沒關系,用 Git 把官方倉庫 clone 下來即可。下一篇正式進入代碼。