当我使用gstreamer时,我遇到以下错误:
bus_call: bus_call(error) from /GstPlayBin2:player/GstPlaySink:playsink0/GstBin:vbin/GstFluVAAutoSink:fluvaautosink0/GstFluVAx11Sink:fluvax11sink0
bus_call: Error: Output window was closed
Debug details: fluvabasesink.c(874): gst_fluvabasesink_show_frame (): /GstPlayBin2:player/GstPlaySink:playsink0/GstBin:vbin/GstFluVAAutoSink:fluvaautosink0/GstFluVAx11Sink:fluvax11sink0
经过我的研究,我认为这与调用gst_x_overlay_set_xwindow_id()
有关。当我删除调用此函数时,虽然视频只是在新窗口而不是给定窗口中播放,但一切正常。
但是gst_x_overlay_set_xwindow_id()
,我检查叠加和窗口值是否有效。
你对此有什么建议吗?
答案 0 :(得分:0)
我也见过这个。有人告诉我,调用gst_x_overlay_set_window_handle()
可能会导致不同的行为。
答案 1 :(得分:0)
总线回调
void bus_cb(GstBus * bus, GstMessage * msg, gpointer user_data)
{
gchar* messageInfo;
const GstStructure *st = gst_message_get_structure(msg);
auto pPipe = (VideoPipeline*)user_data;
switch (GST_MESSAGE_TYPE(msg))
{
case GST_MESSAGE_EOS:
{
g_main_loop_quit(pPipe->mLoop);
}
break;
case GST_MESSAGE_ERROR:
{
GError *err = nullptr;
gchar *dbg = nullptr;
gst_message_parse_error(msg, &err, &dbg);
//---------------------------------------------------------
CHECK IF WINDOWS CLOSED BY MESSAGE
//---------------------------------------------------------
if (strstr(err->message, "Output window was closed"))
{
std::cout << "\r\nClosed\r\n";
g_main_loop_quit(mLoop);
return;
}
gst_object_default_error(msg->src, err, dbg);
g_clear_error(&err);
if (dbg != nullptr)
g_free(dbg);
break;
}
default:
break;
}
}