+
27
-

回答

根本原因解析

PyQtWebEngine 的底层是谷歌的开源项目 Chromium。

开源格式(原生支持):官方通过 pip install PyQtWebEngine 下载的预编译版本,只包含了免费开源的音视频解码器(如 WebM, VP8, VP9, Ogg)。

受版权保护的格式(不支持):像 MP4、H.264 视频和 AAC 音频 这些绝大多数商业视频网站都在使用的标准格式,是受严格商业专利保护的(MPEG-LA 专利池)。

因为 Qt 官方和 PyQt 的作者不希望为免费提供的开源预编译包支付高昂的专利费,所以他们在编译打包时,默认去除了专有解码器(Proprietary Codecs)。

解决方案

方案一:替换带解码器的现成 DLL 文件(最快、最实用 - 仅限 Windows)

既然官方的预编译包把解码器阉割了,万能的开源社区早就有人自己用源码把带解码器的版本编译出来了。你只需要狸猫换太子,替换掉你电脑里的一个底层文件即可。操作步骤:

找到你当前 Python 环境中 PyQt5 的安装路径。一般在:

C:\Users\你的用户名\AppData\Local\Programs\Python\Python310\Lib\site-packages\PyQt5\Qt5\bin或者虚拟环境的 Lib\site-packages\PyQt5\Qt5\bin 目录下。

在这个目录里,你会看到一个体积非常大的文件,叫做 Qt5WebEngineCore.dll(大约 100MB 左右),这就是浏览器内核本体。

去 GitHub 上搜索 QtWebEngine proprietary codecs(或者去原生的 Qt 论坛),下载别人已经开启了专有解码器并编译好的对应版本的 Qt5WebEngineCore.dll。将下载的完整版 DLL 覆盖替换 掉你本地那个阉割版的 DLL。

重新运行你的 Python 代码,你会发现所有 MP4 和 Bilibili 视频瞬间都能播放了!

(注:由于安全原因,这里无法直接提供第三方 DLL 的下载链接,你需要在 GitHub/Gitee 上搜索对应你 PyQt5 版本的 Qt5WebEngineCore.dll with proprietary codecs)

方案二:换用更新的 PySide6 并碰碰运气

如果你不想搞替换文件的麻烦事,可以尝试使用官方自带的下一代 UI 库 PySide6(Qt6 for Python)。

在部分较新的操作系统平台和较新版本的 PySide6 中,Qt 官方利用了系统底层自带的媒体框架(如 Windows 的 Media Foundation),这使得部分 H.264 视频可以在不内置解码器的情况下,调用系统解码器进行播放。

如果想试试这个方案,你需要:

pip install PySide6

将代码里的所有 PyQt5 替换为 PySide6。

将 PyQt5.QtWebEngineWidgets 改为 PySide6.QtWebEngineWidgets。

(注意:此方法能否播放取决于你的操作系统是否自带对应的解码环境,并不是 100% 成功)

方案三:自己从 C++ 源码编译 PyQtWebEngine(地狱难度)

这是最正规但也最折磨人的方法。你需要下载几十个 G 的 Chromium 和 Qt 源码,安装 Visual Studio C++ 编译环境,并在配置参数中强制加上开启专有解码器的命令:

qmake WEBENGINE_CONFIG+=use_proprietary_codecs

然后在电脑上连续编译大约 4 到 8 个小时。极其不推荐普通开发者尝试。

网友回复

我知道答案,我要回答