通过 GStreamer 在 Qt 上显示选定的视频帧

问题描述 投票:0回答:1

我需要在 Qt 应用程序中显示选定的视频帧(例如视频的第一帧、视频的第二帧等)。帧索引通过 QT 按钮或滑块选择。

我使用此代码将 GStreamer 管道与 QtWidget 连接https://gstreamer.freedesktop.org/documentation/video/gstvideooverlay.html?gi-language=c#gstvideooverlay-and-qt,这样我就可以在应用程序中显示视频。我使用“playbin”管道。我可以通过 Qt 按钮事件开始和暂停视频。

我使用此页面中的代码https://gstreamer.freedesktop.org/documentation/application-development/advanced/queryevents.html?gi-language=c#events-seeking-and-more设置视频流时间/帧,但我只能在 GST_STATE_PLAYING 中执行此操作。我需要在 GST_STATE_PAUSED 中执行此操作。

我是 Qt 和 GStreamer 的新手,有人可以为我描述一下如何做到这一点吗?

c++ qt gstreamer
1个回答
0
投票

需要等待状态改变完成;在本例中为 GST_STATE_PAUSED。状态更改可以是异步的,这意味着状态转换可能不会在调用状态设置函数后立即完成。为了等到状态更改完成,您可以使用

gst_element_get_state
,这将允许您正确执行查找操作。

  // Run the pipeline
  GstStateChangeReturn sret = gst_element_set_state (pipeline,
      GST_STATE_PAUSED);
  if (sret == GST_STATE_CHANGE_FAILURE) {
    gst_element_set_state (pipeline, GST_STATE_NULL);
    gst_object_unref (pipeline);
    // Exit application
    QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
  }

  // Wait for the state change to complete
  GstState state;
  gst_element_get_state(pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
  if (GST_STATE_PAUSED == state) {
      g_printerr("Unable to set state to GST_STATE_PAUSED state.\n");
      gst_object_unref(pipeline);
      // Exit application
      QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
  }
© www.soinside.com 2019 - 2024. All rights reserved.