【问题标题】:Targeting Qt child widget with gstreamer使用 gstreamer 定位 Qt 子小部件
【发布时间】:2011-04-04 03:52:51
【问题描述】:

我有一个以 xvimagesink 元素结尾的 gstreamer 管道。要在特定的窗口中显示视频,我可以使用 x_oerlay_interface :

gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(xvsink), winid);

到目前为止,一切都很好。但是,只有当 winid 是顶级窗口的想法时它才有效,而子窗口小部件不是这种情况。假设我有:

  1. 对话框小部件DialogWidget
  2. 视频小部件 VideoWidget,它是 DialogWidget 的子级。

如果我使用DialogWidget->winId(),则视频显示正确。
如果我使用“VideoWidget->winId()”,那么我会收到来自 Xv 扩展的消息,告诉我类似

X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 3 (X_GetWindowAttributes)
  Resource id:  0x40000d5
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 2 (X_ChangeWindowAttributes)
  Resource id:  0x40000d5
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 55 (X_CreateGC)
  Resource id:  0x40000d5
X Error: BadGC (invalid GC parameter) 13
  Extension:    132 (Uknown extension)
  Minor opcode: 19 (Unknown request)
  Resource id:  0x40000d5
X Error: BadGC (invalid GC parameter) 13
  Extension:    132 (Uknown extension)
  Minor opcode: 19 (Unknown request)
  Resource id:  0x40000d5

我想要一个带有控制按钮等的可调整大小的窗口,并且在这个窗口中,一个视频显示窗口或小部件或任何适合的目标

gst_x_overlay_set_xwindow_id

我该怎么做?

【问题讨论】:

    标签: qt4 gstreamer


    【解决方案1】:

    它实际上是与 QWidget 一起工作的。但是,之后需要调用QApplication::syncX 致电WinId

    /* Wrong order */
    QApplication::syncX();
    gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(xvsink), someWidget->winId());
    
    /* Right order */
    unsigned long win_id = someWidget->winId();
    QApplication::syncX();
    gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(xvsink), win_id);
    

    【讨论】: