C /QT 5 Gstreamer继续循环

C++/Qt 5 GStreamer continues loop

本文关键字:继续 循环 Gstreamer QT      更新时间:2023-10-16

我目前正在尝试尝试播放视频循环的Gsteamer。我目前已经实现了它:

void VPlayer::playFile(QString video_filename, bool loop)
{
    m_isLooping = loop;
    QString cmdstr = "gst-launch-1.0 -v filesrc location=" + video_filename + " ! qtdemux ! queue max-size-buffers=0 max-size-time=0 ! vpudec frame-drop=0 ! queue ! imxv4l2sink device=/dev/video16";
    GError **l_error = NULL;;
    m_gst_pipeline = gst_parse_launch (cmdstr.toUtf8().data(), l_error);
    m_gst_bus = gst_pipeline_get_bus (GST_PIPELINE(m_gst_pipeline));
    gst_bus_set_sync_handler (m_gst_bus, GStreamerBusCallback, this, nullptr);
    gst_object_ref (m_gst_bus);
    gst_object_ref(m_gst_pipeline);
    gst_element_set_state (m_gst_pipeline, GST_STATE_NULL);
    gst_element_seek_simple (m_gst_pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, 0);
    gst_element_set_state (m_gst_pipeline, GST_STATE_PLAYING);
}
GstBusSyncReply VPlayer::GStreamerBusCallback(GstBus *bus, GstMessage *msg, gpointer data)
{
    VPlayer* player = (VPlayer*) data;
    GstElement *pipeline = player->getPipeline();
    switch (GST_MESSAGE_TYPE(msg))
    {
    case GST_MESSAGE_EOS:
        /* restart playback if at end */
        qDebug() << "PLAYBACK FINISHED";
        if(player->isLooping())
        {
            qDebug() << "LOOPING";
            gst_element_seek_simple (pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, 0);
            gst_element_set_state (pipeline, GST_STATE_PLAYING);
        }
        break;
    default:
        break;
    }
    return GST_BUS_PASS;
}

当我运行此示例时,我会按预期获得EOS,并且调试输出还可以,但不是寻求图像冻结,也没有发生任何事情。

也没有继续。

我在这里想念什么?

至少需要修复这一点:

GError *l_error = NULL;
m_gst_pipeline = gst_parse_launch (cmdstr.toUtf8().data(), &l_error);

我假设您在某处致电gst_init(...);