我尝试使用声子播放视频但无法成功。 Off-late通过Qt论坛了解到,即使是最新版本的Qt也不支持phonon。就在那时我开始使用 Gstreamer。关于如何将 Gstreamer 窗口与 Qt 小部件连接有什么建议吗?我的目标是在 Qt 小部件上使用 Gstreamer 播放视频。那么如何链接 Gstreamer 窗口和 Qt 小部件呢?
我成功获得了Id
小部件的通过winid()
。
此外,在 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_x_overlay_set_xwindow_id() 在我的上下文中的用法?
我可以获得有关如何在 Qt 下集成 gstreamer 的任何提示吗?
请帮我解决这个问题。