我需要在 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 的新手,有人可以为我描述一下如何做到这一点吗?
需要等待状态改变完成;在本例中为 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()));
}