将Gstreamer与Qt连接,以便在Qt小部件中播放Gstreamer视频

将Gstreamer与Qt连接,以便在Qt小部件中播放Gstreamer视频,qt,qt4,gstreamer,Qt,Qt4,Gstreamer,我试着用声子播放视频,但没有成功。Off late通过Qt论坛了解到,即使是最新版本的Qt也不支持声子。那就是我开始使用Gstreamer的时候。关于如何将Gstreamer窗口与Qt小部件连接,有什么建议吗?我的目标是在Qt小部件上使用Gstreamer播放视频。那么如何链接Gstreamer窗口和Qt小部件呢 我通过winid()成功地获得了小部件的Id。 在Gregory Pakosz的帮助下,我在我的应用程序中添加了以下两行代码- QApplication::syncX(); gst_x

我试着用声子播放视频,但没有成功。Off late通过Qt论坛了解到,即使是最新版本的Qt也不支持声子。那就是我开始使用Gstreamer的时候。关于如何将Gstreamer窗口与Qt小部件连接,有什么建议吗?我的目标是在Qt小部件上使用Gstreamer播放视频。那么如何链接Gstreamer窗口和Qt小部件呢

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

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\u x\u overlay\u set\u xwindow\u id()在我的上下文中的用法吗?

我可以得到一些关于如何在Qt下集成gstreamer的提示吗?
请帮助我解决此问题。

将gstreamer包装到可用的C++/Qt类中的项目,包括示例代码:

我不知道直接的方法,因为我不熟悉gstreamer本身。

有一个最小的Qt示例

在您的代码中,您可能应该在将状态更改为就绪之前设置窗口ID(但我不能100%确定这是问题所在)

对于播放,您应该使用playbin2元素,类似这样的元素(完全未测试):


。。检查管道/playbin总线上的错误/statechanges/tags/eos之类的消息

我刚刚用python做了同样的事情。我所要做的是连接到总线上的“sync message::element”,并侦听在设置视频接收器后发送的名为“prepare xwindow id”的消息(忽略名称,因为它在所有平台上工作,而不仅仅是X11)。它向您发送该消息中的接收器,并在其中传递窗口id。

如果元素链接正确,上面给出的示例代码将把GStreamer视频窗口链接到QtWidget

  • filesrc应链接到解复用器
  • 解码器应链接到文件链接
  • 最后,解复用器应该在运行时链接到解码器
//将filesrc链接到解复用器
gst_元素_链接(文件资源中心、数据终端)
//将vdecoder链接到文件链接
gst\u元素\u链接\u多(vdecoder、fileLink、NULL)
/*
解复用器将动态链接到解码器。
源焊盘将在运行时创建,
当解复用器检测到流的数量和性质时。
连接将要执行的回调函数
当“添加的焊盘”发出时。
*/
g_信号_连接(分接,“添加焊盘”,g_回调(添加焊盘上),vdecoder);
//回调定义
添加了焊盘上的静态空白(GstElement*元素、GstPad*焊盘、gpointer*数据)
{
GstPad*下沉板;
GstElement*解码器=(GstElement*)数据;
GSTCAP*上限;
gst结构*str;
gchar*tex;
caps=gst\u pad\u get\u caps(pad);
str=gst\u caps\u get\u结构(caps,0);
tex=(gchar*)商品及服务税结构名称(str);
如果(g_strstrstr(tex,“视频”))
{
sinkpad=gst_元素_get_静态_pad(译码器,“接收器”);
gst_垫_链接(垫、下沉垫);
gst_object_unref(下沉板);
}
}

只是一个简短的问题,为什么不使用声子?它使用gstreamer作为后端(在linux上),并且很好地集成到Qt中。我尝试使用phonon播放视频,但没有成功。of最近通过Qt论坛了解到,即使是最新版本的Qt也不支持声子。这就是我开始使用Gstreamer的时候。关于如何将Gstreamer窗口与Qt小部件连接,有什么建议吗?这个链接已经死了,我正在寻找Qt中的rtsp流,但也没有成功。任何帮助都会很好!
GstElement *playbin, *videosink;
gchar *uri;

 playbin = gst_element_factory_make ("playbin2", "myplaybin");
 videosink = gst_element_factory_make ("xvimagesink", NULL);

 g_object_set (playbin, "video-sink", videosink, NULL);

 uri = g_filename_to_uri ("/path/to/file", NULL, NULL);
 g_object_set (playbin, "uri", uri, NULL);
 g_free (uri);

 /* NOTE: at this point your main window needs to be realized,
  * ie visible on the screen, and you might need to make sure
  * that your widget w indeed has a 'native window' (just some
  * things to check for if it doesn't work; there should be Qt
  * API for this kind of thing if needed) */
 QApplication::syncX();
 gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(videosink), w.winId());

 gst_element_set_state (playbin, GST_STATE_PLAYING);