【问题标题】:Transparency of QDeclarativeView containing QML on top of a QWidget playing a video (using either phonon or libvlc)包含 QML 的 QDeclarativeView 的透明度,位于播放视频的 QWidget 之上(使用 phonon 或 libvlc)
【发布时间】:2011-04-27 11:21:27
【问题描述】:

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

作为最顶层的 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,在upperLayer之前创建的lowerLayer, upperLayerlowerLayer 透明。

问题:

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

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

问题:

即使有视频播放,是否有任何可能性以及如何使上层透明?

【问题讨论】:

    标签: qt video qml phonon libvlc


    【解决方案1】:

    你还在纠结这个问题吗?很遗憾,我没有给你一个满意的答案。我能做的最好的就是指出它不起作用的原因:

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

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

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

    的操作
    pWidget->setWindowFlags(Qt::ToolTip)
    

    这取决于您到底想要做什么,这可能就足够了,但是(在我看来)它充其量只是一个 hack。我正在积极解决这个问题,如果我能找到某种解决方案,我一定会在这里发布。

    祝你好运。

    【讨论】:

      【解决方案2】:

      您正在使用直接渲染(通过传递小部件的 wid)在该几何图形上方绘制视频:

      libvlc_media_player_set_x_window
      

      您需要使用屏幕外渲染并将其绘制到您的 qwidget。这可以通过 opengl 上下文(复杂)或使用 libvlc 中可用的回调方法来完成。

      如果您使用显示回调 (libvlc_video_display_cb),如果您需要,libvlc 还将生成锁定/解锁方法。在此方法中,libvlc 将期望设置一些参数,例如画布几何形状和像素格式。

      也就是说,phonon 有一个 libvlc 后端可能会有所帮助,但可能仍会根据某些因素使用直接渲染..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多