【发布时间】: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);
两个元素,QDeclarativeView 和 QWidget
嵌入在QMainWindow,在upperLayer之前创建的lowerLayer,
upperLayer 对lowerLayer 透明。
问题:
只要 lowerLayer 显示静态元素(例如图片或一些彩色形状),一切正常,完全透明且功能齐全。
一旦我开始显示视频,例如使用 libvlc 描述的 *.ts 或使用 Phonon::VideoPlayer 的一些随机视频,upperLayer 的部分在 lowerLayer 的视频部分上方以lowerLayer(default: gray) 的颜色显示,位于lowerLayer 部分上方的upperLayer 部分或其他不包含视频元素的部分以正确的行为显示。
问题:
即使有视频播放,是否有任何可能性以及如何使上层透明?
【问题讨论】:
标签: qt video qml phonon libvlc