gstreamer:输出窗口已关闭

时间:2016-07-15 01:40:18

标签: linux media gstreamer

当我使用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(),我检查叠加和窗口值是否有效。

你对此有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我也见过这个。有人告诉我,调用gst_x_overlay_set_window_handle()可能会导致不同的行为。

答案 1 :(得分:0)

Gstreamer 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;
  }
}