qt - 将 Gstreamer 与 Qt 连接以便在 Qt Widget 中播放 gstreamer 视频

标签 qt qt4 gstreamer

I tried using phonon to play the video but could not succeed. Off-late came to know through the Qt forums that even the latest version of Qt does not support phonon. That's when I started using Gstreamer. Any suggestions as to how to connect the Gstreamer window with the Qt widget? My aim is to play a video using Gstreamer on the Qt widget. So how do I link the Gstreamer window and the Qt widget?

我通过winid()成功获取了小部件的Id。 此外,在 Gregory Pakosz 的帮助下,我在我的应用程序中添加了以下 2 行代码 -

QApplication::syncX();
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(sink), widget->winId());

但是我无法将 Qt 小部件与 gstreamer 视频窗口链接。

这就是我的示例代码:-

int main(int argc, char *argv[])
{
printf("winid=%d\n", w.winId());
    gst_init (NULL,NULL);
    /* create a new bin to hold the elements */
    bin = gst_pipeline_new ("pipeline");

      /* create a disk reader */
  filesrc = gst_element_factory_make ("filesrc", "disk_source");
  g_assert (filesrc);



  g_object_set (G_OBJECT (filesrc), "location", "PATH_TO_THE_EXECUTABLE", NULL);

  demux = gst_element_factory_make ("mpegtsdemux", "demuxer");
  if (!demux) {
    g_print ("could not find plugin \"mpegtsmux\"");
    return -1;
  }

  vdecoder = gst_element_factory_make ("mpeg2dec", "decode");
  if (!vdecoder) {
    g_print ("could not find plugin \"mpeg2dec\"");
    return -1;
  }

  videosink = gst_element_factory_make ("xvimagesink", "play_video");
  g_assert (videosink);


  /* add objects to the main pipeline */

  gst_bin_add_many (GST_BIN (bin), filesrc, demux, vdecoder, videosink, NULL);


  /* link the elements */
  gst_element_link_many (filesrc, demux, vdecoder, videosink, NULL);

    gst_element_set_state(videosink, GST_STATE_READY);

    QApplication::syncX();
    gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(videosink), w.winId());



  /* start playing */
  gst_element_set_state (bin, GST_STATE_PLAYING);

}

您能否更详细地解释一下 gst_x_overlay_set_xwindow_id() 在我的上下文中的用法?

我可以获得有关如何在 Qt 下集成 gstreamer 的任何提示吗? 请帮我解决这个问题。

最佳答案

我刚刚使用 python 做了同样的事情。我要做的就是连接到总线上的“sync-message::element”,并监听在视频接收器已设置。它会向您发送该消息内的接收器,这就是您向其传递窗口 ID 的位置。

关于qt - 将 Gstreamer 与 Qt 连接以便在 Qt Widget 中播放 gstreamer 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250169/

相关文章:

C++/QT : QTextStream program crashes

c++ - Qt 中的窗口模板(或者基本上是面向对象的 Windows)

video-streaming - gst-launch-1.0 无元素 "hlssink"错误

c - Gstreamer - 收听 RTP 流时延迟过多

c++ - 如何从 qml webgl 获取麦克风到 c++?

c++ - EnhTableWidget 字段的值更改(返回前)时发出信号

c++ - 在 QtCreator 中配置 C++ 项目的问题

c++ - 如何在我的程序中添加类似 QTCreator 的左栏?

python - 在 GUI 中隐藏 QtMainWindow 选项卡?

Python段错误,使用pyqt4