4

私は現在、ビデオプレーヤーを開発しています。

最上位層の 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 を受信して​​います。*.tsしたがって、着信ストリームをデコードして出力をディスプレイに表示するには、libvlc が必要です。

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 埋め込まれてい ます。QMainWindowupperLayerupperLayerlowerLayer

問題:

lowerLayer が画像や色付きの図形などの静的要素を表示している限り、すべてが正常に機能し、完全な透過性と機能性を備えています。

*.tslibvlc を使用して説明したビデオや、 を使用したランダムなビデオなどのビデオの表示を開始するとすぐにPhonon::VideoPlayerupperLayerのビデオ部分の上にある の部分がlowerLayerの色で表示され、配置されているlowerLayer(default: gray)の部分upperLayerが上記のlowerLayerビデオ要素を含まない、またはその他の部分は、正しい動作で表示されます。

質問:

ビデオが再生されている場合でも、upperLayer を透明にする可能性はありますか?

4

2 に答える 2

3

あなたはまだこの問題と戦っていますか?悲しいことに、私はあなたに満足のいく答えを持っていません。私ができる最善のことは、それが機能しない理由を指摘することです。

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

上記のリンクのメッセージ#4を参照してください。

Qtを使用して、ビデオ(具体的にはPhonon :: VideoPlayer)上に透明なペイントを作成するためにさまざまな方法を試しました。これまでに見つけた唯一の方法は、オーバーレイするQWidgetをツールチップとして設定して次のようなことを行うことです。

pWidget->setWindowFlags(Qt::ToolTip)

正確に何をしたいかにもよりますが、これで十分かもしれませんが、(私の意見では)せいぜいハックです。私はこの問題に積極的に取り組んでおり、何らかの解決策を見つけることができれば、必ずここに投稿します。

幸運を祈ります。

于 2011-05-31T13:20:36.360 に答える
2

そのジオメトリでビデオをオーバートップに描画する直接レンダリング (ウィジェットの wid を渡すことによる) を使用しています。

libvlc_media_player_set_x_window

オフスクリーン レンダリングを使用して、それを qwidget に描画する必要があります。これは、opengl コンテキスト (複雑) を使用するか、libvlc で利用可能なコールバック メソッドを使用して実行できます。

表示コールバック (libvlc_video_display_cb) を使用する場合、libvlc は必要に応じてロック/ロック解除メソッドも生成します。このメソッドでは、libvlc は、キャンバス ジオメトリやピクセル形式など、いくつかのパラメータが設定されていることを期待します。

とはいえ、フォノンには libvlc バックエンドがあり、役立つかもしれませんが、いくつかの要因によっては直接レンダリングを使用する場合があります..

于 2012-04-13T02:39:22.937 に答える