C ++ / Qt 5 GStreamer продолжает цикл - PullRequest
0 голосов
/ 25 июня 2019

В настоящее время я пытаюсь поэкспериментировать с воспроизведением видео на 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, как и ожидалось, и вывод отладки в порядке, но вместо поиска изображения зависает и ничего не происходит.Кроме того, зацикливание, кажется, не продолжается.

Что я здесь пропустил?

1 Ответ

0 голосов
/ 25 июня 2019

По крайней мере, это нужно исправить:

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

и я предполагаю, что вы звоните gst_init(...); куда-нибудь.

...