【问题标题】:Strange behaviour of Qt application on raspberry pi树莓派上 Qt 应用程序的奇怪行为
【发布时间】:2015-09-16 09:17:48
【问题描述】:

我已经为 Raspberry pi 交叉编译了 Qt,带有 QtMultimedia 和 Gstreamer1.0 支持,平台 xcb 和 eglfs

现在,如果我使用平台 eglfs 运行应用程序来播放视频,它会运行并播放视频,如果我将平台 xcb 用于应用程序,则会给出一个错误,即videosink 无法正常工作

那么如何使用 xcb 插件播放视频?

我遇到的错误是

xvimagesink xvimagesink.c:1443:gst_xvimagesink_get_xv_support:<xvimagesink1> error: Could not initialise Xv output

xvimagesink xvimagesink.c:1443:gst_xvimagesink_get_xv_support:<xvimagesink1> error: No port available

我正在开发 Raspbian Wheezy armv7

【问题讨论】:

  • 可能需要这些包 - libx11-xcb1 和 libx11-xcb-dev,同时查看 qtbase/src/plugins/platforms/xcb/README
  • 我已经安装了所有需要的包
  • 您是否尝试过为 xcb gstreamer 运行一些 Qt 示例应用程序?您可以发布运行应用程序后收到的错误消息吗?您可以尝试使用导出的变量运行您的应用程序:GST_DEBUG=3 ./your_app 这将打开 gstreamer 调试。我不知道它是否可能,但您也可以通过运行 gst-launch-1.0 videotestsrc ! autovideosink 来测试 gstreamer
  • 使用 GST_DEBUG=3 它在 Missle 的某处给出错误,指出“无法初始化 Xv 输出”没有可用的端口
  • 好的,请在问题中填写所有详细信息(复制粘贴到目前为止您发现的所有警告等)。您可以检查 xvinfo 的输出,您有 libxv1 包吗?请使用其他相关信息更新您的问题,例如 - 什么样的发行版、CPU、GPU ..

标签: qt raspberry-pi gstreamer xcb qtmultimedia


【解决方案1】:

好的,我将撰写一个答案,而不是制作大量的 cmets。

您可以尝试更改 QGstreamerVideoWidget here 的源代码,在该函数中您会看到 xvimagesink。

有趣的是,如果 xvimagesink 不工作,已经有回退到 ximagesink。我会尝试 autovideosink,它应该总是工作。

void QGstreamerVideoWidgetControl::createVideoWidget()
{
    if (m_widget)
        return;

    m_widget = new QGstreamerVideoWidget;

    m_widget->installEventFilter(this);
    m_windowId = m_widget->winId();

    /// --- CHANGED HERE (xvimagesink -> autovideosink) -----
    m_videoSink = gst_element_factory_make ("autovideosink", NULL); 
    if (m_videoSink) { /// --- maybe this if is not needed anymore ---
        // Check if the xv sink is usable
        if (gst_element_set_state(m_videoSink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) {
            gst_object_unref(GST_OBJECT(m_videoSink));
            m_videoSink = 0;
        } else {
            gst_element_set_state(m_videoSink, GST_STATE_NULL);

            g_object_set(G_OBJECT(m_videoSink), "force-aspect-ratio", 1, (const char*)NULL);
        }
    }

    if (!m_videoSink)
        m_videoSink = gst_element_factory_make ("ximagesink", NULL);

    qt_gst_object_ref_sink(GST_OBJECT (m_videoSink)); //Take ownership
}

或者它的QGstreamerVideoWindow here 再次用 autovideosink 替换 xvimagesink,也许会有所帮助。

我不确定您的代码到底使用了什么..

【讨论】:

  • 感谢您的帮助。我查看了这两个文件,它使用 xvimagesink 所以我想我必须将它更改为 autovideosink 但我必须从源代码再次构建 Qt。所以我会检查它并报告返回
  • @haresh 我会首先尝试使用 gst-launch 工具运行 gstreamer 管道,以检查它是否适用于 autovideosink .. 检查您是否有 gst-launch-1.0 二进制文件并运行 gst-launch-1.0 videotestsrc ! autovideosink 也您可以将 GST_DEBUG 设置为更高的值来检查为 autovideosink 选择了哪种元素(autovideosink 会尝试多个接收器并选择哪个有效)。在最坏的情况下,您可以使用 gstreamer 库在 C 中编写一些示例应用程序来创建提到的管道。
  • :我尝试了 ximagesink 和 autovideosink 但它不起作用,然后我尝试了 glimagesink 并且它起作用了。虽然我收到了一些与 jack 相关的警告,但它现在正在播放视频。所以我选择了这个作为问题的答案,但如果您能在此问题上提供帮助,它无法处理高清视频。无论如何,感谢您的帮助。
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 2022-12-05
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多