我目前正在开发视频播放器。
作为最顶层的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);
这两个元素,QDeclarativeView
和QWidget
嵌入在QMainWindow
之前创建的upperLayer
,lowerLayer中,
upperLayer
透明lowerLayer
。
只要lowerLayer显示静态元素(如图片或某些彩色形状),一切都很好,完全透明和功能。
一旦我开始显示视频,例如使用libvlc描述的*.ts
或使用Phonon::VideoPlayer
的一些随机视频,视频上方的upperLayer
部分lowerLayer
的部分以lowerLayer(default: gray)
的颜色显示,upperLayer
的部分位于lowerLayer
的部分或其他不包含视频元素的部分以正确的行为显示。
即使有视频播放,是否有任何可能性以及是否,如何使上层人员透明?
答案 0 :(得分:3)
你还在争论这个问题吗?遗憾的是,我没有给你满意的答案。我能做的最好的事情是指出为什么它不起作用的原因:
http://lists.trolltech.com/qt-interest/2007-02/thread01061-0.html
请参阅上面链接中的消息#4。
我尝试了许多不同的方法,使用Qt在视频(特别是Phonon :: VideoPlayer)上进行透明绘画。到目前为止,我发现的唯一方法是将重叠的QWidget设置为工具提示做类似的事情
pWidget->setWindowFlags(Qt::ToolTip)
取决于你想要做什么,这可能就足够了,但(在我看来)这是一个充其量的黑客。我正在积极地解决这个问题,如果我能找到某种解决方案,我一定会在这里发布。
祝你好运。答案 1 :(得分:2)
您正在使用直接渲染(通过传递窗口小部件的wid),该视频会在该几何体上绘制视频:
libvlc_media_player_set_x_window
你需要使用屏幕外渲染并将其绘制到你的qwidget。这可以通过opengl上下文(复杂)或使用libvlc中提供的回调方法来完成。
如果使用显示回调(libvlc_video_display_cb),如果需要,libvlc也会生成锁定/解锁方法。在这个方法中,libvlc会期望设置一些参数,例如画布几何和像素格式。
说,声子有一个libvlc后端可能有帮助,但可能仍然使用直接渲染取决于一些因素..