FFmpeg + DirectX12 简易视频播放器随记(其一)

尽管我不知道为什么会有人想直接使用 DirectX 来做视频播放器,甚至还是 DirectX 12 这样一个麻烦的东西,总之这坨代码已经被我糊出了个雏形。虽然功能十分简陋,没有音频输出,视频的播放速度也不对,但总之能放了。为了避免经验快速从我的大脑流失,我还是决定记录一下我的整个实现思路历程。 把大象塞进冰箱 很显然,我们要做一个视频播放器,至少我们需要先有一个视频,然后把它播放出来。那么很好,就像把大象塞进冰箱一样,我们现在只需要两步,第一步是把视频的画面内容从文件里面提取出来,第二步是把视频的画面内容画到屏幕上。 好吧,我承认我在第一步上偷懒了。起初我是想用 Nvidia 的 NVDecoder 来干这活的,但由于我是倒着来干这活的——先实现第二步,再实现第一步,所以实现到后面就犯了懒,拿 FFmpeg 凑合过了。毕竟,为了验证第一步是否能够正确解码出画面内容,那必须先实现第二步的内容画面绘制才行。当然,一个更好的借口是,利用 FFmpeg 可以更加方便地实现对于多种软硬件编解码器实现的支持,不过这些重点并不在我这篇随记的内容范围内。避免篇幅过长,在这篇中我就仅对 DirectX 12 的渲染过程作记录,而 FFmpeg 的解码 API 调用则放到后续篇章中。 DirectX12 渲染一张图片 Win32 中文显示 在 Windows 上编程,总有几个比较烦人的点。其中字符编码就是一个比较大的问题。由于我想减少对于 Visual Studio 这一庞然大物的依赖,我选择使用 VSCode 和 CMake 来构建我的程序。由于对字符编码是在不甚了解,在这个项目中,折腾中文的显示也花费了我好一番功夫。最后,我沉淀出来的解决方案分为两个关键步骤。 首先,众所周知,Win32 大多数 API 都有两个版本,一个是后缀为 A 的 ANSI 版本,一个是后缀为 W 的宽字符版本。为了能让 Windows 正确处理源文件中的中文字符,我们需要使用 Win32 API 的宽字符版本。Win32 API 对具有两个版本的 API 都写了对应的宏,即不带后缀的版本,会根据当前是否定义了 UNICODE 宏来确定使用 A 版本或 W 版本。所以,为了让 Windows 的宏自动选择 W 版本的 Win32 API,在引入 Windows 的各项头文件前需要手动定义 UNICODE 宏。当然,如果你全部手动使用 W 版本的 Win32 API,倒也可以省去这一步。具体而言,头文件引入长得像下面这个样子: ...

July 20, 2024 · 7 min · H1RA