gpt4 book ai didi

c++ - GStreamer c++ - 在开始任何播放之前寻找

转载 作者:行者123 更新时间:2023-12-02 10:36:12 31 4
gpt4 key购买 nike

我使用 GStreamer 库向我的 C++ 应用程序添加了一个 start-offset 选项。它基本上告诉应用程序开始中间视频而不是从头开始播放。

管道是这样创建的:filesrc location="file_path"! qt解复用器! h264解析! mppvideodec !路地水槽。这是我在硬件上获得最佳结果的原因,我在 Weston (wayland) 下运行

我在管道上使用简单的 gst_element_seek 进行查找。首先,我尝试等待直到管道在总线中将状态更改为 PLAYINGPAUSED,然后再寻找一次。这行得通,但在一些较大的视频上它产生的效果是在启动应用程序后,第一个视频帧会显示一秒钟,然后视频实际上会跳到所需的位置。我不想要那个,我想直接跳到我想要的地方而不显示任何其他内容。

所以我改变了我的搜索方法,在我将管道设置为 PLAYING 状态之前发生,如下所示:

// seek if needed
if(startTime > 0) {
// First set pipeline to PAUSED and wait for async state change
gst_element_set_state(m_pipeline, GST_STATE_PAUSED);
gst_element_get_state(m_pipeline, nullptr, nullptr, GST_CLOCK_TIME_NONE);
if (!gst_element_seek (m_pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, startTime, GST_SEEK_TYPE_NONE, -1)) {
g_print ("Seek failed!\n");
}
gst_element_get_state(m_pipeline, nullptr, nullptr, GST_CLOCK_TIME_NONE); // wait for seek to finish and then set to PLAYING
}
m_ret = gst_element_set_state(m_pipeline, GST_STATE_PLAYING);
if (m_ret == GST_STATE_CHANGE_FAILURE) {
g_printerr("Unable to set the pipeline to the playing state.\n");
gst_object_unref(m_pipeline);
exit(0);
}

虽然这也有效,但不幸的是它产生了与以前完全相同的效果......即使在管道启动之前进行搜索,第一帧仍在显示。

如何确保在搜索实际完成之前不显示任何内容?

更新我无法找到任何方法来按我想要的方式工作,但我通过在构建管道之前在 GstVideoSink 上设置 show-preroll-frame 来实现效果,如下所示:

m_sink = gst_element_factory_make("waylandsink", "sink");
g_object_set(m_sink, "show-preroll-frame", FALSE, NULL); // prevent preroll frame when seeking

而且有效!如果没有更好的方法,我就暂时使用它。搜索仍在 PAUSED 状态下完成,但视频直接从搜索点显示。

最佳答案

作为 gst_element_seek_simple 的文档方法说:

Some elements allow for seeking in the READY state...

如果流水线在查找之前完全预卷,则为真。然后您可以获得您期望的结果,仅显示您期望的帧。

 gst_element_set_state(m_pipeline, GST_STATE_READY);
//make sure all the pipeline is prerolled (dynamic pads linked and other stuff)
if (!gst_element_seek (m_pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, startTime, GST_SEEK_TYPE_NONE, -1)) {
g_print ("Seek failed!\n");
}
gst_element_get_state(m_pipeline, nullptr, nullptr, GST_CLOCK_TIME_NONE);

关于c++ - GStreamer c++ - 在开始任何播放之前寻找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60183871/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com