为啥qt webengine不能播放youtube直播视频流

Posted

技术标签:

【中文标题】为啥qt webengine不能播放youtube直播视频流【英文标题】:Why qt webengine can't play youtube live video streams为什么qt webengine不能播放youtube直播视频流 【发布时间】:2020-12-18 18:11:57 【问题描述】:

我正在使用 webengine 创建一个简单的网络浏览器。我去了 youtube 并尝试播放直播但失败了。每个需要在浏览器中支持 html5 视频的视频都会发生同样的事情。我没有看到任何与此相同的最近问题。 Qt 说 webengine 从他们发布的 Qt5 开始支持 HTML5。对相同问题的一些旧答案建议他们自己编译 qtwebengine。我尝试了几次都失败了(可能是我的电脑无法完成这项工作)。其他人说从代码中启用专有插件。但就我而言,它也不起作用。

运行代码还会记录错误WebEngineContext used before QtWebEngine::initialize() or OpenGL context creation failed.

这是我的简单 qml 代码。

import QtQuick 2.12
import QtQuick.Window 2.12
import QtWebEngine 1.0

Window 
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    WebEngineView
        anchors.fill:parent
        url:"https://www.youtube.com/watch?v=iL53Y28Rp84"
    

Qt 版本:5.15.1(GNU 公共许可证)

使用 qt 在线安装程序安装。

【问题讨论】:

你的操作系统是什么? Ubuntu 20.04 内核 5.9.1 【参考方案1】:

您的问题很可能是 - 正如控制台中的错误所说 - 您尚未初始化 Web 引擎。在您的main() 中,您必须在进行任何渲染之前调用QtWebEngine::initialize()。所以你的主要功能应该是这样的:

#include <QtWebEngine>

int main(int argc, char* argv[]) 

    QGuiApplication a(argc, argv);
    QtWebEngine::initialize();
    (...)

根据 Qt 文档,initialize() 函数确保 OpenGL 上下文可以在 GUI 和渲染器进程之间共享。 Link to the Qt documentation.

【讨论】:

我在创建 QCoreApplication 之前添加了它,因为它说它将来会贬值。现在它停止显示该错误,但它没有解决我不支持 html5 视频的问题。 好吧,Qt 有一个嵌入 YouTube 视频的示例,但它不在 QML 中。思路是将一个简单的 HTML 文件加载到 WebEngineView 中,该 HTML 文件通过 iframe 加载视频。见doc.qt.io/archives/qt-5.11/…。 没有。它不适用于实时流。我检查一下。现在编译器开始显示错误(可以忽略),例如 ` :-1: error: /mnt/volume1/main_file_folder/Home/Qt/5.15.1/gcc_64/lib/libQt5WebEngineCore.so: .dynsym local symbol at索引 4 (>= sh_info of 3)`。我是否缺少任何系统依赖项?我问这个是因为构建不是由我编译的。 我刚刚使用维护工具安装了 WebEngine 模块,运行上述示例,一切正常。您可能必须从维护工具重新安装模块。我的 Qt 版本是 5.12。有人在bugreports.qt.io/browse/QTBUG-80964 提交了一个错误,您可能想检查一下。此外,从 YouTube 播放直播流需要专有编解码器。 在网上搜索后,我得出的结论是,您必须使用专有编解码器才能播放 YouTube 直播视频。对于非实时视频,您无需执行任何操作。这些编解码器默认是禁用的,只有在自己编译 Qt 时才能启用。许可应该不是问题,我认为这些是免费的,因为它们在非商业 Qt 版本中可用,但是,我不是律师。 FFMPEG 只是 WebEngine 可能使用的跨平台媒体播放器。【参考方案2】:

您收到的错误消息是微不足道的,他们已经在另一个答案中为您提供了解决方案,而我的答案是解决根本问题。无法播放 youtube 视频,因为 chromium(和 Qt WebEngine)不是通过启用专有编解码器编译的。解决方案是重新编译启用该标志的 Qt WebEngine。

从 cmets 可以看出 OP 使用的是 Qt 5.15.1,所以他必须遵循以下步骤:

sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
sudo apt-get install -y libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libxtst-dev libxss-dev libdbus-1-dev libevent-dev libfontconfig1-dev libcap-dev libpulse-dev libudev-dev libpci-dev libnss3-dev libasound2-dev libegl1-mesa-dev gperf bison nodejs
git clone -b 5.15.1 git://code.qt.io/qt/qtwebengine.git
cd qtwebengine
git submodule update --init
/path/of/Qt/5.15.1/gcc_64/bin/qmake . -- -webengine-proprietary-codecs
make
make install

注意:根据您的情况下的 cmets /path/of/Qt/5.15.1/gcc_64/bin/qmake 中显示的日志是 /mnt/volume1/main_file_folder/Home/Qt/5.15.1/gcc_64/bin/qmake

【讨论】:

以上是关于为啥qt webengine不能播放youtube直播视频流的主要内容,如果未能解决你的问题,请参考以下文章

QT 5.8 WebEngine Html 5 视频播放器支持

为啥 Qt WebEngine Chromium 在 MSVS Express 2015 下构建失败?

如何使用 Qt webEngine 而不是 Qt webkit

Qwebkit 和 flash 播放器,为啥它不能在 windows 中工作

Qt之加载百度离线地图(WebKit和WebEngine)

Qt之加载百度离线地图(WebKit和WebEngine)