qt - 在播放视频的 QWidget 之上包含 QML 的 QDeclarativeView 的透明度(使用声子或 libvlc)

标签 qt video qml phonon libvlc

我目前正在开发视频播放器。

作为最顶层的 GUI 是用 QML 编写的。它应该对下层透明。它包含控制元素、一些列表等,使用 QDeclarativeView 显示。

描述

 QDeclarativeView *upperLayer = new QDeclarativeView(this); 
 upperLayer->setSource(QUrl("/home/projects/QtVideo/qml/videoControl.qml"));
 upperLayer->setStyleSheet(QString("background: transparent");
 upperLayer->setResizeMode(QDeclarativeView::SizeRootObjectToView);
 uperLayer->showFullScreen();

底层是一个QWidget:我用libvlc来显示视频内容 在这个小部件中。

原因:我正在接收 MPEG-TS,它不能被声子解码,afaik。因此,我需要 libvlc 来解码传入的 *.ts 流并将输出放到显示器上。

QWidget *lowerLayer = new QWidget(this);
lowerLayer.setGeometry(QString("background: red"));
QUrl* url = new QUrl("file:///home/projects/QtVideo/video.ts");
libvlc_instance_t*vlcObject;
libvlc_media_t*vlcMedia;
libvlc_media_player_t*vlcPlayer;

vlcPlayer = NULL;
if(vlcObject = libvlc_new(argc, argv)) == NULL)
{
     printf("Not able to initialize";
     exit(1);
}

if(vlcPlayer && libvlc_media_player_is_playing(vlcPlayer))
{
     libvlc_media_player_stop(vlcPlayer);
}

vlcPlayer = libvlc_media_player_new(vlcObject);
vlcMedia = libvlc_media_new_location(vlcObject, url.toString().toUtf8().constData());
libvlc_media_player_set_media(vlcPlayer, vlcMedia);

#if defined(Q_OS_MAC)
     libvlc_media_player_set_nsobject(vlcPlayer, lowerLayer->winId());
#elif defined(Q_OS_UNIX)
     libvlc_media_player_set_x_window(vlcPlayer, lowerLayer->winId());
#elif defined(Q_OS_WIN)
     libvlc_media_player_set_hwnd(vlcPlayer, lowerLayer->winId());
#endif

libvlc_media_player_play(vlc_player);

两个元素,QDeclarativeViewQWidget 嵌入在一个QMainWindow中,lowerLayer在upperLayer之前创建, upperLayerlowerLayer 透明。

问题:

只要 lowerLayer 显示静态元素,例如图片或一些彩色形状,一切正常,完全透明和功能。

一旦我开始显示视频,例如使用 libvlc 描述的 *.ts 或使用 Phonon::VideoPlayer 的一些随机视频,部分lowerLayer 视频部分上方的 upperLayerlowerLayer(default: gray) 的颜色显示,位于 lowerLayer 部分上方的 upperLayer 或其他不包含视频元素的部分会以正确的行为显示。

问题:

是否有任何可能性,如果,如何使 upperLayer 透明,即使正在播放视频?

最佳答案

您还在为这个问题而苦恼吗?遗憾的是,我没有给你一个令人满意的答案。我能做的就是指出它不起作用的原因:

http://lists.trolltech.com/qt-interest/2007-02/thread01061-0.html

请参阅上面链接中的消息 #4。

我尝试了许多不同的方法来使用 Qt 在视频(特别是 Phonon::VideoPlayer)上进行透明绘画。到目前为止我发现的唯一方法是将覆盖的 QWidget 设置为工具提示,执行类似

pWidget->setWindowFlags(Qt::ToolTip)

这可能就足够了,但(在我看来)这充其量只是一种技巧,具体取决于您想要执行的操作。我正在努力解决这个问题,如果我能找到某种解决方案,我一定会在这里发布。

祝你好运。

关于qt - 在播放视频的 QWidget 之上包含 QML 的 QDeclarativeView 的透明度(使用声子或 libvlc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5803209/

相关文章:

c++ - 如何将浮点值转换为quint16数组?

c++ - 在信号槽机制与传统循环之间做出决定

c++ - 连接两个具有不同参数的信号

linux - ffmpeg : Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, 速率、宽度或高度

Android播放带有开始位置的视频 Intent

qt - 菜单元素的 ListView 信号和槽

c++ - 整合c++和qml

c++ - Qt5 应用程序在关闭时崩溃 (QWidget::show)

Android - 将 mp3 音频添加到 mp4 视频

QML 文件包括 - 还是一个整体文件(结构 QML 代码)?