jobsccnu 2024-09-29 20:14 采纳率: 0%
浏览 14
问题最晚将于10月07日00:00点结题

QT+Gstreamer框架开发视频采集,无法将waylandsink视频绑定qt窗口

在rk3568芯片平台上,
使用QT+Gstreamer框架开发视频采集
并使用waylandsink来显示视频
一切看起来都很正常,现在唯一的核心问题是:
elements->sink_2 = gst_element_factory_make("waylandsink", "_sink_2");
GstVideoOverlay *overlay = GST_VIDEO_OVERLAY (gstobj->elements.sink_2);
gst_video_overlay_set_window_handle (overlay, (guintptr)winId());

waylandsink创建的窗口没法和我们QT窗口绑定,导致脱节,
当QT窗口移动或者隐藏/显示时,waylandsink创建的视频窗口不跟着一起变化

【说明】当前rk3568的芯片不支持x11窗口输出,
所以,ximagesink, xvimagesink, autovideosink都无法获取x窗口,
导致没法获取到其overlay,暂时只有发现waylandsink可以获取到overlay

  • 写回答

22条回答 默认 最新

  • 阿齐Archie 嵌入式领域优质创作者 2024-09-29 20:15
    关注

    以下参考免费微信小程序:皆我百晓生 作答,并由阿齐Archie整理回复,若还有疑问可评论或留言。

    在使用QT和GStreamer框架开发视频采集时,确保waylandsink与QT窗口正确绑定是一个常见的挑战。以下是一些步骤和建议,可以帮助你解决这个问题:

    1. 确保Wayland支持

      • 首先,确保你的系统支持Wayland,并且QT应用程序是使用Wayland协议运行的。你可以通过设置环境变量QT_QPA_PLATFORM=wayland来强制QT使用Wayland。
    2. 获取QT窗口的ID

      • 在QT中,你需要获取当前窗口的ID,这通常可以通过WId类型获得。确保在调用gst_video_overlay_set_window_handle之前,窗口已经被创建并且是可见的。
    3. 使用正确的窗口句柄

      • gst_video_overlay_set_window_handle函数需要一个窗口句柄。在QT中,这个句柄通常是QWidget::winId()返回的值。
    4. 同步窗口事件

      • 确保你的应用程序正确处理窗口事件,如移动、隐藏和显示。这可能需要在QT中连接信号和槽来更新GStreamer的窗口句柄。
    5. 使用GStreamer的信号

      • GStreamer提供了一些信号,可以用来在窗口状态变化时更新视频输出。例如,你可以监听window-unresponsivewindow-responsive信号。
    6. 检查线程安全

      • 确保你的GStreamer元素和QT GUI更新是在同一个线程中进行的,或者使用线程安全的方式来更新它们。
    7. 更新GStreamer和QT库

      • 确保你使用的GStreamer和QT库是最新的,因为这些问题可能已经在新版本中被修复。
    8. 检查GStreamer文档

      • 查阅GStreamer的官方文档,特别是关于waylandsink的部分,看看是否有最新的使用建议或者已知的问题。
    9. 社区支持

      • 如果你遇到了困难,可以考虑在GStreamer或者QT的社区论坛上寻求帮助。
    10. 示例代码

      • 下面是一个简单的示例代码,展示了如何在QT中获取窗口ID并将其传递给GStreamer:
      // 获取QT窗口的ID
      WId winId = yourQtWidget->winId();
      
      // 创建GStreamer元素
      gst_element_factory_make("waylandsink", "_sink_2");
      
      // 获取GStreamer视频覆盖对象
      GstVideoOverlay *overlay = GST_VIDEO_OVERLAY(gstobj->elements.sink_2);
      
      // 设置窗口句柄
      gst_video_overlay_set_window_handle(overlay, (guintptr)winId);
      
      // 确保在窗口变化时更新GStreamer元素
      connect(yourQtWidget, &QWidget::windowTitleChanged, [=](){
          // 更新窗口句柄
          gst_video_overlay_set_window_handle(overlay, (guintptr)winId);
      });
      

    请根据你的具体情况调整上述代码。如果问题仍然存在,你可能需要深入调查GStreamer和QT的内部机制,或者考虑使用其他的视频输出方式,如X11。

    评论

报告相同问题?

问题事件

  • 修改了问题 9月29日
  • 创建了问题 9月29日

悬赏问题

  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?
  • ¥15 nasm x86 变量归零
  • ¥65 Tree 树形控件实现单选功能,可以使用element也可以手写一个,实现全选为全选状态
  • ¥60 寻抓云闪付tn组成网页付款链接
  • ¥16 寻字节跳动内部人员帮推简历