Qt 应用程序在 raspberry pi 上的奇怪行为
Strange behaviour of Qt application on raspberry pi
我已经为 Raspberry pi 交叉编译了 Qt,QtMultimedia 和 Gstreamer1.0 支持平台 xcb 和 eglfs
现在,如果我 运行 一个应用程序使用平台 eglfs 播放视频,它 运行s 和视频播放,如果我为应用程序使用平台 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
好的,我会写一个答案,而不是发表大量评论。
您可以尝试更改 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,也许会有帮助。
我不确定你的代码到底使用了什么..
我已经为 Raspberry pi 交叉编译了 Qt,QtMultimedia 和 Gstreamer1.0 支持平台 xcb 和 eglfs
现在,如果我 运行 一个应用程序使用平台 eglfs 播放视频,它 运行s 和视频播放,如果我为应用程序使用平台 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
好的,我会写一个答案,而不是发表大量评论。
您可以尝试更改 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,也许会有帮助。
我不确定你的代码到底使用了什么..