GStreamer+QT重大问题,高手进,急急急,在线等!

b0b119 2018-07-02 10:34:16
因项目需求,使用GStreamer+QT做播放器,支持硬解码播放视频,但是问题出现了,QT窗口与GStreamer库播放的视频画面没有完全结合,即视频画面没有彻底嵌入到qt窗口中!!!很明显的现象是:QT窗口最小化,视频仍然在播,无法跟随视频窗口一起隐藏后台播放!如何才能将gstreamer播放的视频跟随窗口隐藏做到后台播放,请各位知道的大佬告知小弟一二,感激不尽!
环境:gstreamer 1.10.4版本,QT 5.7.1。
gstreamer核心代码:
构造函数:
Media::Media(Lqplayer *player, int windowID)
{
GstElement* videosink;
GstElement* audiosink;

m_initialized = false;

m_frontend = player;
m_volume = 1.0;
if (false == gst_init_check(NULL, NULL, NULL)) {
return;
}
m_loop = g_main_loop_new(NULL, FALSE);
// Init length and position.
m_length = GST_CLOCK_TIME_NONE;
m_position = GST_CLOCK_TIME_NONE;
m_frontend->sliderTiming->setMinimum(0);
m_seeking = false;

m_pipeline = gst_element_factory_make("playbin", "player");
videosink = gst_element_factory_make("rkximagesink", "videosink");
audiosink = gst_element_factory_make("alsasink", "audiosink");
if (NULL == m_pipeline || NULL == videosink || NULL == audiosink) {
cerr << "One element created failed, file: " << __FILE__ << "line: " << __LINE__ << endl;
}
// Whether to embed video into current window.
m_winID = (windowID > 0) ? windowID : 0;


g_object_set(G_OBJECT(m_pipeline),
"audio-sink", audiosink,
"video-sink", videosink,
"volume", m_volume,
NULL);
gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(m_pipeline)),
bus_callback, this);

gst_element_set_state(m_pipeline, GST_STATE_READY);

// Set playing state to stopped.
m_state = STOPPED;
m_speed = 0;
m_uri = "";

m_initialized = true;
}
与QT窗口绑定接口:
if (GST_IS_X_OVERLAY(videosink)) {
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(videosink), m_winID);
}
...全文
1683 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

你好,你的问题解决了吗。能相互讨论一下吗 我邮箱1103385796@qq.com

遥_望 2019-01-04
  • 打赏
  • 举报
回复
你好,请问一下有没有QGst的库呢,我没有找到相关的资料,能发一下给我吗 969608540@qq.com,谢谢了
b0b119 2018-07-30
  • 打赏
  • 举报
回复
引用 14 楼 OExpress 的回复:
与QT窗口绑定接口:
if (GST_IS_X_OVERLAY(videosink)) {
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(videosink), m_winID);

这段代码应该放在
g_object_set(G_OBJECT(m_pipeline),
"audio-sink", audiosink,
"video-sink", videosink,
"volume", m_volume,
NULL);
gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(m_pipeline)),
bus_callback, this);

gst_element_set_state(m_pipeline, GST_STATE_READY);

这三句之前调用完成,你的调用顺序要想有问题啊


谢谢你哈,这些方法我都试过了,都不行,我用的是硬解码的插件,与上层qt应用结合不好,最后我把硬解码的库修改了,现在可以隐藏了。不过也非常谢谢你,在我最困惑的时候施以援手,非常感谢!
b0b119 2018-07-06
  • 打赏
  • 举报
回复
引用 10 楼 OExpress 的回复:
[quote=引用 9 楼 b0b119 的回复:]
[quote=引用 8 楼 OExpress 的回复:]
使用QApplication::sync();作为替代

替代之后,gstreamer的窗口自动放大,可以点击窗口右上角关闭按钮关闭gstreamer窗口,但还是不能最小化。。。[/quote]
可能最小化的事件消息没有处理,你参考下QtGstPlayer库的源码处理下,就可以了,呵呵[/quote]
你说的太对了,大神。我现在在追溯sink插件的源码了,确实是没有处理最小化事件,事件使用的是XEvent各个type的event,像ClientMessage、Expose、MoveNotify等事件,我查了半天了没找到最小化事件,你知道最小化事件是哪个么?
CyberLogix 2018-07-06
  • 打赏
  • 举报
回复
与QT窗口绑定接口:
if (GST_IS_X_OVERLAY(videosink)) {
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(videosink), m_winID);

这段代码应该放在
g_object_set(G_OBJECT(m_pipeline),
"audio-sink", audiosink,
"video-sink", videosink,
"volume", m_volume,
NULL);
gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(m_pipeline)),
bus_callback, this);

gst_element_set_state(m_pipeline, GST_STATE_READY);

这三句之前调用完成,你的调用顺序要想有问题啊
CyberLogix 2018-07-06
  • 打赏
  • 举报
回复
引用 11 楼 b0b119 的回复:
[quote=引用 10 楼 OExpress 的回复:]
[quote=引用 9 楼 b0b119 的回复:]
[quote=引用 8 楼 OExpress 的回复:]
使用QApplication::sync();作为替代

替代之后,gstreamer的窗口自动放大,可以点击窗口右上角关闭按钮关闭gstreamer窗口,但还是不能最小化。。。[/quote]
可能最小化的事件消息没有处理,你参考下QtGstPlayer库的源码处理下,就可以了,呵呵[/quote]
你说的太对了,大神。我现在在追溯sink插件的源码了,确实是没有处理最小化事件,事件使用的是XEvent各个type的event,像ClientMessage、Expose、MoveNotify等事件,我查了半天了没找到最小化事件,你知道最小化事件是哪个么?[/quote]
好几年没做Gsteamer和QT了,代码也不知道放哪里去了,有的话帮你查查,呵呵
CyberLogix 2018-07-06
  • 打赏
  • 举报
回复
建议使用playbin2来做播放的管道构建,playbin已经不建议使用
CyberLogix 2018-07-05
  • 打赏
  • 举报
回复
引用 9 楼 b0b119 的回复:
[quote=引用 8 楼 OExpress 的回复:]
使用QApplication::sync();作为替代

替代之后,gstreamer的窗口自动放大,可以点击窗口右上角关闭按钮关闭gstreamer窗口,但还是不能最小化。。。[/quote]
可能最小化的事件消息没有处理,你参考下QtGstPlayer库的源码处理下,就可以了,呵呵
b0b119 2018-07-05
  • 打赏
  • 举报
回复
引用 8 楼 OExpress 的回复:
使用QApplication::sync();作为替代

替代之后,gstreamer的窗口自动放大,可以点击窗口右上角关闭按钮关闭gstreamer窗口,但还是不能最小化。。。
CyberLogix 2018-07-04
  • 打赏
  • 举报
回复
使用QApplication::sync();作为替代
b0b119 2018-07-03
  • 打赏
  • 举报
回复
引用 4 楼 OExpress 的回复:
QApplication::syncX();
WId winId = QApplication::activeWindow()->effectiveWinId();
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(your_sink),
winId);


大佬,这个QApplication::syncX(); 函数qt5.0以后舍弃了,有没有可以替代的
b0b119 2018-07-03
  • 打赏
  • 举报
回复
引用 3 楼 OExpress 的回复:
QT和Gstreamer的结合,建议使用QtGstPlayer的封装库,不建议直接在QT里面自己调用GST API,你可以看看QT对Gstreamer封装的库的代码,看你哪里处理的不正确

好的,非常感谢,我手里有QtGstPlayer库的源码,但总是编译不过,所以才直接调用gst 的api了,感觉gst的视频画面完全没有嵌入到QT窗口中去
b0b119 2018-07-03
  • 打赏
  • 举报
回复
引用 2 楼 OExpress 的回复:
估计是哪个消息没有响应,你查看侠Toem中的代码是如何处理GTK的窗口的,一个道理

刚开始接触gstreamer,这个Toem的源码在哪儿可以找到啊
CyberLogix 2018-07-02
  • 打赏
  • 举报
回复
QApplication::syncX();
WId winId = QApplication::activeWindow()->effectiveWinId();
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(your_sink),
winId);
CyberLogix 2018-07-02
  • 打赏
  • 举报
回复
QT和Gstreamer的结合,建议使用QtGstPlayer的封装库,不建议直接在QT里面自己调用GST API,你可以看看QT对Gstreamer封装的库的代码,看你哪里处理的不正确
CyberLogix 2018-07-02
  • 打赏
  • 举报
回复
估计是哪个消息没有响应,你查看侠Toem中的代码是如何处理GTK的窗口的,一个道理
b0b119 2018-07-02
  • 打赏
  • 举报
回复
请路过的牛人支个招吧,感谢啊!

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧